0

所以......我已经搜索了很多关于如何做到这一点,虽然我可以让它的一部分工作,我似乎无法弄清楚如何让所有的部分工作

我的初始数据如下所示,并告诉我标题列中的每个值需要多少行(例如,Value1 将有 3 行,Value2 将有一行,等等)

Title   Audit Period    Target Count
Value1    2013-Q1                  3
Value2    2013-Q1                  1
Value3    2013-Q2                  3
Value4    2013-Q3                  4
Value5    2013-Q4                  2

我想通过 VBA 获得一种单击按钮的方法,并按如下方式格式化/填充上述信息:

Title   Audit Period
Value1  2013-Q1
Value1  2013-Q1
Value1  2013-Q1
Value2  2013-Q1
Value3  2013-Q2
Value3  2013-Q2
Value3  2013-Q2
Value4  2013-Q3
Value4  2013-Q3
Value4  2013-Q3
Value4  2013-Q3
Value5  2013-Q4
Value5  2013-Q4

我不在乎转换后的数据放在哪里......代码可以覆盖起始数据或将结果放在单独的选项卡中......或其他任何东西。

感谢您提供的任何帮助。

4

1 回答 1

2

这是执行此操作的 VBA 代码 - 您只需要修改工作表名称和起始范围:

Sub MultiplyRows()
    Dim rngSource As Range, rngTarget As Range

    Set rngSource = Sheets("Sheet1").Range("A2")
    Set rngTarget = Sheets("Sheet2").Range("A2")

    While rngSource <> ""
        rngSource.Resize(, 2).Copy rngTarget.Resize(rngSource.Offset(, 2), 2)
        Set rngTarget = rngTarget.Offset(rngSource.Offset(, 2))
        Set rngSource = rngSource.Offset(1)
    Wend
End Sub

或者,您可以仅使用公式执行此操作:

在此处输入图像描述

这个想法是您使用一些帮助列来计算和检索数据。详细地说,我有 3 个辅助列,其逻辑如下:

  • “源行”,E 列:这是该目标行引用的源数据中的实际行。“列逻辑”是它与上面的行中的数字相同 - 除非在计数器上方的行中等于最大计数。因此,E5 中的公式为:=IF(F4=G4,E4+1,E4)。您还需要“初始化”列,即在我使用的 E4 中:=ROW(A3)+1
  • 最大计数:当前源行所需的行数。F4:=INDEX(C:C;E4)
  • 计数:这是计数器,当前源行已被填充的频率。逻辑是将上面的值简单地增加一 - 除非此列中的源行与最后一行不同。G4:=IF(E4<>E3,1,G3+1)

现在您只需要使用存储在 E 列中的数字作为 INDEX 函数的参数,即将此公式从 H4 向下复制到 I: 列=INDEX(A:A,E4)

现在您只需将 5 列的公式复制到所需的行数。(请记住从第 5 行开始向下复制 E 列,但在第 4 行复制 F:I 列。

于 2013-03-01T20:36:01.813 回答