在Excel加载项中包含“ThisWorkbook”代码

时间:2014-07-10 17:49:40

标签: excel vba

我正在创建一个VBA Excel-Add in。我需要使用" Workbook_SheetChange"子。是否可以将此代码作为外接程序的一部分包含在内,以便使用包含用户定义函数的外接程序的所有工作簿都可以访问在工作表更改时执行的代码?

该文件正在保存为.xla加载项。但是" Workbook_SheetChange"将无法从模块工作,并且必须位于文件的ThisWorkbook代码部分。因此,目前我的加载项不会延续它。

2 个答案:

答案 0 :(得分:4)

您的加载项中需要一个自定义类模块,其中一个Application变量声明为WithEvents。我通常称我的类模块为CAppEvents。

Private WithEvents mxlApp As Application

Public Property Set App(xlApp As Application)

    Set mxlApp = xlApp

End Property

现在,在代码窗格的左上角(Ctrl + F2),你有mxlApp。选择该选项并选中右上角的下拉菜单,然后选择SheetChange。你会得到这样的存根。

Private Sub mxlApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

如果任何打开的工作簿中任何工作表上的任何单元格发生更改,则会触发此事件。您需要添加一些代码以确保它是您关注的工作表。您没有在参数中获取工作簿名称,但可以使用Sh.Parent来访问工作簿。

您需要的唯一其他事情是创建类。在标准模块中

Public gclsAppEvents As CAppEvents

Sub Auto_Open()

    Set gclsAppEvents = New CAppEvents
    Set gclsAppEvents.App = Application

End Sub

使变量公开使其在加载加载项时保持在范围内。名为Auto_Open的标准模块中的任何子项将在首次打开工作簿时运行。

答案 1 :(得分:0)

这解决了我的问题

代码添加到.xlam

dim currentworkbook as Workbook
set currentworkbook = activeworkbook

然后将所有要链接到当前工作簿的变量设置为currentworkbook。

那么它将运作良好。

不要使用thisWorkbook,因为它将把您的.xlam文件定位为thisWorkbook,而不是您真正想要运行的文件。