Столкнулся с такой задачей. Можно ли создать макрос, чтобы книга не закрывалась до выполнения условия "заполнить последнюю ячейку, если заполнена соседняя ячейка". Допустим на "Листе 1" Строка "А6" заполнена. Надо чтобы строка "B6" тоже была заполнена и только после этого можно было закрыть книгу. И так далее...
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Шаг 1: Проверяем пустая ли ячейка C7 i = 4
lLastRow = Sheets("Лист 1").Cells(Rows.Count, 1).End(xlUp).Row K1 = Range("A" & i & ":A" & lLastRow).Address K1 = Application.WorksheetFunction.CountIf(Range(K1), "<>" & "") K2 = Range("B" & i & ":B" & lLastRow).Address K2 = Application.WorksheetFunction.CountIf(Range(K2), "<>" & "") If K1 <> K2 Then 'Шаг 2: Если пустая, отменить закрытие книги Cancel = True MsgBox "Призаполенных ячейка в столбца А не может быть пустыми значения в столбце В" 'Шаг 3: Если не пустая, сохранить и закрыть Else: ActiveWorkbook.Close SaveChanges:=True End If
Подправил макрос уважаемого Mershik. Добавил функцию закрытия приложения если открыта одна книга. Добавил проверку если В заполнен, а А не заполнен. Не совсем понял зачем сохранять книгу ну да ладно.
Код
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i&, lLastRow&
Dim K1$, K2$
'Шаг 1: Проверяем пустая ли ячейка C7
i = 4
With Worksheets("Лист 1")
lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
K1 = .Range("A" & i & ":A" & lLastRow).Address
K1 = Application.WorksheetFunction.CountIf(Range(K1), "<>" & "")
lLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
K2 = .Range("B" & i & ":B" & lLastRow).Address
K2 = Application.WorksheetFunction.CountIf(Range(K2), "<>" & "")
End With
'Шаг 2: Если пустая, отменить закрытие книги
If K1 <> K2 Then
Cancel = True
MsgBox "При заполненных ячейках в столбца А не может быть пустым значение в столбце В"
Exit Sub
'Шаг 3: Если не пустая, сохранить и закрыть
Else
If Workbooks.Count = 1 Then
ThisWorkbook.Save
Application.Quit
Else
ThisWorkbook.Save
End If
End If
End Sub
И ещё один вопрос Mershik: А Вы пробовали через F8 прогнать код? Excel может и загрустить. У меня не раз бывало, что вылетало при таком закрытии.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Всё так. Просто процедура на закрытие несколько раз проходит. Может зациклиться в некоторых случаях.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Здравствуйте уважаемые гуру, по теме запрета закрытия файла, макрос ругается когда вместо значения в ячейке есть формула впр, и если есть найденное значение согласно впр , то, сотрудник должен заполнить данные в соседнем столбце, а если значение не найдено, и, соответственно заполнять в соседней ячейке ничего не надо - чтобы позволял макрос закрыть файл. Вот формула подстановки данных ЕСЛИОШИБКА(ВПР(C4;'TDSheet (3)'!$A$2:$J$5414;10;0);"нет данных"), прикрепляю скрин и файл, спасибо за помощь.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim i&, lLastRow& Dim W1$, W2$ 'Шаг 1: Проверяем пустая ли ячейка C7 i = 4 With Worksheets("Лист 1") lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row W1 = .Range("N" & i & ":N" & lLastRow).Address W1 = Application.WorksheetFunction.CountIf(Range(W1), "<>" & "") lLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row W2 = .Range("O" & i & ":O" & lLastRow).Address W2 = Application.WorksheetFunction.CountIf(Range(W2), "<>" & "") End With 'Шаг 2: Если пустая, отменить закрытие книги If W1 <> W2 Then Cancel = True MsgBox "Если в столбце (N) есть указана почта на которую нужно отправить файл, то, укажите пожалуйста в столбце (O) время отправки E-mail Клиенту , ТИП необходимого для отправки файла клиенту СМОТРИТЕ в столбце (M) . До этого МАРШРУТНЫЙ ЛИСТ не закрооется. Спасибо " Exit Sub 'Шаг 3: Если не пустая, сохранить и закрыть Else If Workbooks.Count = 1 Then ThisWorkbook.Save Application.Quit Else ThisWorkbook.Save End If End If End Sub
Добрый день, подскажите пожалуйста как подкорректировать код VBA, макрос ругается и не даёт закрыть файл. Ячейка пустая в ней формула поиска , значения нет, код VBA видит формулу как значение. Как сделать так чтобы файл закрывался в случае если значение не найдено через еошибка/впр, и в ячейке только формула? Спасибо за ответы.