2013-08-02 2 views
2

Я прочитал несколько вопросов по этой проблеме, хотя, поскольку я новичок, я не мог понять свое личное решение.Ошибка времени выполнения 13 Тип несоответствия ~ когда Application.Inputbox Отмена

Мне нужно выйти из подкаталога, когда пользователь нажимает кнопку отмены на форме InputBox. В добавлении, мне нужно InputBox принять входное значение.

Dim UserCol As String 
    Dim FirstRow As Integer 

    UserCol = Application.InputBox(Prompt:="In what Column do we search? (E.g. enter: A)", Type:=2) 
    If UserCol = False Then Exit Sub 
' On cancel works OK. But if you type "A" (no quotes) u get a run-time ERROR 13!  

    FirstRow = Application.InputBox(Prompt:="What is your data-table's first row? (E.g. enter: 2)", Type:=1) 
    If FirstRow = False Then Exit Sub 
' On both cancel & input works flawlessly. 

Я попытался удалить Type := 2, но не было никаких изменений.

ответ

2

Вы не можете обрабатывать строки как булевы (что вы делаете). Строка может выводить результат true/false, но не так, как вы это делаете. Попробуйте с этим кодом:

Dim UserCol As String 
    Dim FirstRow As Integer 

    UserCol = Application.InputBox(Prompt:="In what Column do we search? (E.g. enter: A)", Type:=2) 
    If Len(Trim(UserCol)) < 1 Then Exit Sub 
' On cancel works OK. But if you type "A" (no quotes) u get a run-time ERROR 13! 

    FirstRow = Application.InputBox(Prompt:="What is your data-table's first row? (E.g. enter: 2)", Type:=1) 
    If FirstRow < 1 Then Exit Sub 

Первое условие ложно (и Sub происходит выход), если длина («обрезанного») входной строки ниже, чем 1. Второе условие, если входной является строка не число.

ПРИМЕЧАНИЕ. Имейте в виду, что причина, по которой второе условие не вызывает ошибку, состоит в том, что целые числа «поддерживают логическое значение»; хотя здесь нет никакого реального смысла: если вы удалите это условие, ничего не изменится. Мое условие проверяет, что вы действительно хотите (строка больше или равна 1). Также помните, что InputBox поддерживает целые числа, но это обычно не так (с большинством элементов управления этого типа вам нужно будет получить входы как строку и преобразовать их в целое, прямо или неявно).

ОБНОВЛЕНИЕ -

куды для учета кликов Отменить кнопки:

Dim UserCol As String 
    Dim FirstRow As Integer 

    UserCol = Application.InputBox(Prompt:="In what Column do we search? (E.g. enter: A)", Type:=2) 

    If (LCase(UserCol) <> "false") Then 

    If Len(Trim(UserCol)) < 1 Then Exit Sub 
    ' On cancel works OK. But if you type "A" (no quotes) u get a run-time ERROR 13! 

    FirstRow = Application.InputBox(Prompt:="What is your data-table's first row? (E.g. enter: 2)", Type:=1) 
    If (FirstRow < 1) Then Exit Sub 
    End If 

Если первый InputBox отменяется «ложный» возвращаются (в виде строки), и если второй из них отменил 0 (и, таким образом, исходное условие может справиться с этим).

+0

Спасибо за ответ, теперь он принимает значение, хотя он не выходит из подкаталога, если я нажму ESC или нажмите кнопку «Отмена». Ваше второе условие Выходит из Sub. –

+0

@AntonFrolov Это не было частью вашего ответа (и, фактически, я не уверен, почему вы отменили этот ответ как правильный, насколько он отвечает на то, что вы просили). Вы не можете сделать многопрофильный вопрос, но вы должны опубликовать новый вопрос для каждой проблемы. В любом случае, это кажется довольно простым и будет смотреть на него, но вы не должны этого делать (неназначенный правильный ответ, чтобы спросить новую вещь). – varocarbas

+0

Поскольку я новичок здесь, я не был уверен, как связаться с вами по этой теме. Я прошу прощения за это. ==> Мне нужно выйти из подкаталога, когда пользователь нажимает кнопку отмены в форме InputBox. В добавлении, мне нужно InputBox принять входное значение. <== Мой код сделал 'Exit Sub', но не принял значение. Вы объяснили, почему. Спасибо =) Ваш код принимает значение, но не имеет выхода Sub =/ –

Смежные вопросы