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
我在循环中组合 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