Проверка на заполнение.
Модератор: Naeel Maqsudov
Всем доброго здравия!
Интересную задачку мне задали коллеги: как сделать так, чтобы заставить пользователя обязательно внести информацию в нужные ячейки при заполнении. Например, если ячейка А2 непустая, то запретить пользователю переход на другую строку (запрет выделения ячеек на других строках), если ячейки D2 и G2 пустые. А ячейку A2 запретить изменять, если пустая ячейка A1. Соответственно, тот же случай с ячейками А3 и D3,G3 и т.д.
Вообще, возможно написать такой макрос и есть ли хоть какие-нибудь похожие примеры?
Интересную задачку мне задали коллеги: как сделать так, чтобы заставить пользователя обязательно внести информацию в нужные ячейки при заполнении. Например, если ячейка А2 непустая, то запретить пользователю переход на другую строку (запрет выделения ячеек на других строках), если ячейки D2 и G2 пустые. А ячейку A2 запретить изменять, если пустая ячейка A1. Соответственно, тот же случай с ячейками А3 и D3,G3 и т.д.
Вообще, возможно написать такой макрос и есть ли хоть какие-нибудь похожие примеры?
Workbook_SheetChange
Workbook_SheetSelectionChange
Worksheet_Change
Worksheet_SelectionChange
Workbook_SheetSelectionChange
Worksheet_Change
Worksheet_SelectionChange
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Worksheets("Лист1").Cells(1, 1) = "" Then Worksheets("Лист1").Cells(1, 2) = ""
End Sub
If Worksheets("Лист1").Cells(1, 1) = "" Then Worksheets("Лист1").Cells(1, 2) = ""
End Sub
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Dim_ok, приведённый вами код присваивает ячейке B1 листа Лист1 пустую строку при изменении любой ячейки если в ячейке A1 листа Лист1 пустая строка. Никакого отношения к вопросу ваш ответ не имеет .... 
Кстати, так как вы не запретили в обработчике обработку событий перед присваиванием (Application.EnableEvents = False), то ваш пример ещё и зациклится.
Тем более неуместным выглядит явное указание листа если уж вы собрались продемонстрировать обработчик события Workbook_SheetChange а не Worksheet_Change.

Кстати, так как вы не запретили в обработчике обработку событий перед присваиванием (Application.EnableEvents = False), то ваш пример ещё и зациклится.

Тем более неуместным выглядит явное указание листа если уж вы собрались продемонстрировать обработчик события Workbook_SheetChange а не Worksheet_Change.
Сейчас возникла другая идея по практической реализации данной задачи. Сделать ячейки защищёнными, кроме первой строки и при условии заполнения ячеек A, B и G, разблокировать нижележащую строчку. А при попытке занести данные в заблокированные ячейки сделать всплывающее предупреждение: "Заполните нужные ячейки!". Только как реализовать это на практике, моих познаний в vba не хватает.
Aent, да я собственно и не уповал на точныость ответа, я помоему даже ячейки другие указал, чем в вопросе, направление мысли вроде бы то, а как уж внутри, тут много знать и ненада
я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
остальное можно занести всё, разве не так работает?
хотя конечно нада брать Worksheet_Change.
я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
остальное можно занести всё, разве не так работает?
хотя конечно нада брать Worksheet_Change.
Решение интересное, только как быть если строк в документе больше ста: для каждой строки код прописывать?" писал(а):я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
Есть вот такое "чайниковское" предложение:
Таким образом вроде работает и нельзя внести данные ни в какую строку, если не заполнены данные на предыдущей строке (столбец 1-6)
Только вот тут не получается вывести сообщение для пользователя.
Почему если после проверки флага поставить msgbox("заполните предыдущую строку") это сообщение зацикливает на много раз?
Но вроде эту идею можно доработать, товарищи опытные программисты, подскажите пожалуйста
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
flag = 0
If Target.Row <> 1 Then ' esli ne pervaya stroka
For j = 1 To 6
If Cells(Target.Row - 1, j) = "" Then ' proveryaem est' li v predidushey stroke (ot 1 do 6) pustie znacheniya
flag = 1 ' esli est' ustanavlivaem flag v 1
End If
Next j
If flag = 1 Then ' proveryaem znachenie flaga, esli 1 to obnulyaem vvedennoe znachenie
Target.Value = ""
End If
End If
End Sub
Только вот тут не получается вывести сообщение для пользователя.
Почему если после проверки флага поставить msgbox("заполните предыдущую строку") это сообщение зацикливает на много раз?
Но вроде эту идею можно доработать, товарищи опытные программисты, подскажите пожалуйста
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Ещё раз напоминаю о необходимости временно отключать обработку событий" писал(а):Почему если после проверки флага поставить msgbox("заполните предыдущую строку") это сообщение зацикливает на много раз?
приложения в обработчике Worksheet_Change перед любой модификацией ячеек!
Не забывайте
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
................................................
Application.EnableEvents = False
'...........
'Модифицируем ячейки
'...........
Application.EnableEvents = True
End Sub
Asya и Aent, спасибо! не успел прочитать последний пост, а прочитав, отредактировал сообщение. Я немного модифицировал, как смог, Ваш код под условие задачи.
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
flag = 0
If Target.Row <> 1 Then ' esli ne pervaya stroka
j = 1
If Cells(Target.Row - 1, j) = "" Then ' proveryaem est' li v predidushey stroke pustie znacheniya yacheiki "A"
flag = 1 ' esli est' ustanavlivaem flag v 1
End If
j = 4
If Cells(Target.Row - 1, j) = "" Then ' proveryaem est' li v predidushey stroke pustie znacheniya yacheiki "D"
flag = 1 ' esli est' ustanavlivaem flag v 1
End If
j = 7
If Cells(Target.Row - 1, j) = "" Then ' proveryaem est' li v predidushey stroke pustie znacheniya yacheiki "G"
flag = 1 ' esli est' ustanavlivaem flag v 1
End If
If flag = 1 Then ' proveryaem znachenie flaga, esli 1 to obnulyaem vvedennoe znachenie
Target.Value = ""
MsgBox ("Должны быть заполнены ячейки A, D и G в предыдущей строке")
End If
End If
Application.EnableEvents = True
End Sub