【发布时间】:2018-04-25 21:40:44
【问题描述】:
我在循环中组合 VBA 偏移函数时遇到问题。本质上,我试图根据搜索词(survey 值)从一列数据中提取多组值。我可以让它对单个术语起作用,但我希望创建一个宏来一次提取所有术语的所有值。
数据的设置是一列 (c6:c50) 原始数据 (indicators),然后是 13 列 (j6:j50, m6:m50 等) (output) 提取值应该出现。 K 列和 L 列(在最初的 13 列之间以此类推)包含基于 J 列值的公式。13 列中每一列的搜索词都位于范围正上方的单元格中(J5、M5 等)。
下面的代码是我必须要做的。目的是有一个循环,将 C 列中的值提取到 J 列(基于“i”的循环),然后是跨列偏移的第二个循环(基于“j”的循环)。
运行时会发生什么情况是单元格 J6 中的第一个单元格值被填充,然后是 J7 中的正确值。然后所有后续提取的值都会覆盖 J7 中的值。第一个词的循环完成后,它会偏移 3 列,在 J6 到 M6 中提取相同的值(可能是因为搜索词“调查”没有偏移?),然后返回覆盖单元格 J7。
任何帮助将不胜感激。
Sub indicator_charts()
Dim indicators As Range
Dim survey As String
Dim surveyrng As Range
Dim output As Range
Dim survey2 As String
Dim firstcell As Range
Set indicators = Worksheets("Indicator Summary").Range("C6:C50")
Set output = Worksheets("Indicator Summary").Range("j5:j50")
Set surveyrng = Worksheets("Indicator Summary").Range("J5")
Set firstcell = Worksheets("Indicator Summary").Range("J6")
survey = surveyrng.Value
For j = 0 To 36 Step 3
output.Offset(0, j) = output
surveyrng.Offset(0, j) = surveyrng
firstcell.Offset(0, j) = firstcell
For i = 1 To 46
If InStr(1, indicators.Cells(i, 1).Value, survey) Then
survey2 = indicators.Cells(i, 1).Value
If IsEmpty(firstcell) Then
firstcell.Value = survey2
Else
output.End(xlDown).Offset(1, 0).Value = survey2
End If
End If
Next i
Next j
End Sub
【问题讨论】:
-
不确定我是否完全理解。这条线在做什么
output.Offset(0, j) = output?您是否已通过代码查看发生了什么? -
我不知道这是否是问题所在,但在您的代码中
firstcell始终是 J6 - 对吗? -
所以使用 'output.Offset(0, j) = output' 行的想法是将所有范围转移到下一组列。因此使用初始范围会根据第一个搜索词(“调查”)提取所有值。嵌套循环的第一次运行完成后,包括“firstcell”在内的所有范围都向右偏移三列(“j”循环),并且该过程再次开始 - 这是否使其更清晰?
-
output.Offset(0, j) = output仅将后者的值分配给前者。如果您想移动范围引用本身,您需要使用 Set(如上所示),因此它将是Set output=output.Offset(0, j)。 -
好的,谢谢 - 我认为这与下面的答案类似?就像设置一个初始范围和一个在循环中使用的变体一样?