Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何通过应用模块更改工作表中的代码_Excel_Vba - Fatal编程技术网

Excel 如何通过应用模块更改工作表中的代码

Excel 如何通过应用模块更改工作表中的代码,excel,vba,Excel,Vba,我做了一个模块,我想成为一个插件。我的问题是,我希望它在每次打开工作表时重新运行,并且只在我激活它的工作表上运行 我找到了一个解决方案,通过使用 Private Sub Worksheet_Activate() Call Func End sub 在工作表中,我将宏应用于。当我激活宏时,如何使其在当前激活的工作表上自动应用此代码 基本上,当我在工作表x上使用插件时,我希望它能够应用 Private Sub Worksheet_Activate() Call Func End

我做了一个模块,我想成为一个插件。我的问题是,我希望它在每次打开工作表时重新运行,并且只在我激活它的工作表上运行

我找到了一个解决方案,通过使用

Private Sub Worksheet_Activate()
     Call Func
End sub
在工作表中,我将宏应用于。当我激活宏时,如何使其在当前激活的工作表上自动应用此代码

基本上,当我在工作表x上使用插件时,我希望它能够应用

Private Sub Worksheet_Activate()
     Call Func
End sub
此功能仅适用于该特定工作表和该特定工作表

只是为了更好地澄清

我想坐在没有相关VBA代码的工作表上

激活我的加载项


并在激活工作表的上下文中运行预定义的代码块。

您需要将以下代码添加到外接程序中,重要的是将它们添加到正确的模块中(如代码中的注释所示)

外接程序的ThisWorkbook模块中的第一部分确保每次加载外接程序时(打开新的Excel应用程序时)都会初始化事件处理程序类

第二部分是一个普通的公共模块,它能够容纳全局公共对象,在我们的例子中是类clsMyEventHandler的对象。初始化时,g_mehHandler将被设置为clsMyEventHandler的新实例,其成员eapApplication将被分配给从外接程序的工作簿_Open函数接收的应用程序对象


第三部分必须作为类模块添加。它有一个用WithEvents声明的变量,这意味着任何时候发生事件(如激活新工作表),都将调用该类模块的相应函数。如果在eapApplication中触发SheetActivate事件,则将调用此类的eapApplication\u SheetActivate函数。根据函数名(对象名+下划线+事件名)选择函数。声明eapApplication(
Public with events eapApplication As Application
)后,您将能够从VBA代码上方的组合框中选择eapApplication,该组合框通常包含单词(General)。如果您在那里选择了eapApplication,您将能够从它旁边的组合框中选择要对其作出反应的事件。

事件
工作表\u Activate
在您激活该特定工作表时执行,因此它将成为活动工作表,而您的
函数将在活动工作表上执行,除非在
Func
的代码中有更改活动工作表的内容。当您在vba代码中指定
工作表
时,使用
activesheet
您可以单击工作表(右键),选择查看代码选项,并在选择此工作表时介绍要执行的代码。对你合适吗?
' ThisWorkbook

Option Explicit

Private Sub Workbook_Open()
    InitializeMyEventHandler ThisWorkbook.Application
End Sub


' modMyEventHandler

Option Explicit

Public g_mehHandler As clsMyEventHandler

Public Sub InitializeMyEventHandler(eapApplication As Application)
    Set g_mehHandler = New clsMyEventHandler
    Set g_mehHandler.eapApplication = eapApplication
End Sub


' clsMyEventHandler

Option Explicit

Public WithEvents eapApplication As Application

Private Sub eapApplication_SheetActivate(ByVal Sh As Object)
    If TypeName(Sh) = "Worksheet" Then
        Dim ewsSheet As Worksheet: Set ewsSheet = Sh
        Debug.Print "Worksheet activated. Workbook: " & ewsSheet.Parent.Name & ", Worksheet: " & ewsSheet.Name
    End If
End Sub