在一个变量变量中循环两个范围。
我试图使用一个变体同时读取两个范围。我有两个范围A和B,我正在组合它们。合并这两个范围后,我正在使用一个变体来阅读它。我的变量变量只读取A列而忽略B列。任何建议我做错了。
Dim rngText as Range, rngText2 as Range, results as Range, dText
Set rngText = wSheet3.Range(wSheet3.Range("A1"), wSheet3.Cells(Rows.Count, 1).End(xlUp))
Set rngText2 = wSheet3.Range(wSheet3.Range("B1"), wSheet3.Cells(Rows.Count, 2).End(xlUp))
Set results = Union(rngText, rngText2)
dText = results.Value
For i = 1 to Ubound(dText,1)
'other condition here....
Next i
答案 0 :(得分:1)
For i = 1 to Ubound(dText,1)
此循环迭代dText
的第一个维度,该维度被声明为隐式Variant
。
dText = results.Value
这为Variant
分配了一个表示Union
操作结果的2D数组。除非Range
表示单个单元格,否则Range.Value
始终返回2D数组。
您需要一个嵌套循环来迭代2D数组的两个维度。
Dim currentRow As Long
For currentRow = 1 To UBound(dText, 1)
Dim currentCol As Long
For currentCol = 1 To UBound(dText, 2)
' do stuff
Next
Next
根据您要实现的目标,最好只迭代行,并让循环体的逻辑获取列索引:
Dim currentRow As Long
For currentRow = 1 To UBound(dText, 1)
Debug.Print "Column A: " & dText(currentRow, 1), "Column B: " & dText(currentRow, 2)
Next
请注意,2D数组包含Variant
值,表示单元格中保存的任何值/类型:如果单元格包含数字,则数组索引将指向某个Variant/Double
;如果单元格包含字符串,则数组索引将指向某个Variant/String
;如果单元格包含错误,则数组索引将指向某个Variant/Error
- 并且最后一点非常重要:您需要在假定其类型之前验证单元格值是否包含错误带有它的任何东西(例如上面的字符串连接将失败,运行时错误13 /“类型不匹配”在任一列中给出Variant/Error
值,因为String
无法与之比较[隐式或显式]转换为Error
)。这会更安全:
Dim currentRow As Long
For currentRow = 1 To UBound(dText, 1)
If Not IsError(dText(currentRow, 1) And Not IsError(dText(currentRow, 2)) Then
Debug.Print "Column A: " & dText(currentRow, 1), "Column B: " & dText(currentRow, 2)
End If
Next
答案 1 :(得分:0)
我最终定义了另一个循环。就是我这样做的方式,在我试图在一个循环中完成它之前却没有用。
Set rngText = wSheet3.Range(wSheet3.Range("A1"), wSheet3.Cells(Rows.Count, 1).End(xlUp))
Set rngText2 = wSheet3.Range(wSheet3.Range("B1"), wSheet3.Cells(Rows.Count, 2).End(xlUp))
dText = rngText.Value
dText2= rngText2.Value
For i = 1 to Ubound(dText,1)
'do stuff
Next i
'second loop
For ii = 1 to Ubound(dText2,1)
'do stuff
Next ii