.Range(.Cells ... 与 .Range( Cells... 与“Microsoft Learn”页面

问题描述 投票:0回答:1

当然,我的问题的本质以前已经提出过。我的问题的新内容可能是它指的是我希望是一个错误在此 Microsoft.Learn 页面上,以及可能是我的愚蠢/深刻的问题。 (问题并不深奥,答案可能很深奥。)

实际上,我在下面的代码上花了很多时间,以至于我确定上面链接的示例是不正确的。只是“非常轻微”的哎呀。 (点?没有点?)

但我不太确定为什么它是错误的和/或如何解释

.Range(Cells
.Range(.Cells
在其上下文中的“点与无点”外观。

具体来说,

.Cells
中的点实际上是做什么或指代什么的?如果答案很简单,“它们会导致偏移”,好吧,但是除了执行代码并看到效果之外,这是如何发生的?

Cells
之前没有点有什么作用?再说一次,“结果是相对引用”不是我所追求的。但也许这两个答案就是这样,所以继续吧。

也许我还没有掌握

.Range(Cells
.Range(.Cells
的细微差别。或者也许只是
Cells
vs
.Cells

.Cells
With
和范围(“B2:Z100)”到底有什么关系?

我添加到示例中并添加了我希望有意义的注释:(请参阅 P.S.)

    Sub cat()
      
          With Worksheets("Sheet1").Range("B2:E20")
'   Microsoft's code ...                                           
            .Range(.Cells(1, 1), .Cells(5, 3)).Font.Bold = True
            .Range(.Cells(1, 1), .Cells(5, 3)).Select
            MsgBox Selection.Address '             affects C3:E7 (not B2:D6)
    
'  My code ...     
            .Range(Cells(1, 1), Cells(5, 3)).Font.Color = vbRed
            .Range(Cells(1, 1), Cells(5, 3)).Select
            MsgBox Selection.Address '                      DOES affect B2:D6
            
          End With
        End Sub

P.S.我刚刚查看了我提供的链接中的最后两个示例。我认为这可能对我在纸上跟踪这两块代码的执行情况有很大帮助,看看我是否可以获得相同的输出。这不是“简单”的

Cells
.Cells
交易,而是对上述所有内容的深入研究,再加上
Item
的有趣体验,我以为我知道它的含义和用法,但现在我知道了不确定,在所提供的上下文中。

解释(不需要阅读(!),但寻求改进)

With
...

之下

.Range(.Cells
不涉及相对引用,因为
Cells
之前有点。

相反,Cells 的参数看起来像是 B2 的 OFFSET。如果他们是...

.Range(.Cells(1,1))
表示将
Offset(1,1)
应用于 B2,从而给出 C3 和

.Range(.Cells(5,3))
表示将
Offset(5,3)
应用于 B2,得到 E7。

所以单元格 C3:E7 将是粗体

再往下...

第二个

.Range(Cells
确实包含对 B2 的相对引用。

所以

Cells(1,1)
代表相对于B2的第1行第1列,即B2。

Cells(5,3)
代表相对于B2的第5行第3列,即D6。

所以 B2:D6 将是红色

excel vba range cell offset
1个回答
0
投票

你是对的。这个例子是错误的。但你的结论(偏移)也不正确。

罪魁祸首是 Range.Range 属性 (Excel),其中属性

cell1
cell2
是“范围的 name”。而不是每个
Cell
对象。而且,如果没有命名,单元格的名称就是它的地址。

以下示例应该显示问题:

Sub test()

 With ActiveSheet.Range("C3:Z100")
  Set o = .Cells(1, 1)
  MsgBox o.Address '$C$3
  Set o = .Range(.Cells(1, 1), .Cells(1, 1)) 'is .Range("C3:C3") - third row, third column in parent range
  MsgBox o.Address '$E$5
  
  Set o = Cells(1, 1) 'is Activesheet.Cells(1, 1)
  MsgBox o.Address '$A$1
  Set o = .Range(Cells(1, 1), Cells(1, 1)) 'is .Range("A1:A1") - first row, first column in parent range
  MsgBox o.Address '$C$3
  
 End With
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.