【问题标题】:VBA offset within loop循环内的 VBA 偏移
【发布时间】: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)
  • 好的,谢谢 - 我认为这与下面的答案类似?就像设置一个初始范围和一个在循环中使用的变体一样?

标签: vba excel loops offset


【解决方案1】:

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

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

【讨论】:

  • 如果您能解释您所做的更改以及更改的原因,将会很有帮助。
  • 感谢@horst,这似乎奏效了。如果我理解正确,您采用了初始范围并创建了类似的变体,然后在循环中使用?
猜你喜欢
  • 2021-05-18
  • 2015-07-14
  • 2012-01-07
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2015-03-24
相关资源
最近更新 更多