У Райли есть рабочий лист, с которым ему нужно работать каждую пятницу. Этот рабочий лист основан на шаблоне, и он должен заполнить как минимум пять ячеек в диапазоне C4: C8. Когда он начинает работу с листом, эти ячейки пусты. Райли задается вопросом, есть ли способ предотвратить сохранение и / или закрытие рабочего листа, пока он не заполнит все пять этих ячеек.

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

В качестве примера того, как это может работать, предположим, что рабочий лист, содержащий проверяемый диапазон (C4: C8), называется «MyData». Вы можете добавить этот код в модуль ThisWorkbook:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be closed."

MsgBox sTemp         Cancel = True     End If End Sub

Обратите внимание, что макрос полагается на функцию листа CountBlank для определения наличия пробелов в диапазоне ячеек. Если он обнаруживает какие-либо пустые cekks (iCount больше 0), то макрос отображает сообщение для пользователя, а для переменной Cancel устанавливается значение True, что фактически останавливает закрытие книги.

Вы можете использовать аналогичный макрос для события BeforeSave следующим образом:

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

Dim rng As Range     Dim iCount As Integer     Dim sTemp As String

Set rng = Worksheets("MyData").Range("C4:C8")

iCount = Application.WorksheetFunction.CountBlank(rng)

If iCount <> 0 Then         sTemp = rng.Address & " has blank cells. " & vbCrLf         sTemp = sTemp & "The workbook will not be saved."

MsgBox sTemp         Cancel = True     End If End Sub

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

rng.Select

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

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

Этот совет (4364) применим к Microsoft Excel 2007, 2010, 2013 и 2016.