问题的简短版本
这里的代码
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上工作。这里的相关代码如下。它的分支取决于rng列的数量rng。
当ncols=1时,它循环遍历rng中的每个单元格cl,选择cl并执行一些操作。当起始选择为A1:A37时,工作正常,如在中断#1处输入循环后立即窗口中的输出所示(请参见下面的代码)
? rng.address(External:=True)
[Book2]Sheet1!$A$1:$A$37
? cl.Address(External:=True)
[Book2]Sheet1!$A$1当使用ncols<>1时,我希望循环遍历rng第一列中的每个单元格cl,与以前一样。现在,当开始选择是A1:B37时,这是不起作用的,就像断续#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 (如坏消息#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发布于 2014-10-01 17:05:29
我还没有机会测试您的代码,但您可能只是因为缺乏明确性而感到痛苦:cl是Range,Column和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表示该rng中的行范围,但由于它是单个列范围,所以每个“行”也是单个单元格)。
您的代码实际上可以简化如下:
Sub f()
Dim rng As Range
Dim cl As Range
Dim rng2 As Range
Set rng = Range(Selection.Address).Resize(, 1)
ncols = Range(Selection.Address).Columns.Count
For Each cl In rng.Cells
cl.Select ' <-- Break #2
If nCols > 1 Then
Set rng2 = Range(cl, cl.Offset(0, ncols - 1))
rng2.Select
'...
End If
Next cl
End Subhttps://stackoverflow.com/questions/26146382
复制相似问题