我在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
答案 0 :(得分:1)
因为这是一个应用程序级事件处理程序,当您关闭excel应用程序本身时,会触发所有打开的工作簿,包括任何AddIn
。
您需要测试结束工作簿是否是您要处理的工作簿
注意:当我测试它时,关闭单个工作簿只会为我调用一次事件。