Vba 关闭时激活工作簿\u BeforeClose时,防止MSGBOX从单个工作表中弹出
我不熟悉VBA和Excel。我想知道,当工作簿\u BeforeClose脚本运行时,是否有其他方法可以防止关闭源和单个工作表上出现消息框?下面是工作簿_BeforeClose脚本,然后是单独的工作表msgbox,在我不希望它运行时运行。我想能够做到这一点,所以它不烦人的用户关闭。建议 附加信息:我的主“关闭”脚本中的所有内容我都希望保持不变。我只是不希望单个工作表对象在关闭时也被激活。因为我的on close脚本会锁定仪表板,因此用户必须启用宏,这样它就会遍历工作表并隐藏它们。在这个过程中,它还激活了该工作表,并显示了我不想从“单个工作表对象:”中看到的MSGBOX,我希望它在激活“工作簿关闭前”时不显示 工作簿\u关闭前:Vba 关闭时激活工作簿\u BeforeClose时,防止MSGBOX从单个工作表中弹出,vba,excel,Vba,Excel,我不熟悉VBA和Excel。我想知道,当工作簿\u BeforeClose脚本运行时,是否有其他方法可以防止关闭源和单个工作表上出现消息框?下面是工作簿_BeforeClose脚本,然后是单独的工作表msgbox,在我不希望它运行时运行。我想能够做到这一点,所以它不烦人的用户关闭。建议 附加信息:我的主“关闭”脚本中的所有内容我都希望保持不变。我只是不希望单个工作表对象在关闭时也被激活。因为我的on close脚本会锁定仪表板,因此用户必须启用宏,这样它就会遍历工作表并隐藏它们。在这个过程中,它
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
Dim sDateTime As String, sFileName As String
Sheets("START").Visible = xlSheetVisible
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "START" Then
ws.Visible = xlVeryHidden
End If
Next ws
Application.DisplayAlerts = False
If ThisWorkbook.Readonly = True Then GoTo Passed2
GoTo Passed3
Passed2:
If IsWorkbookOpen("CCC_Error_Tracker.xlsm") Then
MsgBox "Excel has detected that your `Team Error Tracker` is still open and has not been saved. The Opportunities Dashboard will now close. As a reminder, in order to save your data, you must close ProcessID: `CCC_Error_Tracker.xlsm`", vbInformation
End If
GoTo End1:
Passed3:
CodeRetry:
On Error GoTo Failed
If Me.Saved = True And BackupReqd = False Then Exit Sub
With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Replace(.Name, ".xlsm", sDateTime)
.SaveCopyAs Filename:="P:\WI\Teams\Programs\J&J CCC\Care Specialist\Alicia's Team\FPA RESULTS\Supporting_Files\FPA_FILE_BACKUPS\Opportunities_Dashboard\" & sFileName
GoTo Passed
Failed:
GoTo CodeRetry
Passed:
ThisWorkbook.Save
MsgBox "Your data has been saved and backed-up successfully! Your backup will be stored for 72 hours before discarded to save disk space. Email Blank@Blank.com if you have a suggestion."
GoTo End2
End1:
Application.Quit
End2:
End With
End Sub
好的,让我们看看这是否能让你接近。可能还有其他方法,但这里有一种方法。这只是为了演示和学习,所以我使用了一个新的工作簿,而不是您现有的代码。希望您能看到它是如何工作的,并且能够修改代码以满足您的需要 步骤1:创建一个新工作簿并添加一些工作表(我的示例有3个) 步骤2:为每个工作表向工作表添加一些代码\u激活事件。比如:
Private Sub Worksheet_Activate()
If Not ClosingEvent Then MsgBox Sheet1.Name
End Sub
修改每个工作表的工作表参考
步骤3:添加一个新模块,并在顶部放置以下内容:
Public ClosingEvent As Boolean
步骤4:在工作簿\u BeforeClose事件中,添加以下代码:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
ClosingEvent = True
For Each ws In ThisWorkbook.Worksheets
ws.Activate
Next ws
' this is here for testing, to keep the workbook from actually closing.
Cancel = True
ClosingEvent = False
End Sub
现在单击每个选项卡并查看该消息框?看看当你关闭工作簿时会发生什么,没有消息框!请随意单步执行关闭事件,这样您就可以看到每个工作表激活都会运行,但由于您将标志设置为仅在非关闭事件时运行,因此它会跳过消息框。如果您不相信我,请注释掉BeforeClose事件中的ClosingEvent=True行,然后重新运行代码
希望有帮助!如果您需要更多帮助,请发回。您是否尝试过删除这些行?我打赌这会阻止他们出现…你什么意思?也许我解释得不对。在我的主“结束”脚本中的所有内容我都希望保持不变。我只是不希望单个工作表对象在关闭时也被激活。因为我的on close脚本会锁定仪表板,因此用户必须启用宏,这样它就会遍历工作表并隐藏它们。在这个过程中,它还激活了该工作表,并显示了我不想从“单个工作表对象:”中看到的MSGBOX,我希望它在激活“工作簿关闭前”时不显示。让我知道这是否更有意义?我希望我有时间模拟一个例子,但不幸的是我没有。一种方法是使用一个名为“ClosingEvent”的公共布尔变量,该变量在结束事件开始时设置为True。然后通过在msgbox周围添加If Not ClosingEvent语句来修改工作表。这样,它将只在ClosingEvent=False时执行(这是初始化时的默认值)。如果没有人发布更好的解决方案,我会在有空的时候尝试快速模拟一些东西。我会尝试一下。我不是百分之百确定。如果你有时间,举个例子就好了。谢谢thoughOK,添加了一个示例。希望它能让你接近:)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
ClosingEvent = True
For Each ws In ThisWorkbook.Worksheets
ws.Activate
Next ws
' this is here for testing, to keep the workbook from actually closing.
Cancel = True
ClosingEvent = False
End Sub