我正在尝试循环遍历两行的列,以将数据从一个工作表添加到另一个工作表。这是前面代码中未处理的其他数据(因为前面的代码具有填充它的特定逻辑)。
我尝试创建一个子循环遍历每个页面上的当前行,但是我得到了一个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。我是否需要在那里通过整个范围,并弄清楚我在哪里?
由于
答案 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类型。