событие workbook_beforesave не срабатывает

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

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). Я не знаю, какую ошибку я совершил? Пожалуйста, помогите мне избавиться от этого.

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

Вам нужно разместить код между этими строками

 Private Sub Workbook_BeforeClose(Cancel As Boolean) End Sub 

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

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

Здесь вы можете начать с реализации xltm save, но, как сказано, это будет ограничивать, поскольку вы вынуждаете пользователя либо сохранять книгу, либо выходить или не сохранять, но все равно выходить из книги. Это немного грязно (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 
  • Как импортировать файл Excel с макросом с помощью SSIS в SQL Server?
  • Копирование данных из одной книги в другую книгу через командную строку
  • Объединение строк рабочего листа Excel в один рабочий лист в одной книге
  • Используйте epplus для создания файла .xlsm
  • Как управлять файлами excel xlsm с помощью python 3
  • Чтение / запись XLSM с использованием POI
  • Excel 2010 - Условное форматирование
  • Как сделать снимок экрана для конкретного файла с помощью pyscreenshot
  • Можем ли мы преобразовать xlsm в xlsx с помощью POI apache
  • VBA excel: принудительное имя файла с Workbook_BeforeSave и ActiveWorkbook.SaveAs
  • Чтение шаблона xlsm и запись больших данных в существующий рабочий лист с использованием SXSSF (POI)
  • Давайте будем гением компьютера.