VBA 循环内偏移量

VBA offset within loop

我在循环中组合 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(大概是因为搜索词 'survey' 没有偏移?),然后返回覆盖单元格 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

我稍微修改了你的代码。现在应该做你想做的事了。

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
Dim OutputVar As Variant
Dim SurveyRngVar As Variant
Dim FirstCellVar As Variant

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")

For j = 0 To 36 Step 3
Set OutputVar = output.Offset(0, j)
Set SurveyRngVar = surveyrng.Offset(0, j)
Set FirstCellVar = firstcell.Offset(0, j)
survey = SurveyRngVar.Value

    For i = 1 To 46
        If InStr(1, indicators(i, 1).Value, survey) Then
        survey2 = indicators(i, 1).Value
            If IsEmpty(FirstCellVar) Then
            FirstCellVar.Value = survey2
            Else
            OutputVar.End(xlDown).Offset(1, 0).Value = survey2
            End If
        End If
    Next i

Next j

End Sub