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
,它的行为和预期的一样。 在前台运行的工作表会返回。
提问时间:
-
难道我做错了什么?
-
有没有其他人经历过这个,还是能够重现这个?
-
这是新的,是否需要回到我所有的旧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