首页 > 解决方案 > 带有 aftersave 子程序的无限循环

问题描述

我正在尝试使用veryhidden 来强制用户启用宏来维护我的工作簿的安全性。

这很好用,只是用户抱怨缺少一个对话框来询问他们是否希望保存或不关闭。

我以 msgbox 的形式添加了保存/不保存功能,但是这打开了一个违反安全性的特定情况:

也就是说,如果用户打开文件,启用宏,通过启动屏幕,使用保存功能保存工作簿,然后关闭而不保存,那么下次打开工作簿时,它不会强制用户启用宏。

我试图通过设置在保存时运行的以下代码来解决这个问题(我在保存之前没有运气,因为它在代码运行后再次保存,这破坏了代码的要点)但是这段代码似乎生成由保存触发的无限循环。我尝试在开始时进行检查以检查状态是否已保存,但由于宏在保存后运行,因此对于宏而言始终是真实状态。

同样,我尝试在底部添加检查以查看其是否已保存,如果已保存,则退出子例程,但是代码永远不会走这么远,因为它会在保存时再次触发。

有人有想法么?(下面的代码)

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

If Success = True Then
    'Step 1: Define WS variable
        Dim ws As Worksheet
    'Step 2: Unhide the Starting Sheet
        Sheets("START").Visible = xlSheetVisible
    'Step 3: Start looping through all worksheets
        For Each ws In ThisWorkbook.Worksheets
    'Step 4: Check each worksheet name
        If ws.Name <> "Start" Then
    'Step 5: Hide the sheet
        ws.Visible = xlVeryHidden
        End If
    'Step 6: Loop to next worksheet
        Next ws
    'Step 7: Save the workbook
        ActiveWorkbook.Save
    'Step 8: Start looping through all worksheets
        For Each ws In ThisWorkbook.Worksheets
    'Step 9: Re-Unhide All Worksheets
        ws.Visible = xlSheetVisible
    'Step 10: Loop to next worksheet
        Next ws
    'Step 11: Re-Hide the Start Sheet
        Sheets("START").Visible = xlVeryHidden
    'Step 12: Exit loop
        If ThisWorkbook.Saved = True Then
        Exit Sub
        End If
End If
End Sub

标签: excelvbainfinite-loopafter-save

解决方案


避免无休止的触发循环:

    'Step 7: Save the workbook
        Application.EnableEvents = False
        ActiveWorkbook.Save
        Application.EnableEvents = True

推荐阅读