Запретить закрытие книги
здесь ABC.xls
файл, который имеет макрос. Теперь у макроса есть sub, который вызывается, когда я нажимаю Ctrl + M
.
Этот суб откроет диалоговое окно Открыть файл, где пользователь может выбрать . Таким образом, этот макрос используется для обработки и сохранения .
Ниже приведен код, который вызывается при нажатии Ctrl + M
.
Sub runProperChangeSubroutine() ' Assigned to shortcut key CTRL + M.
file_name = ActiveWorkbook.Name ' Gets the file name.
Application.Run file_name & "!ChangeSub"
End Sub
когда пользователь закрывает книгу, я должен проверить условие, подобное каждой строке в CSV
имеет строку завершения. Если эту строку увольнение не
присутствует, я должен всплывающее окно сообщения для пользователя и предотвратить закрытие книги.
Поэтому я сделал следующее...
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim improperRowNumber As Integer
Dim BlnEventState As Boolean
improperRowNumber = returnImproperRow()
BlnEventState = Application.EnableEvents
Application.EnableEvents = True
If improperRowNumber <> -1 Then
Cancel = True
MsgBox "The row number " & improperRowNumber & " is not ending with '@/#'. Please correct the row before closing."
Else
Call saveCSV
End If
Application.EnableEvents = BlnEventState
End Sub
при нажатии кнопки закрытия (X отметка в правом верхнем углу, закрытие workboox. Я не закрываю excel.) кнопка, Я могу видеть окно сообщения, но workboox закрывается. Я хочу, чтобы пользователь сделал некоторые изменения, если строка не закончена должным образом. Пожалуйста, предложите.
редактировать:
Поскольку приведенный выше код не работает, я использовал ThisWorkbook.Saved = False
после окна сообщения, как показано ниже...
If improperRowNumber <> -1 Then
MsgBox "The row number " & improperRowNumber & " is not ending with '@/#'. Please correct the row before closing."
Application.DisplayAlerts = False
ThisWorkbook.Saved = False
Cancel = False
Else
теперь он отображает "Do you want to save the changes....
" окно сообщения. Если я нажму на в окне сообщения, книга не закрыта.
есть ли способ настроить текст окна сообщения или кнопки или скрыть это Save
окне сообщения?
5 ответов
Если необходимо отслеживать закрытие книг, отличных от книги, содержащей макросы, можно перехватывать события уровня приложения из книги с поддержкой макросов следующим образом:
добавить (или адаптировать) этот код за ThisWorkbook:
Option Explicit
Private m_CloseHelper As CloseHelper
Private Sub Workbook_Open()
Set m_CloseHelper = New CloseHelper
End Sub
Добавить новый модуль класса с именем CloseHelper:
Option Explicit
Private WithEvents m_App As Excel.Application
Private Sub Class_Initialize()
Set m_App = Excel.Application
End Sub
Private Sub Class_Terminate()
Set m_App = Nothing
End Sub
Private Sub m_App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
'Logic goes here, e.g. the code below will prevent the user from closing
'any workbook other than this one, for as long as this workbook is open.
If Not Wb Is ThisWorkbook Then
Cancel = True
MsgBox "Hello from m_App_WorkbookBeforeClose"
End If
End Sub
важным ключевым словом является WithEvents, и принцип заключается в том, что события, вызванные приложением Excel, теперь могут быть закодированы в CloseHelper класс.
вы найдете более подробную статью здесь: Событий Приложение
нажатие кнопки X в правом верхнем углу завершает работу приложения Excel. Не следует ожидать, что книга останется открытой при закрытии приложения. Вы можете написать процедуру application-event, предотвращающую выход Excel, но лучшим способом может быть просто избавиться от плохой привычки использовать эту кнопку. Найдите другой способ закрыть книгу.
событие Workbook_BeforeClose применяется только к книге, в которой находится код. Он запускается при попытке закрыть книгу макросов и установка параметра Cancel в значение TRUE отменяет только закрытие книги макросов при закрытии Excel. Файл csv, который открыт, является отдельной книгой, и Excel пытается закрыть его отдельно, создавая отдельное сообщение о сохранении файла csv.
для автоматического предотвращения закрытия файла csv необходимо использовать Программирование расширяемости для добавления события Workbook_BeforeClose в csv-файл во время его открытия в Excel. Очевидно, что вы не можете сохранить файл с событием на месте, но вам это не нужно. Код, сидящий в модуле, будет работать, пока книга все еще открыта, предотвращая закрытие, когда ваши условия не выполнены; и успешное сохранение разрешено после условий are met будет в.формат csv, который будет стереть временно добавленный код.
вы пробовали закрыть все свои надстройки (или запустить Excel в безопасном режиме)?
Я спрашиваю, потому что эта проблема может быть связана с тем, что одна из ваших надстроек содержит Событие Уровня Приложения как описано в ответе Excelosaurus'. И он может содержать Application.EnableEvents = False
или даже Cancel = False
и вмешиваться в ваш код.
EDIT: это было бы особенно трудно обнаружить с помощью надстройки, которая защищена, так как код будет работать после Workbook_BeforeClose, и вы не сможете знать, что он делает, даже если вы отлаживали строку за строкой с помощью F8.
этот код можно использовать в макросе книги
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Save
Workbooks.Open Application.ActiveWorkbook.FullName
End Sub
Как вы можете видеть, он в основном сохраняет и открывает книгу, когда она закрывается