与“ Range(“ B:B”)'不同,我无法访问'Columns(2)'的每个单元格?'Columns(2)'是哪种范围?

时间:2018-12-25 14:08:46

标签: excel vba excel-vba

我想获得整整第二列在range(“ A1:B15”)中。 当然,我可以使用'Range(“ B1:B15”)',但是范围可能会根据不同的工作表而变化。因此,我需要动态获取第二列的范围。

我首先编写的以下代码弹出一个错误(运行时错误13:类型不匹配)。

Sub test1()
    Dim r As Range

    For Each r In Range("A1:B15").Columns(2)
        Debug.Print r     '// Runtime Error '13': Type mismatch.
    Next r

End Sub

我认为“ Columns(2)”是一种范围,可以逐个访问其每个单元格。 令我失望的是,这里的“ Range(“ A1:B15”)。Columns(2)”不是正常的一系列范围。 不过,“ Range(“ A1:B15”)。Columns(2)'的地址为:'$ B $ 1:$ B:$ 15。' 起初我听不懂。

要找出发生错误的原因,我尝试了以下代码。

Sub test2()
    Dim r As Range, TargetColumn As Range
    Set TargetColumn = Range("A1:B15").Columns(2)

    Debug.Print TargetColumn.Count  '//count is  1, not 15
    For Each r In TargetColumn
        Debug.Print r.Address       '//$B$1:$B$15
    Next r

End Sub

'TargetColumn.count'不是15,而是1。 “ r.address”仅是“ $ B $ 1:$ B $ 15。”,而不是一系列的“ $ B $ 1,$ B $ 2,$ B $ 3 ...”。 因此,“ Columns(2)”不是正常的范围系列,而只是单个范围,如range(“ $ B $ 1:$ B $ 15”)的合并单元格。

要绕过类型不匹配错误,我更改了代码,如下所示:

Sub test3()
    Dim r As Range, TargetColumn As Range

    Set TargetColumn = Range("A1:B15").Columns(2)
    ' get the range using the address : Range("A1:B15")
    For Each r In Range(TargetColumn.Address)   
        Debug.Print r.Address, r.Value          ' works well
    Next r

End Sub

“ Columns(2)”不是正常的范围系列,而是范围区域的集合。它确实有一个地址,可以在“范围(地址)”中使用。

例如,“ Columns(1).address”是“ $ A $ 1:$ A $ 15”。而“ Columns(2).address”为“ $ B $ 1:$ B $ 15”。 因此,“列”对象是每个列的集合。 就像'Union(range(“ $ A $ 1:$ A $ 15”),range(“ $ B $ 1:$ B $ 15”)))'一样。 因此,我们不能直接访问“ Columns(2)”中的每个单元格。

是否有一种更简单的方法来获取列范围,以便我可以访问列范围内的每个单元格? 我认为必须有比“ Range(Range(“ A1:B15”)。Columns(2).address)'或'Range(“ A1:B15”)。Columns(2)'更好的方法,该方法无法运行。 'Range(“ A1:B15”)。Columns(2).EntireRow'返回整个“ B:B”的范围,我不希望使用。

3 个答案:

答案 0 :(得分:1)

添加单元格:列(2)。单元格

Sub test2()
    Dim r As Range, TargetColumn As Range
    Set TargetColumn = Range("A1:B15").Columns(2).Cells

    Debug.Print TargetColumn.Count  '//count is  1, not 15
    For Each r In TargetColumn
        Debug.Print r.Address       '//$B$1:$B$15
    Next r

End Sub

调试结果

enter image description here

答案 1 :(得分:1)

我不确定你想要什么,但也许那就是你追求的东西

Sub test11()
    Dim r As Range

    For Each r In Range("A1:B15").Columns(2).Rows
        Debug.Print r    
    Next r

End Sub

这将循环遍历第2列的单个单元格,并且不会遇到运行时错误,因为该行debug.print r将采用单个单元格的默认项,即value,尽管r仍然是一个范围。

答案 2 :(得分:0)

也许使用“调整大小和偏移”会有所帮助:

Sub test1()
    Dim r As Range

    For Each r In Range("A1:B15").Resize(Range("A1:B15").Rows.Count, 1).Offset(0, 1)
        Debug.Print r.Address
    Next r

End Sub