Workbook_BeforeClose跨应用程序

时间:2013-06-01 12:27:50

标签: excel excel-vba vba

我在我的插件的“Workbook_BeforeClose”中有This Workbook,当我在同一个excel实例中打开多个工作簿并尝试关闭其中的每个工作簿时,Workbook_BeforeClose无法获取要求每个这样的工作簿在实例中打开,但仅限于最终的工作簿。

是否有人要求Workbook_BeforeClose调用excel实例中的所有工作簿,我需要在每个工作簿中执行任务?

2 个答案:

答案 0 :(得分:3)

要遵循的步骤很少。

  1. 在Excel IDE / VBA环境中创建类模块。在其中一个工作簿中执行此操作,直到最后。

  2. 将班级模块名称更改为AppClass

  3. 将此代码放在AppClass module

    Public WithEvents EXL As Application
    Private Sub EXL_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        'sample msgbox
        MsgBox "You are about to close Workbook: " & Wb.Name
        'here your code
    End Sub
    
  4. 在任何标准模块中,例如Module1,插入以下代码:

    Public appEXL As New AppClass
    Sub Required_Initialization()
        'run it once or run it when this workbook is opened
        Set appEXL.EXL = Application
    End Sub
    
  5. 运行第4步中创建的子

  6. 做一些测试:a)创建新的空工作簿,然后尝试关闭它。您将获得MsgBox调用您即将关闭的工作簿的名称。

  7. 根据需要进行调整。

  8. 重要!类是VBA编程中比较困难的一部分。为了更好地理解,请尝试在网络中搜索任何其他信息。

答案 1 :(得分:0)

KazJaw的回答是一个好主意。

我有一个应用程序范围的插件使用他概述的技术,其中包含以下代码:

Private Sub xlApp_WorkbookOpen(ByVal Wb As Excel.Workbook)

    On Error GoTo NoBookOpen:
        If Application.Calculation = xlCalculationManual And LCase(Left(ActiveWorkbook.Name, 6)) <> "export" Then
            If MsgBox("Calculation is set to Manual!" & vbCrLf & _
            "It will now be put back to Automatic", vbYesNo, "CALCULATION") = vbYes Then
                  Application.Calculation = xlCalculationAutomatic
            End If
        End If
NoBookOpen:

End Sub

这个插件存在于我的所有Excel实例中,但你可以使用Kazjaw的想法,只将加载项加载到特定的Excel实例中。