Проверка на заполнение.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Всем доброго здравия!
Интересную задачку мне задали коллеги: как сделать так, чтобы заставить пользователя обязательно внести информацию в нужные ячейки при заполнении. Например, если ячейка А2 непустая, то запретить пользователю переход на другую строку (запрет выделения ячеек на других строках), если ячейки D2 и G2 пустые. А ячейку A2 запретить изменять, если пустая ячейка A1. Соответственно, тот же случай с ячейками А3 и D3,G3 и т.д.
Вообще, возможно написать такой макрос и есть ли хоть какие-нибудь похожие примеры?
bi-lya
Сообщения: 97
Зарегистрирован: 07 июн 2007, 14:08

Workbook_SheetChange
Workbook_SheetSelectionChange
Worksheet_Change
Worksheet_SelectionChange
Dim_ok
Сообщения: 51
Зарегистрирован: 03 июл 2007, 09:17

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
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Dim_ok, приведённый вами код присваивает ячейке B1 листа Лист1 пустую строку при изменении любой ячейки если в ячейке A1 листа Лист1 пустая строка. Никакого отношения к вопросу ваш ответ не имеет .... :(
Кстати, так как вы не запретили в обработчике обработку событий перед присваиванием (Application.EnableEvents = False), то ваш пример ещё и зациклится. :(
Тем более неуместным выглядит явное указание листа если уж вы собрались продемонстрировать обработчик события Workbook_SheetChange а не Worksheet_Change.
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Сейчас возникла другая идея по практической реализации данной задачи. Сделать ячейки защищёнными, кроме первой строки и при условии заполнения ячеек A, B и G, разблокировать нижележащую строчку. А при попытке занести данные в заблокированные ячейки сделать всплывающее предупреждение: "Заполните нужные ячейки!". Только как реализовать это на практике, моих познаний в vba не хватает.
Dim_ok
Сообщения: 51
Зарегистрирован: 03 июл 2007, 09:17

Aent, да я собственно и не уповал на точныость ответа, я помоему даже ячейки другие указал, чем в вопросе, направление мысли вроде бы то, а как уж внутри, тут много знать и ненада
я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
остальное можно занести всё, разве не так работает?
хотя конечно нада брать Worksheet_Change.
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

&quot писал(а):я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
Решение интересное, только как быть если строк в документе больше ста: для каждой строки код прописывать?
Asya
Сообщения: 110
Зарегистрирован: 06 фев 2007, 14:33
Откуда: Киев
Контактная информация:

Есть вот такое "чайниковское" предложение:

Код: Выделить всё

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
Таким образом вроде работает и нельзя внести данные ни в какую строку, если не заполнены данные на предыдущей строке (столбец 1-6)
Только вот тут не получается вывести сообщение для пользователя.
Почему если после проверки флага поставить msgbox("заполните предыдущую строку") это сообщение зацикливает на много раз?
Но вроде эту идею можно доработать, товарищи опытные программисты, подскажите пожалуйста
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

&quot писал(а):Почему если после проверки флага поставить msgbox("заполните предыдущую строку") это сообщение зацикливает на много раз?
Ещё раз напоминаю о необходимости временно отключать обработку событий
приложения в обработчике Worksheet_Change перед любой модификацией ячеек!
Не забывайте

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Range)
................................................
Application.EnableEvents = False
'...........
'Модифицируем ячейки
'...........
Application.EnableEvents = True
End Sub
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

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
Ответить