VBA Excel:执行For / Each范围时的对象类型是什么?

时间:2014-08-19 17:22:59

标签: excel-vba foreach vba excel

我正在尝试循环遍历两行的列,以将数据从一个工作表添加到另一个工作表。这是前面代码中未处理的其他数据(因为前面的代码具有填充它的特定逻辑)。

我尝试创建一个子循环遍历每个页面上的当前行,但是我得到了一个byreference错误。其中一个范围是整个目标行,每次填充时都会偏移(递增)。另一个范围是源材料,并涵盖源表中的列。其他列通过偏移量访问。它在For / Each源范围内完成了大部分工作。

当我创建sub并尝试传递第二个范围(bar)时,我收到错误。我试图访问For / Each中的'bar'对象,以便两个页面都处理同一行。这似乎不起作用。

我是否需要reDim,或者找到其他方法将适当的范围传递给循环函数?

相关代码:

循环子(非常简单) -

Private Sub LoopThru38(thisRow As Range, sourceRow As Range)
    Dim counter As Integer

    For counter = 1 To 35
        thisRow.Cells(1, 8 + counter).Value = sourceRow.Cells(1, 19 + counter)
    Next counter
End Sub

我通过的地方 -

ElseIf bar.Cells(1, 19) = prevComp And bar.Cells(1, 19).Value = foo.Cells(1, 2).Value Then ' compare if prev and current comp match
    ' add other DTCs of this component
    destRange.Cells(1, 1).Value = idNumber
    destRange.Cells(1, 2).NumberFormat = "@"
    destRange.Cells(1, 2).Value = CStr(objectNumber + dotNumber - 0.01) & "-" & CStr(dashNumber)
    destRange.Cells(1, 3).Value = "3"
    destRange.Cells(1, 5).Value = bar.Cells(1, 6).Value '
    destRange.Cells(1, 6).Value = bar.Cells(1, 10) ' foo.Cells(1, 3).Value & " - " & foo.Cells(1, 4)
    destRange.Cells(1, 7).Value = bar.Cells(1, 11)
    destRange.Cells(1, 8).Value = "FMI " & bar.Cells(1, 11) & ": " & bar.Cells(1, 13)
    LoopThru38 destRange, bar ' loops through rest of 38 col to populate export sheet
    Set destRange = destRange.Offset(1, 0)
    idNumber = idNumber + 1
    dashNumber = dashNumber + 1
End If

范围的原始声明 -

With ThisWorkbook
    Set WS = .Worksheets.Add(After:=.Sheets(.Sheets.Count))
    Set Columns_38 = .Worksheets("Joe")
    Set dtcList = .Worksheets("Fred")
    Set spnList = .Worksheets("Martha")
End With
'...cont
Set srcRange = dtcList.Range(dtcList.Cells(2, "A"), dtcList.Cells(lastRowSrc, "A"))
Set destRange = WS.Range(WS.Cells(2, 1), WS.Cells(2, 42))
Set spnRange = spnList.Range(spnList.Cells(6, 1), spnList.Cells(lastRowSPN, 1))
spnRange是我似乎遇到问题的地方。它位于第二个For循环(bar)中,这是我获取输出的源数据的地方。它不想将'bar'传递给sub。我是否需要在那里通过整个范围,并弄清楚我在哪里?

由于

2 个答案:

答案 0 :(得分:2)

For Each上使用Range循环时的对象类型为Range

Sub DisplayFirstTextInRange(WithinThisRange as Range)
    Dim rng As Range

    For Each rng in WithinThisRange
        If rng.Text <> "" Then
            MsgBox rng.Text
            Exit Sub
        End If
    Next rng
End Sub

迭代遍历范围的更有用的方法可以是Row:

 Sub DisplayFirstTextInFirstColumnOfRows(WithinThisRange as Range)
    Dim rng As Range

    For Each rng in WithinThisRange.Rows
        If rng.Cells(1,1).Text <> "" Then
            MsgBox rng.Cells(1,1).Text
            Exit Sub
        End If
    Next rng
End Sub

答案 1 :(得分:2)

您需要在调用循环中将bar显式声明为Range。如果不这样做,则它不是Range对象,而是包含 Range对象的Variant。这与的工作方式相同,直到尝试将其传递给函数/子例程参数,该参数将ByRef声明为特定的对象类型,如Range。

这将引发错误,因为编译器无法判断它在运行时是否真的是Range类型。