遍历`范围`中的“单元格”

时间:2014-10-01 16:46:41

标签: excel vba excel-vba

问题的简短版本

这里的代码

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

1 个答案:

答案 0 :(得分:1)

我还没有机会测试你的代码,但你可能只是缺乏明确性:clRange,所以是Column和{{{ 1}}和Row以及任何其他类型的范围类型对象。您可以使用范围迭代器,例如AreaclFor 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