Когда вы разрабатываете рабочий лист, который будет использоваться другими людьми, вы можете убедиться, что они заполнили определенные ячейки, прежде чем им будет разрешено закрыть книгу. В Excel нет встроенной функции для этого, но вы можете создать макрос, который выполнит необходимую проверку и остановит пользователя для продолжения. Это может быть довольно простой макрос, связанный с событием BeforeClose.

Событие BeforeClose запускается всякий раз, когда книга закрывается любым способом. Уловка заключается в настройке свойства Cancel в обработчике событий. Если для параметра «Отмена» задать значение «Истина», закрытие книги прекратится, а оставление его без изменений приведет к обычному закрытию книги.

Например, следующий макрос проверяет, есть ли что-нибудь в ячейке A1; если это так, то книга закрывается. Если нет, то пользователю сообщается, что чего-то не хватает, и закрытие отменяется.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Cells(1, 1).Value = "" Then         MsgBox "Please fill cell A1"

Cancel = True     End If End Sub

При желании можно создать более сложные макросы. Например, у вас может быть несколько разных ячеек, которые нужно проверить. Следующая версия проверяет диапазон с именем «Обязательный», чтобы узнать, содержит ли что-нибудь каждая ячейка диапазона. Если какая-либо из ячеек пуста, то книгу нельзя сохранить или закрыть. (Этот макрос запускается не только во время события BeforeClose, но и во время события BeforeSave.)

Эти два обработчика событий должны быть размещены в кодовой таблице для книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _   Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub

Обратите внимание, что обработчики событий вызывают функцию ForceDataEntry. Эту функцию нужно поместить в обычный макромодуль:

Function ForceDataEntry() As Boolean     Dim rng As Range     Dim c As Variant     Dim rngCount As Integer     Dim CellCount As Integer

Set rng = Range("Mandatory")

rngCount = rng.Count

CellCount = 0     For Each c In rng         If Len(c) > 0 Then             CellCount = CellCount + 1         End If     Next c     ForceDataEntry = False     If CellCount <> rngCount Then ForceDataEntry = True End Function

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

_Примечание: _

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

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (9574) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:

link: / excel-Requiring_Input [Требуется ввод].