Страницы: 1
RSS
ошибка в Application.InputBox при выборе диапазона ячеек, По кнопке "Cancel" - ошибка Object required
 
Есть такой код, по которому юзер должен указать исходный диапазон ячеек для последующей обработки в виде Range

Код
Dim myRange as Range 
Set myRange = ThisWorkbook.Application.InputBox(prompt:="asdf?", Title:="qwerty", Default:="$A$1", Type:=8)
Если юзер нажимает кнопку "Cancel", то макрос прерывается по ошибке 424: Object required

Как сделать чтобы по нажатию отмены происходил выход из макроса или переход к нужной метке в коде?
F1 творит чудеса
 
Код
On Error Resume Next 
и обрабатываете ошибку.
 
Код
Sub qqq()
Dim strInput As String
strInput = InputBox("")
    If StrPtr(strInput) = 0 Then
        MsgBox "Вы нажали Cancel!"
    End If
End Sub
 
 
Юрий М , а причем тут String, если нужен Range?
Цитата
Hugo пишет:  On Error Resume Next
Да, спасибо, пришлось долго рыть гугл, пока правильно запрос не сформулировал. Сделал так:
Код
On Error Resume Next
    Set myRange = ThisWorkbook.Application.InputBox(prompt:="asdf?", Title:="qwerty", Default:="$A$1", Type:=8)
    If myRange Is Nothing Then Exit Sub
On Error GoTo 0
Просто в справке написано, что
If you click the Cancel button, InputBox returns False.
Это меня и смутило, никак не удавалось обработать False
F1 творит чудеса
 
Цитата
hohlick пишет: А причем тут String, если нужен Range?
А причём тут Range, если нужно отследить нажатие кнопки "Cancel"?
 
Юрий М, спасибо за пример макроса
я и не думал, что так можно проверить (раньше проверял тип возвращенного значения через VarType)

Коллеги, кто-нибудь пользуется ещё функцией StrPtr()?
я ни разу её не применял - но, похоже, она может много где пригодиться
есть у кого примеры её использования в подобных простеньких макросах?
 
Цитата
hohlick пишет: If you click the Cancel button, InputBox returns False .
вероятно это было думано не для типа 8  :(
 
давно набредал на статейку, ссылку сохранил, но использовать так и не получилось пока...
http://vb.mvps.org/tips/varptr.asp
Изменено: ктулху - 11.06.2014 15:46:11
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Юрий М пишет: А причём тут Range, если нужно отследить нажатие кнопки "Cancel"?
При том, что:
В вашем примере не метод Application.InputBox, а функция InputBox, которая не задает тип вводимых данных (это важно для примера и лишения юзера возможности вводить абракадабру вместо адреса обрабатываемого диапазона).
1. Ошибка "424 Object required" возникает при использовании метода InputBox именно на объекте Range.
2. Если в вашем примере переменную определить как Range, то также будет возникать ошибка до обработки значения Cancel (потому что функция InputBox возвращает значение типа String):


Т.е. ваш пример кода хорош для обработки именно нажатия Cancel в функции InputBox и переменных типа String, т.к. она тогда возвращает vbNullString.
Хотя справка пишет:
Цитата
If the user clicks Cancel, the function returns a zero-length string ("") .
В то время как
Цитата
StrPtr is also the only way to tell the different between an empty string ("")  and a null string (vbNullString). StrPtr(vbNullString) returns 0, while StrPtr("") is non-zero.
F1 творит чудеса
Страницы: 1
Читают тему
Наверх