我一直在使用以下方法在用户在前台的活动工作表上执行宏,直到永远。
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
并且它的行为符合预期。返回在前台运行的工作表。
提问时间:
我做错了吗?
有没有其他人经历过这个,或者能够重现这个?
这是新内容吗?我是否需要浏览所有旧版宏并将ActiveSheet
更改为Application.ActiveSheet
?
答案 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
)