Vba 关闭时激活工作簿\u BeforeClose时,防止MSGBOX从单个工作表中弹出

Vba 关闭时激活工作簿\u BeforeClose时,防止MSGBOX从单个工作表中弹出,vba,excel,Vba,Excel,我不熟悉VBA和Excel。我想知道,当工作簿\u BeforeClose脚本运行时,是否有其他方法可以防止关闭源和单个工作表上出现消息框?下面是工作簿_BeforeClose脚本,然后是单独的工作表msgbox,在我不希望它运行时运行。我想能够做到这一点,所以它不烦人的用户关闭。建议 附加信息:我的主“关闭”脚本中的所有内容我都希望保持不变。我只是不希望单个工作表对象在关闭时也被激活。因为我的on close脚本会锁定仪表板,因此用户必须启用宏,这样它就会遍历工作表并隐藏它们。在这个过程中,它

我不熟悉VBA和Excel。我想知道,当工作簿\u BeforeClose脚本运行时,是否有其他方法可以防止关闭源和单个工作表上出现消息框?下面是工作簿_BeforeClose脚本,然后是单独的工作表msgbox,在我不希望它运行时运行。我想能够做到这一点,所以它不烦人的用户关闭。建议

附加信息:我的主“关闭”脚本中的所有内容我都希望保持不变。我只是不希望单个工作表对象在关闭时也被激活。因为我的on close脚本会锁定仪表板,因此用户必须启用宏,这样它就会遍历工作表并隐藏它们。在这个过程中,它还激活了该工作表,并显示了我不想从“单个工作表对象:”中看到的MSGBOX,我希望它在激活“工作簿关闭前”时不显示

工作簿\u关闭前:

 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