我想获得整整第二列在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”的范围,我不希望使用。
答案 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
调试结果
答案 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