首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“`Range`”中遍历“`Cells`”

在“`Range`”中遍历“`Cells`”
EN

Stack Overflow用户
提问于 2014-10-01 16:46:41
回答 1查看 522关注 0票数 0

问题的简短版本

这里的代码

代码语言:javascript
复制
Dim rng As Range
Set rng = Selection
Set rng = rng.Columns(1)
For Each cl In rng
  cl.Select    ' <-- Break #2

在所选内容为A1:B37时,立即在窗口中给出此信息。

代码语言:javascript
复制
? 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处输入循环后立即窗口中的输出所示(请参见下面的代码)

代码语言:javascript
复制
? 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的立即窗口中的输出所示

代码语言:javascript
复制
? 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)?注意到,我设想重写代码以获得预期的结果。但我想知道是什么问题,并可能学到一些新的东西。这就是问题的所在。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 17:05:29

我还没有机会测试您的代码,但您可能只是因为缺乏明确性而感到痛苦:clRangeColumnRow以及Area和任何其他类型的范围类型对象都是如此。您可以使用范围迭代器,如clFor each cl in Rng.Rows...in rng.Columns,或...rng.Cells等。

换句话说,虽然您可能期望cl是一个单元格范围,但情况可能并非如此,除非您将其显式化,例如:

代码语言:javascript
复制
For each cl in rng.Cells

或者,由于您将其定义为单个列,这将是等效的:

代码语言:javascript
复制
For Each cl in rng.Rows

(从技术上讲,cl表示该rng中的行范围,但由于它是单个列范围,所以每个“行”也是单个单元格)。

您的代码实际上可以简化如下:

代码语言:javascript
复制
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 Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26146382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档