Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Отмена ввода в Application.InputBox. Как правильно отследить и выйти из процедуры при булевом типе данных (Type:=4)
 
Доброго времени суток Планетяне!

Столкнулся вот с какой проблемой: в Application.InputBox можно указать следующие типы данных для ввода (цифровые обозначения) — 0, 1, 2, 4, 8, 16 и 64.
Я использую только 1 (число), 2 (текст), 4 (булево) и 8 (диапазон). Часто у меня перед запуском макроса появляется несколько Application.InputBox подряд и нужно предусмотреть, чтобы пользователь мог на каждом из них (каждый шаг) выйти из процедуры (передумал) по нажатию стандартных кнопок "Отмена" или "Крестик". Со всем, кроме булева более-менее понятно и получается, а вот этот тип при нажатии кнопок выхода, считает, что ему передали False.

Вообще удивляюсь, конечно, порой мелкомягким  :( … Форму с кнопками сделали, а, для отслеживания, "костыли" приходится использовать. Нет, чтобы как MsgBox — vbOk, vbCancel, vbYes. vbNo и vbRetry. Просто и удобно  :)

Знания по работе с диалогами черпаю, в основном, отсюда.
Изменено: Jack Famous - 17 Апр 2018 15:29:32
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, на мой взгляд логично. Если ожидать в ответ 0/1 и знать что 0 по умолчанию, то обработать не проблема, или нужно искать другой метод, позвляющий получить - "еще не определился"
 
Цитата
БМВ написал:
обработать не проблема
а как?)))) вот передумал человек макрос использовать, нажимает Отмена или крестик, а макрос работает)))
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Вы предложили пользователю вести Истина или Ложь
если результат не Истина, то что выбрал пользователь?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, да не про это я
человек нажал ОТМЕНА (или крестик) - как выйти из процедуры??? Ну передумал он вводить 0 или 1 :D
Сейчас макрос продолжает работать, считая, что пользователь ввёл 0, а пользователь не вводил ничего
Изменено: Jack Famous - 17 Апр 2018 15:30:30
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
1. не стоило даже стартовать
2. выпадет на след. инпутбоксе, если Вы, как программист предоставите ему такую возможность
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, 1 - ну такой себе подход. 2 — не понял про возможность…
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, все от задачи. Я б назвал данный объект сценарным, то есть подразумевающим ввод чего либо и не предусматривающий шаг назад. то есть по умолчанию False и отказаться невозможно, уплачено. Вот и стройте алгоритм исходя из этого. Ну или делайте собственную форму, это тоже не сложно.Или ,что б побесить пользователя, если False, то переспрашивать, вы уверены? :-)
 
Цитата
БМВ написал:
переспрашивать, вы уверены?
:D ахаххаха. Тогда уж сразу все булевые запросы "вешать" на MsgBox("Выбрать ИСТИНУ?", vbYesNoCancel + vbQuestion + vbDefaultButton1) — первое, о чём я подумал  :)

Интересно было именно через App.IB отследить — можно же, например, диапазон проверить (If TypeName<>"Range"/If введено is Nothing) или текст (If введено="False")…
Изменено: Jack Famous - 17 Апр 2018 15:38:54
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Ну может Дмитрий подскажет что. Вон смотрю читает тему, а может уже и пишет :-)
 
в этом примере не пердусмотрено выхода из окна ввода текста, пока не будет введен ТЕКСТ
но Вы, как программист можете дать возможность выйти, а можете не дать такой возможности
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Попробуйте так:
Код
h = Application.InputBox("Укажите 1 или 0", "", Type:=4)
If h = 3731044 then
msgbox "Нажата кнопка Отмена"
end if
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Jack Famous написал:
все булевые запросы "вешать" на MsgBox
Да, и это избавит пользователя от необходимости вводить что-либо в поле ввода, т.е. от лишнего действия.
И зависимости от локали не будет: в русской локали надо вводить "истина", в английской - "true" (можно конечно вводить 1 или другое число, отличное от 0, но это уже хак в контексте вопроса).
 
Ігор Гончаренко, аварийное завершение работы  :D
Дмитрий Щербаков, пока не выходит… Пробую варианты
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
Пробую варианты
ну что там пробовать, False  будет.  

Поддержу
Цитата
Казанский написал:
Да, и это избавит пользователя от необходимости вводить что-либо в поле ввода

Off. Подъехал Илья Муромец к придорожному камню, а на нем написано - "Без вариантов!".
 
Буржуи пишут, что можно проверить тип данных на выходе и понять 0 это или false
Код
Sub Test()
Dim vRet As Variant
 
vRet = Application.InputBox("Enter Value", Type:=1)
 
If (VarType(vRet) = vbBoolean) And (vRet = False) Then
        MsgBox "False"
ElseIf vRet = 0 Then
        MsgBox "Zero"
Else
        MsgBox vRet
End If
End Sub
Я не волшебник, я только учусь.
 
Казанский, БМВ, так и сделаю, значит  :D

Дмитрий Щербаков, интересное решение (даже не знаю, что это вы использовали), но так ничего и не вышло. Переменные объявлены As Boolean - может поэтому проверка If h = 3731044 then лишена смысла?…

Wiss, так-то оно так, но переменные — Boolean и Type:=4
Для текста я практически так и делаю — If ввели="False" Then Exit Sub
Изменено: Jack Famous - 17 Апр 2018 16:17:49
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
Переменные объявлены As Boolean
Ну естественно. у переменной Boolean всегда только два значения - True или False. Откуда там числу взяться? Надо As Variant использовать.
Уточню: все, что не равно 0 переменная булева типа примет за True, а 0 будет всегда False.
Изменено: Дмитрий Щербаков - 17 Апр 2018 16:16:50
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий Щербаков написал:
все, что не равно 0 переменная булева типа примет за True, а 0 будет всегда False
спасибо, Дим! Не знал этого  :idea:

Спасибо всем помогающим! Остановлюсь на варианте с MsgBox  ;)
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Проще юзерформу сделать. Там такие события отслеживаются.
 
Anchoret, проще использовать готовый MsgBox))) ну, мне точно)) для случаев с ДА/НЕТ буду его юзать
а в формах я пока что нуб  :D  за инфу по событиям — спасибо  ;)
Изменено: Jack Famous - 17 Апр 2018 16:37:52
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, юзерформы - достаточно гибкий инструмент) Осваиваются быстро.
 
Anchoret, я обязательно до них дойду и буду тут спрашивать на форуме — скоро уже надо будет)) спасибо!
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: 1
Читают тему (гостей: 1)