【问题标题】:ActiveSheet vs Application.ActiveSheetActiveSheet 与 Application.ActiveSheet
【发布时间】:2017-05-26 16:33:33
【问题描述】:

一直以来,我一直在使用以下方法在用户在前台拥有的任何活动工作表上执行宏。

 Public Sub MySub()
     Dim ws as Worksheet
     Set ws = ActiveSheet
     'Execute some code
     Debug.Print ws.Name
 End Sub

直到昨天,这已按预期执行,ActiveSheet 始终返回当前位于前台或具有焦点的ActiveSheet,通过视图->宏->运行对话框执行宏。不管代码是从哪个Workbook 执行的。

由于某种原因,最近我遇到了一个问题,即 ActiveSheet 返回执行代码的 Workbook 中的最后一个 ActiveSheet,无论我是否打开了另一本书并且它有焦点。

我运行了几次并重现了这种意外行为。在我对自己没有失去理智感到满意后,我将Set ws = ActiveSheet 换成了Set ws = Application.ActiveSheet,它的行为与预期一样。返回在前台运行的工作表。

提问时间:

  1. 我做错了吗?

  2. 有其他人经历过这种情况或能够重现这种情况吗?

  3. 这是新的吗,我是否需要返回所有旧宏并将ActiveSheet 更改为Application.ActiveSheet

【问题讨论】:

  • 你需要说activeworkbook.activesheet
  • ActiveSheet 等价于Application.ActiveSheet 除非您在代码模块ThisWorkbook 中运行一些代码,这意味着ThisWorkbook.ActiveSheet。您是否正在运行位于 ThisWorkbook 的宏?
  • 你是对的。 ActiveWorkbook.ActiveSheetApplication.ActiveSheet 本质上是同义词。但是为什么ActiveSheet,(本身)是Application 对象的一部分,需要ActiveWorkbook.Application. 前缀?我已经让它多次正确运行,没有前缀。
  • @A.S.H.是的,代码在ThisWorkBook,这就解释了!谢谢。现在我可以恢复我的理智,或者它剩下的东西。呵呵。

标签: vba excel


【解决方案1】:

除非您运行 2 个 Excel 实例,否则只有一个 Application 对象实例。
Activesheet 始终返回相同的工作表,除非您在 ThisWorkbook 模块中调用它,此时它默认为 Thiswokbook.activesheet 而不是 Application.Activesheet。

打开 2 个工作簿并为 2 个工作簿中的工作表指定不同的名称(书 1 和书 2)。
激活 Book1 工作表
然后将此代码添加到 Book2 中的普通模块和书 2 中的 Thisworkbook 模块中。

Sub activename()
MsgBox Application.ActiveSheet.Name
MsgBox ThisWorkbook.Application.ActiveSheet.Name
MsgBox ActiveSheet.Name
MsgBox ThisWorkbook.ActiveSheet.Name
End Sub

在普通模块中运行代码时,前 3 个 msgbox 返回 Book1,第 4 个返回 book2

当您在 Thisworkbook 模块中运行代码时,前 2 个返回 book1,下一个 2(不带前缀的 Activesheet 和 thisworkbook.activesheet)返回 book2

【讨论】:

    【解决方案2】:

    vba 中的每个类都有一个Application 的属性。
    例如:

    ThisWorkbook.Application
    ActiveWorkbook.Application
    

    原因是vba中的所有类都继承自同一个基类。

    Application 派生自该基类,因此基本上您引用的是您正在使用的类的属性(例如 ActiveWorkbook.Application.ActiveSheet

    【讨论】:

    • 彻底回答!谢谢你的时间。我想说这不是我使用哪个类的问题,而是使用它的 context 问题。正如您所解释的,上下文驱动了 ActiveSheet 的实际派生源。分裂的头发,但我只是在为自己辩护,让自己感觉更好。哈哈。
    • @Adam Vincent 欢迎您。如果您觉得有帮助,请将其标记为答案。
    • ActiveWorkbook.Application.ActiveSheet <> ThisWorkbook.Application.ActiveSheet 你是说ThisWorkbook.ApplicationActiveWorkbook.Application返回的Applicationobject不一样?我认为这是错误且具有误导性的。
    • 在只有一个 Excel 实例运行的 99.9% 的情况下,这个答案极具误导性和不正确 - 在这种情况下,只有一个应用程序对象,因此只有一个 application.activesheet。跨度>
    • 我的意图是解释 application 是所有类都从其基类获得的属性。(stackoverflow.com/questions/23272782/…)也许我在答案的末尾没有正确表达它,它使一些混乱。这部分已从原始答案中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多