Событие workbook_beforesave не запускается

У меня есть код VBA, который вынудил диалоговое окно сохранить как, чтобы при сохранении xltm показывать сохранение по умолчанию как тип как xlsm. Пожалуйста, проверьте прилагаемый код и исправьте меня, если код неправильный

Application.EnableEvents = False 
Application.DisplayAlerts = False 
If SaveAsUI = True Then 
    bInProcess = True 
'The following statements shows the save as dialog box with default path
    Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs)
    FileSaveName.InitialFileName = ThisWorkbook.Name
    FileSaveName.FilterIndex = 2   'select to save with a ".xlsm" extension
    FileSaveName.Title = "Save As"
    intchoice = FileSaveName.Show
    If intchoice = 0 Then
    Else
        FileSaveName.Execute
    End If
Else 'Normal Save 
    bInProcess = True 
    Cancel = True
    ThisWorkbook.Save 
End If
Application.EnableEvents = True
Application.DisplayAlerts = True

Приведенный выше код прекрасно работает при попытке сохранить с помощью (Ctrl + S). Если бы я попытался закрыть через Excel закрыть окно. Excel показывает всплывающее окно сохранения по умолчанию. Если я выберу опцию "Сохранить" во всплывающем окне "Сохранить как", событие workbook_beforesave не вызывается (отображается диалоговое окно "Сохранить как" с типом данных по умолчанию, измененным на xls с xlsm). Я не знаю, какую ошибку я совершил? Пожалуйста, помогите мне избавиться от этого..

Заранее спасибо!!!

3 ответа

Вы должны поместить свой код между этими строками

Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub

После перечитывания и еще одного тестирования я понимаю, что код в вашем вопросе уже находится в созданном вами событии Workbook_BeforeSave. Первый ответ, который вы получили, был в правильном направлении, вам нужно добавить дополнительный код в событие Workbook_BeforeClose для обработки правого верхнего X.

То, что вы хотите - это действительно сложная комбинация, которую очень сложно осуществить в Excel. Причина этого имеет несколько аспектов. Если вы закроете книгу с помощью правого верхнего X, это вызовет Workbook_BeforeClose, в этом случае ожидается закрытие документа. Если по какой-либо причине пользователь отменяет закрытие, это даст вам другое неожиданное состояние, при котором при повторном нажатии X Workbook_BeforeClose, кажется, не запускается снова, но теперь запускается Workbook_BeforeSave (встроенная версия).

Вот начало, которое поможет вам также реализовать сохранение xltm, но, как уже было сказано, оно будет ограничивать, поскольку вы заставляете пользователя либо сохранять рабочую книгу и выходить, либо не сохранять, но все же выходить из рабочей книги. Это немного грязно (goto label и т. Д.), Но вы меня поняли.

В Excel существует множество комбинаций "Закрыть / Сохранить", и трудно найти все правильные комбинации, так что вы можете решить использовать их совершенно по-другому...

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  If ActiveWorkbook.Saved = True Then
     Cancel = False
  Else

     Dim iReply As Byte, iType As Integer

     Dim events As Boolean
     Dim alerts As Boolean

     events = Application.EnableEvents
     alerts = Application.DisplayAlerts

     Application.EnableEvents = False
     Application.DisplayAlerts = False

  StartQuestion:

     ' Define buttons argument.
     iType = vbYesNo + vbQuestion + vbDefaultButton2
     iReply = MsgBox("Would you like to save now?", iType)

     Select Case iReply
       Case Is = vbYes         ' user chose Yes save current workbook

         'The following statements shows the save as dialog box with default path
         Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs)

         FileSaveName.InitialFileName = ThisWorkbook.Name
         FileSaveName.FilterIndex = 2   'select to save with a ".xlsm" extension
         FileSaveName.Title = "Save As ... "

         intchoice = FileSaveName.Show

         If intchoice = 0 Then
         Else
            FileSaveName.Execute
         End If

         If ActiveWorkbook.Saved = True Then
            ActiveWorkbook.Close
            Cancel = False
         Else
            GoTo StartQuestion
         End If

      Case Is = vbNo           ' user chose No, don't save

        ActiveWorkbook.Saved = True
        ActiveWorkbook.Close
        Cancel = False

     End Select

     Application.EnableEvents = events
     Application.DisplayAlerts = alerts

   End If

End Sub

Спасибо всем за вашу помощь. Я разобрался с решением.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

StartQuestion:
Cancel = True
'Evaluate if workbook is saved and emulate default propmts
With ThisWorkbook
     Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
         vbYesNoCancel + vbExclamation)
         Case Is = vbYes
             Call CustomSave(vbYes)
             If cancelclicked = False Then
                ThisWorkbook.Saved = True
             Else
                GoTo StartQuestion
             End If
         Case Is = vbNo
             ThisWorkbook.Saved = True
         Case Is = vbCancel
             Exit Sub
     End Select
End With
Cancel = False
End Sub

Sub CustomSave(ans As Long)
Dim MinExtensionX
Dim Arr() As Variant
Dim lngLoc As Variant
Dim events As Boolean
Dim alerts As Boolean
If ActiveWorkbook.Saved = True Then
     Cancel = False
Else
     events = Application.EnableEvents
     alerts = Application.DisplayAlerts

     Application.EnableEvents = False
     Application.DisplayAlerts = False

StartQuestion:
    Select Case ans
    Case Is = vbYes         ' user chose Yes save current workbook
        MinExtensionX = Mid(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".") + 1)
        Arr = Array("xlsx", "xlsm", "xlsb", "xls", "xml", "mht", "mhtml", "htm", "html", "xltx", "xltm", "xlt", "txt", "csv", "prn", "dif", "slk", "xlam", "xla", "pdf", "xps", "ods") 'define which extensions you want to allow
        On Error Resume Next
        lngLoc = Application.WorksheetFunction.Match(MinExtensionX, Arr(), 0)
        If IsEmpty(lngLoc) Then '
            'The following statements shows the save as dialog box with default path
             Set FileSaveName = Application.FileDialog(msoFileDialogSaveAs)

             FileSaveName.InitialFileName = ThisWorkbook.Name
             FileSaveName.FilterIndex = 2   'select to save with a ".xlsm" extension
             FileSaveName.Title = "Save As ... "

             intchoice = FileSaveName.Show
             If intchoice = 0 Then
                cancelclicked = True
             Else
                FileSaveName.Execute
             End If
        Else
            ThisWorkbook.Save
        End If
 End Select
 End If
 End Sub
Другие вопросы по тегам