ActiveSheet与Application.ActiveSheet

我一直在使用下面的方法来执行macros,无论用户在前台有没有活动表单,因为永远。

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

直到昨天,这已经按预期执行了, ActiveSheet总是返回当前处于前台的ActiveSheet ,或者有焦点,通过View-> Macros-> Run对话框执行macros。 无论代码是从哪个Workbook执行的。

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

我跑了几次,转载了这个意外的行为。 当我满意的时候,我并没有失去理智,我换了Set ws = ActiveSheet for Set ws = Application.ActiveSheet ,它的行为和预期的一样。 在前台运行的工作表会返回。

提问时间:

  1. 难道我做错了什么?

  2. 有没有其他人经历过这个,还是能够重现这个?

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

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

 ThisWorkbook.Application ActiveWorkbook.Application 

原因是vba中的所有类都从相同的基类inheritance。

Application从该基类派生,所以基本上你引用了你正在使用的类的属性(例如ActiveWorkbook.Application.ActiveSheet

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

打开2个工作簿,并给2个工作簿中的工作表不同的名称(Book1和Book2)。
使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和4th返回book2

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