Запретить закрытие книги

здесь 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, который будет стереть временно добавленный код.

http://www.cpearson.com/excel/vbe.aspx


вы пробовали закрыть все свои надстройки (или запустить 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

Как вы можете видеть, он в основном сохраняет и открывает книгу, когда она закрывается