Бесконечные циклы с подпрограммой VBA после сохранения - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь обеспечить безопасность своей книги, используя очень скрытый способ заставить пользователей включать макросы.

Это прекрасно работает, за исключением того, что пользователи жаловались на отсутствие диалогового окна с вопросом, хотят ли они сохранитьили нет при закрытии.

Я добавил функцию сохранения / сохранения в форме сообщения msgbox, однако это открыло конкретный случай нарушения безопасности:

А именно, если пользователь открываетфайл, включающий макросы, проходит через заставку, сохраняет рабочую книгу с помощью функции сохранения, затем закрывается без сохранения, а затем при следующем открытии рабочей книги пользователь не будет вынужден включать макросы.

IЯ пытался обойти это с помощью следующего набора кодов, который запускался во время сохранения (мне не повезло с сохранением до сохранения, потому что он снова сохранялся после выполнения кода, который побеждал смысл кода), но этот код, похоже,создать бесконечный цикл, вызванный сохранением.Я попытался поместить проверку в начале, чтобы проверить, было ли сохранено состояние, но поскольку макрос выполняется после сохранения, это всегда является истинным состоянием для макроса.

Аналогичным образом я попытался добавить проверку внизу дляпосмотрите, сохранено ли оно, и если это так, выйдите из подпрограммы, однако код никогда не заходит так далеко, потому что он снова запускается при сохранении.

У кого-нибудь есть идеи?(код ниже)

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

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Немного другая стратегия:

  1. Workbook_BeforeSave, чтобы показать лист START и скрыть все остальные, которые будут запускать
  2. Workbook_AfterSave, чтобы скрыть START и показать все остальные листы.и
  3. Workbook_Open, чтобы скрыть START и показать все остальные листы.

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim ws As Worksheet

    Application.ScreenUpdating = False 'stops flicker and improves speed
    Sheets("START").Visible = xlSheetVisible
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Start" Then
            ws.Visible = xlVeryHidden
        End If
    Next ws
    Application.ScreenUpdating = True
End Sub

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Dim ws As Worksheet

    Application.ScreenUpdating = False 'stops flicker and improves speed
    For Each ws In ThisWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next ws
    Sheets("START").Visible = xlVeryHidden
    Application.ScreenUpdating = True
End Sub

Private Sub Workbook_Open()
    Dim ws As Worksheet

    Application.ScreenUpdating = False 'stops flicker and improves speed
    For Each ws In ThisWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next ws
    Sheets("START").Visible = xlVeryHidden
    Application.ScreenUpdating = True
End Sub
0 голосов
/ 28 ноября 2018

, чтобы избежать бесконечного запуска цикла:

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