Страницы: 1
RSS
Me.TextBox3.Value="" определяется как числовое значение
 
Здравствуйте, уважаемые форумчане!
Сразу прошу прощения за отсутствие файла-примера, т.к. в нем куча листов, форм и кода и разбираться в нем - очень большая трата времени, сам уже не все помню что как и для чего делал, давно было :)
Столкнулся с такой загадкой:
При активации формы выполняется Me.TextBox3.Value ="",
но при выборе (из ComboBox на этой же форме) определенной категории в этот TextBox3 из ячейки подтягивается кол-во параметров, находящихся в этой категории.
Новые параметры добавляются в выбранную категорию с этой же формы кнопкой "Добавить", причем их (параметров) должно быть не более 20.
Для этого в модуле кнопки есть проверка:
Код
If Me.TextBox3.Value > 20 Then
   MsgBox "В одну категорию можно записать не более 20 параметров.", 64, "СТОП!"
   Exit Sub
End If
Папка с программой заархивирована в RAR и хранится на Яндекс-диске больше года, пользователи скачивают ее для бесплатного использования.
Изначально все прекрасно работало, но сейчас один из пользователей сообщил, что после создания новой категории при добавлении в нее нового параметра выводится вышеуказанное предупреждение "СТОП!" и соответственно параметры не добавляются. При этом TextBox3 остается чистым, в нем не отображается  никакое количество, т.е. окно с предупреждением выводиться не должно. Пока просто закомментировал проверку, но это не есть выход из ситуации.
Вопрос:
В чем может быть причина такого поведения VBA?
Заранее благодарю за любые советы и пинки в ту или иную сторону
 
 
_Igor_61, Прям сильно не вникал в то, что вы хотите, но вот это - "" ,хоть и пустая, но текстовая строка, а текст всегда при сравнении с числом - больше него. Пример: в ячейке А1 напишите ="", в ячейку А2 запишите формулу =А1>20, результатом будет ИСТИНА
Изменено: Александр П. - 23.09.2020 07:15:29
 
Спасибо, Александр, попробую поменять на 0. Странно, но раньше в этом месте "" почему-то работало и предупреждение не выводилось...
P.S. Поменял, заработало, СПАСИБО!  
Изменено: _Igor_61 - 23.09.2020 07:31:41
 
Цитата
_Igor_61 написал:
но раньше в этом месте "" почему-то работало
может потому что пользователь заполнял этот текст бокс перед запуском макроса с  кодом содержащим проверку его значения? Других причин не могу предположить. 🙂
 
Скорее всего причина во мне.  :) Делал давно, уже не помню подробностей. В ячейке (из которой значение тянется в TextBox) формула считает параметры, и в формуле если 0 параметров, то "". Наверное изначально и был 0, но чтобы в форме в TextBox-е он глаза не мозолил я скорее всего в какой-то момент поменял на "" и не проверил как работает. Сейчас поменял в формуле "" на 0, и все в порядке стало. Правда, в TextBox-е теперь каждый раз при открытии будет 0 маячить, но придется с этим смириться  :)
БОЛЬШОЕ СПАСИБО!!!
 
Зачем с этим мирится если нужно просто обработать. Что мешает проверить и на пусто и на >20. В идеале надо проверять а не просто ли текст там.
Изменено: БМВ - 23.09.2020 08:41:17
По вопросам из тем форума, личку не читаю.
 
Если в текстбоксе - число, то почему бы вот так не сделать?
Код
If clng(Me.TextBox3.Value) > 20 Then   
   MsgBox "В одну категорию можно записать не более 20 параметров.", 64, "СТОП!"
   Exit Sub
End If
Изменено: Михаил Лебедев - 23.09.2020 09:17:20
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Да, век живи - век учись... :)  Смотрю вот сейчас на эту свою программу спустя год и вижу, что очень многое можно было иначе сделать...
СПАСИБО ВСЕМ!!!
 
Цитата
Михаил Лебедев написал:
почему бы вот так не сделать?
наверно по тому, что именно так будет ошибка :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
Михаил Лебедев написал:
Цитата
Если в текстбоксе - число, то почему бы вот так не сделать?
не понял...
Цитата
БМВ написал:
наверно по тому, что именно так будет ошибка :-)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Михаил Лебедев написал:
Then   MsgBox "В
перевод строки потерялся.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
перевод строки потерялся
Ща поправим... Но по сути - да, дурацкий совет я дал.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Михаил Лебедев написал:
да, дурацкий совет я дал.
не совсем, но если там пусто то в ошибку уйдет и надо её обрабатывать или перед этим проверять на равенство "" . А если там не число, то снова ошибка при конвертации. так что ...
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
А если там не число, то снова ошибка...
....А если число, то Clng() не нужен :)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Код
If VAL(Me.TextBox3.Value) > 20 Then  
   MsgBox "В одну категорию можно записать не более 20 параметров.", 64, "СТОП!"
   Exit Sub
End If

Хотя если текстовое значение недопустимо, то нужна еще проверка и на это дело.
Хотя кому я это пишу))
 
Здравствуйте, Игорь, коллеги! Тут есть один "хитрый" момент, который заключается в том, что свойство Value объекта Textbox имеет тип Variant, в отличие от свойства Text, которое имеет тип String. Если бы в #1 использовалось свойство Text вместо Value, то возникла бы ошибка преобразования типа (проверьте!).
VBA по-разному сравнивает типы String c Integer (Long...) и Variant c Integer (Long...). В первом сравнении производится попытка преобразования текста в число, при невозможности возникает ошибка времени выполнения. Во втором случае при невозможности преобразования текста в число считается, что текст больше числа (как в языке формул Excel).

Если мы хотим гарантировать, что текст из Textbox может быть в VBA интерпретирован как число, то лучше в начале проверить свойство Value (или Text) с помощью функции IsNumeric.
Изменено: sokol92 - 23.09.2020 16:27:45
Владимир
Страницы: 1
Наверх