【问题标题】:How does object focus work in VBA?对象焦点如何在 VBA 中工作?
【发布时间】:2014-10-15 17:41:08
【问题描述】:

Worksheet 和 Workbook 对象可以通过两种方式访问​​其属性。

  1. 明确 ➔ Sheet1.cells(1,2)
  2. 隐式 ➔ Cells(1,2)

我很好奇的是,当隐式调用属性时,VBA 如何知道要使用哪个对象?是否还有更多对象与这些隐式调用兼容?

这是我进行的一个简单实验,它显示了对象焦点发生变化和不发生变化的一些情况:

'Sheet1 has 2 row in column A
'Sheet2 has 5 rows in column A
Sub test()
    Dim obj As Object
    Set obj = Sheet1

    'focus is set when a sheet is called directly
    row1 = Sheet2.Range("A" & Rows.Count).End(xlUp).Row

    'focus is set when a sheet is called through reference
    row2 = obj.Range("A" & Rows.Count).End(xlUp).Row

    'focus is not set by with
    With Sheet2
        row3 = Range("A" & Rows.Count).End(xlUp).Row
    End With

    'output = 5 : 2 : 2
    MsgBox row1 & " : " & row2 & " : " & row3
End Sub

【问题讨论】:

  • 您的 With 使用不正确 - 应该是 .Range("A" & .Rows.Count).End(xlUp).Row - 请注意前导句点
  • 谢谢,但这实际上是故意的。我试图查看是否可以通过 with 语句本身将焦点切换到 sheet2。
  • 那么这就解释了为什么它什么也没做;-)

标签: vba excel


【解决方案1】:

所有 Excel 对象引用的工作方式如下:
Workbook -> Worksheet -> Range

如果您遗漏了前一个节点,Excel 将用“活动”对象替换被遗漏的节点。示例:
Sheet1.Cells(1,1)ThisWorkbook.Sheets("Sheet1").Cells(1,1) 相同
Cells(1,1)ActiveWorksheet.Cells(1,1) 相同

【讨论】:

  • Sheet1.Cells(1,1)not the same 作为 ActiveWorkbook.Sheets("Sheet1").Cells(1,1)。与ThisWorkbook.Sheet1.Cells(1,1) 相同。与Sheets("Sheet1").Cells(1,1) 不同,后者ActiveWorkbook.Sheets("Sheet1").Cells(1,1) 相同。
  • 我刚刚做了一个测试,似乎“ActiveSheet”总是设置为正在显示的工作表,即使你只是在vba代码中调用了另一个工作表
  • @Alter,调用工作表不会使其处于活动状态。工作表必须被激活/选择为“活动”
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多