在一个变量变量中循环两个范围

时间:2018-01-30 17:19:19

标签: excel vba excel-vba

在一个变量变量中循环两个范围。

我试图使用一个变体同时读取两个范围。我有两个范围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

2 个答案:

答案 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