Страница 1 из 5

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

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

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

Добавлено: 05 июл 2007, 03:22
bi-lya
Workbook_SheetChange
Workbook_SheetSelectionChange
Worksheet_Change
Worksheet_SelectionChange

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

Добавлено: 05 июл 2007, 04:33
Dim_ok
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

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

Добавлено: 05 июл 2007, 10:24
Aent
Dim_ok, приведённый вами код присваивает ячейке B1 листа Лист1 пустую строку при изменении любой ячейки если в ячейке A1 листа Лист1 пустая строка. Никакого отношения к вопросу ваш ответ не имеет .... :(
Кстати, так как вы не запретили в обработчике обработку событий перед присваиванием (Application.EnableEvents = False), то ваш пример ещё и зациклится. :(
Тем более неуместным выглядит явное указание листа если уж вы собрались продемонстрировать обработчик события Workbook_SheetChange а не Worksheet_Change.

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

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

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

Добавлено: 05 июл 2007, 16:18
Dim_ok
Aent, да я собственно и не уповал на точныость ответа, я помоему даже ячейки другие указал, чем в вопросе, направление мысли вроде бы то, а как уж внутри, тут много знать и ненада
я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
остальное можно занести всё, разве не так работает?
хотя конечно нада брать Worksheet_Change.

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

Добавлено: 05 июл 2007, 17:41
AlexZZZ
&quot писал(а):я стремился запретить ввод в ячейку В2 пока не занесено значение в ячейку А1
Решение интересное, только как быть если строк в документе больше ста: для каждой строки код прописывать?

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

Добавлено: 05 июл 2007, 21:57
Asya
Есть вот такое "чайниковское" предложение:

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

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("заполните предыдущую строку") это сообщение зацикливает на много раз?
Но вроде эту идею можно доработать, товарищи опытные программисты, подскажите пожалуйста

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

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

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

Private Sub Worksheet_Change(ByVal Target As Range)
................................................
Application.EnableEvents = False
'...........
'Модифицируем ячейки
'...........
Application.EnableEvents = True
End Sub

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

Добавлено: 06 июл 2007, 00:37
AlexZZZ
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