【问题标题】:Why "Activecell is Selection" is false when there is only one cell selected?当只选择一个单元格时,为什么“Activecell is Selection”是错误的?
【发布时间】:2022-01-05 16:56:57
【问题描述】:

当只选择一个单元格时,Activecell Is Selection 语句应该为 TRUE。有人能告诉我为什么它是 FALSE 吗?

【问题讨论】:

  • "语句应该是 TRUE1 为什么?Is 运算符确定两个对象引用是否引用同一个对象。也许你想要activecell.address = selection.address
  • @ cdp 是运算符确定两个对象引用是否指代相同的对象。 i>在选择单个小区ActivecellSelection @两者都参考相同目的。给出了 OP 的问题,为什么测试返回 False。
  • @uno 我无法回答为什么。鉴于该测试没有给出您期望的结果,您能否告诉我们您想要达到的目标,我们或许可以为您提供替代方案
  • @chris 试试这个debug.print cells(1,1) is cells(1,1)
  • 我猜这两个属性都返回一个Range 对象,它们共享相同的地址,但内部没有引用相同的对象。

标签: excel vba selection


【解决方案1】:

ActiveCellSelection 都返回一个 Range 对象,在这种情况下表示同一个单元格,但它们不是同一个 VBA 对象,即使它们共享相同的属性。

Sub Tester()

    Dim r1 As Range, r2 As Range
    
    Set r1 = Selection
    Set r2 = ActiveCell
    Debug.Print r1.Address, r2.Address, r1 Is r2   '> $D$11   $D$11   False
    
    'this is the same thing but assigned differently...
    Set r1 = [D11]
    Set r2 = [D11]
    Debug.Print r1.Address, r2.Address, r1 Is r2  '> $D$11   $D$11   False
    
    Set r2 = r1 'now they refer to the same [VBA] object
    Debug.Print r1.Address, r2.Address, r1 Is r2  '> $D$11   $D$11   True

End Sub

【讨论】:

    【解决方案2】:

    我认为我们必须比较完整地址: ActiveCell.Address(External:=True)=Selection.Address(External:=True)

    【讨论】:

    • 鉴于上下文(即 ActiveCell 和选择),使用完整地址与简单地使用 .Address 相比没有任何优势(如对 OP 的第一条评论所述)。所以这个答案只会混淆和/或增加测试时间。请考虑在发布之前测试您自己的假设。
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多