Excel WorkbookBeforeClose事件多次触发

时间:2013-11-17 16:31:03

标签: excel excel-vba vba

我在excel vba中编写了以下代码来控制任何excel工作簿的On_Close事件。我已将代码编写为Excel加载项,因此会为所有打开的Excel工作簿加载。

在关闭事件(而非关闭之前)上查找插件的目标,如果工作簿保存在某个路径中,那么它应该通过一些自定义提示提醒用户,否则什么都不做。

问题在于,虽然事件正常触发,但它会多次触发(主要是3次),但我无法找到可能的原因。我在Word VBA中翻译了相同的代码,似乎在那里运行良好。

  • 我有一个标准模块:"savefromtemp"

Option Explicit

Dim oAppClass As New ThisApplication

Sub Auto_Open()
    Set oAppClass.oApp = Application
End Sub
  • 我有一个课程模块:ThisApplication

Option Explicit

Public WithEvents oApp As Application    

Private Sub oApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    MsgBox "abt to close"
    Dim iRet As Integer
    Dim sFolderName As String, fDialog As FileDialog, ret As Long

    'Debug.Print ActiveWorkbook.FullName

    If InStr(1, ActiveWorkbook.FullName, "C:\Users\" & Environ("username") & "\SDocuments\") Then
        iRet = MsgBox("Blah Blah Blah. Do you want to save this file to different location?", vbOKCancel, "Alert")

        If iRet = vbOK Then

            Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
            ret = fDialog.Show

            If ret <> 0 Then
               sFolderName = fDialog.SelectedItems(1)
               'MsgBox sFolderName
               If sFolderName = "" Then
                    MsgBox "Failed to save. Please check!"
               End If
    '        Else
    '            MsgBox "User pressed cancel"
            End If
            Set fDialog = Nothing

        ElseIf iRet = vbCancel Then

        End If

    End If
End Sub

1 个答案:

答案 0 :(得分:1)

因为这是一个应用程序级事件处理程序,当您关闭excel应用程序本身时,会触发所有打开的工作簿,包括任何AddIn

您需要测试结束工作簿是否是您要处理的工作簿

注意:当我测试它时,关闭单个工作簿只会为我调用一次事件。