ActiveSheet与Application.ActiveSheet

时间:2017-05-25 22:14:24

标签: excel vba excel-vba

我一直在使用以下方法在用户在前台的活动工作表上执行宏,直到永远。

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

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

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

我跑了几次并重现了这种意想不到的行为。在我对自己没有忘记之后感到满意之后,我将Set ws = ActiveSheet替换为Set ws = Application.ActiveSheet并且它的行为符合预期。返回在前台运行的工作表。

提问时间:

  1. 我做错了吗?

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

  3. 这是新内容吗?我是否需要浏览所有旧版宏并将ActiveSheet更改为Application.ActiveSheet

2 个答案:

答案 0 :(得分:1)

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

打开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和第4个返回book2

当你在Thisworkbook模块中运行代码时,前2个返回book1和下一个2(没有前缀的活动表和thisworkbook.activesheet)返回book2

答案 1 :(得分:-1)

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

ThisWorkbook.Application
ActiveWorkbook.Application

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

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