VBA Excel:对一个范围的每一个范围进行分析时,对象类型是什么?

VBA Excel:对一个范围的每一个范围进行分析时,对象类型是什么?,excel,foreach,vba,Excel,Foreach,Vba,我正在尝试通过两行的列进行循环,以将数据从一个工作表添加到另一个工作表。这是以前的代码中没有处理的附加数据(因为以前的代码有特定的逻辑来填充它) 我试着创建一个子循环遍历每个页面上的当前行,但是我得到了一个byreference错误。其中一个范围是整个目标行,它在每次填充时都会偏移(递增)。另一个范围是源材质,覆盖源工作表中的一列。其他列通过偏移量访问。我的大部分工作都是在For/每个源范围内进行的 当我创建子对象并尝试通过第二个范围(条)时,我得到了错误。我试图访问For/Each中的“bar

我正在尝试通过两行的列进行循环,以将数据从一个工作表添加到另一个工作表。这是以前的代码中没有处理的附加数据(因为以前的代码有特定的逻辑来填充它)

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

当我创建子对象并尝试通过第二个范围(条)时,我得到了错误。我试图访问For/Each中的“bar”对象,以便两个页面都处理同一行。这似乎不起作用

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

相关代码:

循环接头(非常简单)——

我从哪里经过-

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中。我是否需要通过整个范围,并找出我在哪里


谢谢

范围
上为每个循环使用
时,对象类型是
范围

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
子显示第一个文本范围(将此范围作为范围)
变暗rng As范围
对于该范围内的每个rng
如果为rng.Text“”,则
MsgBox rng.Text
出口接头
如果结束
下一个rng
端接头
一种更有用的遍历范围的方法可能是按行:

 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
子显示RSTColumnofRows中的第一个文本(将此范围作为范围)
变暗rng As范围
对于此范围内的每个rng。行
如果rng.Cells(1,1).Text“”则
MsgBox rng.Cells(1,1).Text
出口接头
如果结束
下一个rng
端接头

范围上的每个
循环使用
时,对象类型为
范围

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
子显示第一个文本范围(将此范围作为范围)
变暗rng As范围
对于该范围内的每个rng
如果为rng.Text“”,则
MsgBox rng.Text
出口接头
如果结束
下一个rng
端接头
一种更有用的遍历范围的方法可能是按行:

 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
子显示RSTColumnofRows中的第一个文本(将此范围作为范围)
变暗rng As范围
对于此范围内的每个rng。行
如果rng.Cells(1,1).Text“”则
MsgBox rng.Cells(1,1).Text
出口接头
如果结束
下一个rng
端接头

您需要在调用循环中将
bar
明确声明为一个范围。如果没有,则它不是范围对象,而是包含范围对象的变体。在您尝试将其传递给一个函数/子例程参数(该参数被ByRef声明为特定的对象类型,如Range)之前,情况也是如此


这将抛出一个错误,因为编译器在运行时无法判断它是否真的是一个范围类型。

您需要在调用循环中将
bar
显式声明为一个范围。如果没有,则它不是范围对象,而是包含范围对象的变体。在您尝试将其传递给一个函数/子例程参数(该参数被ByRef声明为特定的对象类型,如Range)之前,情况也是如此


这将抛出一个错误,因为编译器无法判断它在运行时是否真的是一个范围类型。

我在代码中的任何地方都没有看到每个
?@rbaryyoung我遗漏了该部分。IF嵌套在里面,我必须编辑代码以防止将任何机密信息放入其中。如果有必要,我会这样做,但我想知道“bar”是通过sourceRange循环的一个元素就足够了。如果需要更多的代码,我也可以这样做。如果您认为For/Each可能有问题,那么是的,您应该向我们展示它。还有,具体哪一行抛出了错误?你是说它是上面最后一个(
Set spnRange..
)?@RBarryYoung它在调用LoopThru28 sub时抛出错误。因为它声明“bar”应该是一个范围,我想我需要知道为什么会出现byreference错误。我在你的代码中没有看到每个
都有一个
。IF嵌套在里面,我必须编辑代码以防止将任何机密信息放入其中。如果有必要,我会这样做,但我想知道“bar”是通过sourceRange循环的一个元素就足够了。如果需要更多的代码,我也可以这样做。如果您认为For/Each可能有问题,那么是的,您应该向我们展示它。还有,具体哪一行抛出了错误?你是说它是上面的最后一个(
Set spnRange..
)?@rbaryYoung它在调用LoopThru28 sub时抛出了错误。因为它声明“bar”应该是一个范围,我想我需要知道为什么会出现byreference错误。这正是我需要的。这也有道理。谢谢。这正是我需要的。这也有道理。谢谢