问题的简短版本:
这里的代码
Dim rng As Range
Set rng = Selection
Set rng = rng.Columns(1)
For Each cl In rng
cl.Select ' <-- Break #2
当选择为A1:B37
时,在即时窗口中显示此信息
? rng.address(External:=True)
[Book2]Sheet1!$A$1:$A$37
? cl.Address(External:=True)
[Book2]Sheet1!$A$1:$A$37
任何人都可以帮助我理解为什么cl -> A1:A37
代替cl -> A1
?
请注意,我想重写代码以获得预期的结果。但我想知道问题是什么,并且可能会学到新的东西。这就是问题所在。
问题的长版本(最初发布):
我有一个子程序,它适用于选定的(矩形)范围rng
。此处的相关代码如下所示。它会根据ncols
列的rng
个数进行分支。
ncols=1
时,它会遍历cl
中的每个单元格rng
,选择cl
并执行某些操作。
当起始选择为A1:A37
时,这可以正常工作,如在 Break#1 进入循环后立即显示在即时窗口中的输出所示(参见下面的代码)
? rng.address(External:=True)
[Book2]Sheet1!$A$1:$A$37
? cl.Address(External:=True)
[Book2]Sheet1!$A$1
当ncols<>1
时,我想循环遍历 cl
的第一列中的每个单元rng
,并执行与之前相同的操作。
现在,当起始选择为A1:B37
时,这不起作用,如 Break#2
? rng.address(External:=True)
[Book2]Sheet1!$A$1:$A$37
? cl.Address(External:=True)
[Book2]Sheet1!$A$1:$A$37
任何人都可以帮助我理解为什么cl -> A1:A37
代替cl -> A1
(如 Break#1 )?
请注意,我想重写代码以获得预期的结果。但我想知道问题是什么,并且可能会学到新的东西。这就是问题所在。
Dim rng As Range
Set rng = Selection
Dim ncols As Long
ncols = rng.Columns.Count
Dim cl As Range
' 1- If only one column is selected, ...
If (ncols = 1) Then
For Each cl In rng
cl.Select ' <-- Break #1
...
Next cl
' 2- If more than one column is selected, ...
Else
Set rng = rng.Columns(1)
For Each cl In rng
cl.Select ' <-- Break #2
Dim rng2 As Range
Set rng2 = Range(cl, cl.Offset(0, ncols - 1))
rng2.Select
...
Next cl
End If
答案 0 :(得分:1)
我还没有机会测试你的代码,但你可能只是缺乏明确性:cl
是Range
,所以是Column
和{{{ 1}}和Row
以及任何其他类型的范围类型对象。您可以使用范围迭代器,例如Area
:cl
或For each cl in Rng.Rows
,或...in rng.Columns
等。
换句话说,虽然您可能希望...rng.Cells
成为单元格范围,但除非您明确说明,否则情况可能并非如此:
cl
或者,既然您将其定义为单列,那么这将是等效的:
For each cl in rng.Cells
(从技术上讲,For Each cl in rng.Rows
代表cl
中的行范围,但由于它是单列范围,每个&#34;行&#34;也是一个单细胞。)
您的代码可以非常精简:
rng