....Ик....
Всем доброе время суток .)
Осваиваю неизведанное для себя пространство - программирование на VBA. Но дело даже не в языке, а в реализации идеи.
Ести порцедурa, CheckIfEmpty которая проверяет TextBox, на наличие или отсутствие в ней текста. Если Она пустая, то Возвращаетcя значение False, если что-то есть, то True. Ну а дальше если все-таки, что-то было введено, то программа начинает обработку данных. Одним словом - классическая "защита от дурака". Все просто, но я никак не могу подобрать структуру под это дело.
Пример того, что происходит сейчас:
Private Sub Main
x=True
x=CheckifEmpty(TextBox1)
x=CheckIfEmpty(TextBox2)
<.....итд....>
If x = True then
<...обработка...>
End If
End Sub
Скорее всего я просто зациклилась, но как надо построить логику, чтобы Проверилась каждая TextBox, и если хоть одна возвращает False, то ничего дальше не делать, а то с тем что есть сейчас, если Первая False, но Вторая True, то программа переходит на обработку, куда ее пускать при этом не надо.
Просто уверена, что это нечто классическое и я просто не вижу очевидного.
Спасибо.
Осваиваю неизведанное для себя пространство - программирование на VBA. Но дело даже не в языке, а в реализации идеи.
Ести порцедурa, CheckIfEmpty которая проверяет TextBox, на наличие или отсутствие в ней текста. Если Она пустая, то Возвращаетcя значение False, если что-то есть, то True. Ну а дальше если все-таки, что-то было введено, то программа начинает обработку данных. Одним словом - классическая "защита от дурака". Все просто, но я никак не могу подобрать структуру под это дело.
Пример того, что происходит сейчас:
Private Sub Main
x=True
x=CheckifEmpty(TextBox1)
x=CheckIfEmpty(TextBox2)
<.....итд....>
If x = True then
<...обработка...>
End If
End Sub
Скорее всего я просто зациклилась, но как надо построить логику, чтобы Проверилась каждая TextBox, и если хоть одна возвращает False, то ничего дальше не делать, а то с тем что есть сейчас, если Первая False, но Вторая True, то программа переходит на обработку, куда ее пускать при этом не надо.
Просто уверена, что это нечто классическое и я просто не вижу очевидного.
Спасибо.
x=x AND CheckIfEmpty(TextBox2)
книжку по алгоритмам какуюнить почитай) и все встанет на свои места.
Vj_o-oy Это работает для двух строк росто отлично, но что есло там с десяток таких проверок?
keinW У меня как раз перебор книжек по алгоритмам - вот все и начало путаться =)
боюсь что герой с аватара объяснил бы это так, что мне самому пришлось бы чесать репу.
Это можно сделать с помощью битового массива. Создаем массив размером NTextBoxes (кол-во текстовых полей), изначально в нём единицы, после чего пишем процедуру которая проверяет пусто ли поле или полно и в соответствии с этим "гасит" или не "гасит" бит в массиве.
После чего бежим по этому битовому массиву и если хоть где-то нуль (какой то TextBox пуст) то перехода на "ввод данных" не происходит.
Если кол-во TextBoxes случайно то - как-то (понятия не имею как) считаем кол-во TextBox-ов допустим оно n и дальше создаём динамический массив длиной n и делаем то же самое.
В VBA не писал, поэтому написал только идею
Для интереса: а почему кол-во текстовых полей может меняться?
Private Sub Main
x=True
if (CheckifEmpty(TextBox1) or CheckIfEmpty(TextBox2) or <....>Or CheckIfEmpty(TextBoxn)) <> x then
x = False
End if
If x = True then
<...обработка. массива..>
End If
End Sub
команда заняла целых три строчки, но работает %)
Лучше так не делать. Сложность O(1) но код распух неимоверно ). Лучше заплатить O(n) но код выглядит красиво
Исправил предыдущий комментарий.
а на уже подходе еще одна заморочина %D
Чем не подходит решение которое я написал выше?
пока много сил уходит на понимания самого языка и особенности его взаимодействия с экселем. а сроки уже начали поджимать и по сему на сей момент переключилась на другие задачи. если останется время, то попробую еще раз ...
Yarda А что именно не вышло? В чем запинка?
А, кстати, в асме есть команда для проверки битовых массивов
Именно массива (области данных в памяти) или последовательности битов?
Dim x As Boolean
Dim fControl As Control
x = True
For Each fControl In UserForm1.Controls
If TypeName(fControl) = "TextBox" Then
x = x And CheckifEmpty(fControl)
End If
Next
MsgBox x
Попробуйте, может это вам поможет.
Да... and-ить результаты проверок я не догадался (сброс на false будет если хоть один CheckifEmpty будет false). Пошёл место под битовый массив расчищать. Красиво.
Ну тут в принципе по условию можно операцию «AND» и не делать. Просто вынести этот код в функцию которая возвращает True или False, и в цикле For Each ... in ... Next проверять до первого CheckifEmpty равного false. Если такой встретился — сразу возвращаем False. Другое дело если нужно знать конкретные текстбоксы, которые не удовлетворяют условию, тогда, конечно, придется прогнать цикл до конца.