....Ик....
Всем доброе время суток .)

Осваиваю неизведанное для себя пространство - программирование на 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, то программа переходит на обработку, куда ее пускать при этом не надо.

Просто уверена, что это нечто классическое и я просто не вижу очевидного.
Спасибо.

Комментарии
20.08.2008 в 07:26

из сарая
Бейсик не знаю, но в нем ведь должна быть функция логического "И" (на всякий случай напомню, уж не обессутье: операция И возвращает истину тогда и только тогда, когда оба операнда истинны). Нужно для каждого поля, кроме первого, делать примерно так х = х И CheckifEmpy(). Первое должно инициализировать значение х. В общем, поищи операцию "И" в спавочнике или подожди тех, кто знает бейсик.
20.08.2008 в 09:44

WAAAAAAAAAGH!!!!!!1111ONEONE
x=CheckifEmpty(TextBox1)
x=x AND CheckIfEmpty(TextBox2)
20.08.2008 в 13:27

65 108 101 120 97 110 100 101 114
Yarda
книжку по алгоритмам какуюнить почитай) и все встанет на свои места.
20.08.2008 в 13:39

из сарая
keinW А вот человек с твоего аватара так бы не ответил))
20.08.2008 в 14:30

....Ик....
Killen Понятно, что если сделать такую проверку для каждой линии, то все получится. Но неужели нету более элегантного решения, чем ручками вбивать с десяток проверочных строк, если проверять надо больше, чем с десяток textBox? В этом-то и загвостка )

Vj_o-oy Это работает для двух строк росто отлично, но что есло там с десяток таких проверок?

keinW У меня как раз перебор книжек по алгоритмам - вот все и начало путаться =)
20.08.2008 в 14:36

из сарая
Yarda Можно просто в одну линию все ввести. А если поля ввода в массиве, то можно и в простенький цикл сжать. Вопрос в том, можно ли в твоем случае поля ввода собрать в один массив.
20.08.2008 в 14:42

....Ик....
Killen Над этим тоже думала уже, но в моем случае придется мучаться с динамическим (если можно этого избежать, то я только за), потому как число TextBox может меняться, а в одну строчку..... можно, но это будет реальная мега-строчка %D
20.08.2008 в 14:44

из сарая
Yarda Ничего страшного в таких строчках нет.
20.08.2008 в 14:46

....Ик....
Killen Надеялась, что можно существует что-нибудь более удобоваримое, но.... ех, пойду выписывть строчку
20.08.2008 в 15:00

из сарая
Yarda Из моего скудного опыта программирования я знаю, что простого такого способа нет, а за сложный я бы взялся только если речь идет о сотнях или тысячах подобных элементов. Может я не прав, но я вообще не программист)
20.08.2008 в 23:38

65 108 101 120 97 110 100 101 114
Killen
боюсь что герой с аватара объяснил бы это так, что мне самому пришлось бы чесать репу.
23.08.2008 в 03:15

Don't stop the music.
Yarda

Это можно сделать с помощью битового массива. Создаем массив размером NTextBoxes (кол-во текстовых полей), изначально в нём единицы, после чего пишем процедуру которая проверяет пусто ли поле или полно и в соответствии с этим "гасит" или не "гасит" бит в массиве.

После чего бежим по этому битовому массиву и если хоть где-то нуль (какой то TextBox пуст) то перехода на "ввод данных" не происходит.

Если кол-во TextBoxes случайно то - как-то (понятия не имею как) считаем кол-во TextBox-ов допустим оно n и дальше создаём динамический массив длиной n и делаем то же самое.

В VBA не писал, поэтому написал только идею :).

Для интереса: а почему кол-во текстовых полей может меняться?
23.08.2008 в 03:21

....Ик....
я сделала вида

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


команда заняла целых три строчки, но работает %)
23.08.2008 в 03:23

Don't stop the music.
Yarda

Лучше так не делать. Сложность O(1) но код распух неимоверно ). Лучше заплатить O(n) но код выглядит красиво ;)
23.08.2008 в 03:24

....Ик....
Почему?
23.08.2008 в 03:27

Don't stop the music.
Yarda

Исправил предыдущий комментарий.
23.08.2008 в 03:32

....Ик....
потому и спрашивала, потому как это был последний шаг, но пока ничего более не придумала...

а на уже подходе еще одна заморочина %D
23.08.2008 в 03:33

Don't stop the music.
Yarda

Чем не подходит решение которое я написал выше?
23.08.2008 в 03:45

....Ик....
идея решения с помощью массива у меня уже была, но сделать так чтобы оно работало как надо у меня так и не вышло.

пока много сил уходит на понимания самого языка и особенности его взаимодействия с экселем. а сроки уже начали поджимать и по сему на сей момент переключилась на другие задачи. если останется время, то попробую еще раз ...
23.08.2008 в 04:14

из сарая
А, кстати, в асме есть команда для проверки битовых массивов. Правда, не помню, она в стандарте архитектуры х86 или же в ММХ.

Yarda А что именно не вышло? В чем запинка?
23.08.2008 в 05:11

Don't stop the music.
Killen

А, кстати, в асме есть команда для проверки битовых массивов

Именно массива (области данных в памяти) или последовательности битов?
23.08.2008 в 06:06

из сарая
Слушатель Последовательности битов. Хотя, кажется, была еще одна для аналогичной проверки какого-то диапазона ячеек в памяти, но очень сомневаюсь, что моя память не выкинула трюк.
05.09.2008 в 08:48

Вообще обычно элементы управления, и текстбоксы в том числе распалагаются на формах. В VBA у форм есть свойство Controls, которое представляет из себя коллекцию элементов расположенных на форме. Как и ко всем коллекциям в VBA к ней применим оператор For Each ... in ... Next, который перебирает всё содержимое коллекции. Таким образом, будь у вас на форме хоть тысяча текстбоксов, можно применить следующий компактный код:



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



Попробуйте, может это вам поможет.
05.09.2008 в 09:35

Don't stop the music.
Vault13boy

Да... and-ить результаты проверок я не догадался (сброс на false будет если хоть один CheckifEmpty будет false). Пошёл место под битовый массив расчищать. Красиво.
05.09.2008 в 14:32

Слушатель
Ну тут в принципе по условию можно операцию «AND» и не делать. Просто вынести этот код в функцию которая возвращает True или False, и в цикле For Each ... in ... Next проверять до первого CheckifEmpty равного false. Если такой встретился — сразу возвращаем False. Другое дело если нужно знать конкретные текстбоксы, которые не удовлетворяют условию, тогда, конечно, придется прогнать цикл до конца.