Как выйти из цикла выполнения, когда я нажимаю кнопку отмены

Sub msgbox_icons()
    Dim t As String, arg As Integer
    t = "Message Box Icons Demo"
    Do
        arg = InputBox(prompt:="Enter below one of the integers: (16, 32, 48 or 64):", Title:=t)
        If arg = 16 Then
            MsgBox arg & "<=> Critical Message Icon", vbCritical + vbOK, t
        ElseIf arg = 32 Then
            MsgBox arg & "<=> Warning Query Icon", vbQuestion + vbOK, t
        ElseIf arg = 48 Then
            MsgBox arg & "<=> Warning Message Icon", vbExclamation + vbOK, t
        ElseIf arg = 64 Then
            MsgBox arg & "<=> Information Message Icon", vbInformation + vbOK, t
        Else
            MsgBox arg & "<=> non-existent icon type", vbOKCancel, t
        End If
    Loop
End Sub

Когда я нажимаю кнопку отмены, он говорит мне, что у меня ошибка типа 13. Мне было интересно, как это исправить. Кроме того, как бы я закончил макрос, если я нажму кнопку отмены как для поля ввода, так и для окна сообщения. Спасибо.


person Anmol Seth    schedule 10.05.2018    source источник
comment
В какой строке возникает ошибка?   -  person Mistella    schedule 11.05.2018


Ответы (1)


поскольку возвращаемое значение кнопки отмены представляет собой пустую строку, переменная arg должна быть строкой, а затем спрашивая, является ли она числовой, вы можете сказать, нажата ли кнопка отмены, используйте «Exit Do», чтобы выйти из цикла, ваш код может быть таким:

Sub msgbox_icons()
    Dim arg, t As String

    t = "Message Box Icons Demo"
    Do
        arg = InputBox(Prompt:="Enter below one of the integers: (16, 32, 48 or 64):", Title:=t)
        If Not IsNumeric(arg) Then
            Exit Do
        ElseIf arg = 16 Then
            MsgBox(arg & "<=> Critical Message Icon", vbCritical + vbOK, t)
        ElseIf arg = 32 Then
            MsgBox(arg & "<=> Warning Query Icon", vbQuestion + vbOK, t)
        ElseIf arg = 48 Then
            MsgBox(arg & "<=> Warning Message Icon", vbExclamation + vbOK, t)
        ElseIf arg = 64 Then
            MsgBox(arg & "<=> Information Message Icon", vbInformation + vbOK, t)
        Else
            MsgBox(arg & "<=> non-existent icon type", vbOKCancel, t)
        End If
    Loop
End Sub
person MorenajeRD    schedule 10.05.2018
comment
Примечание: в настоящее время arg является вариантом. VBA по умолчанию присваивает переменным значение variant, если только каждой переменной явно не назначен определенный тип. - person Mistella; 11.05.2018
comment
@mistella в этом ответе, который был бы преднамеренным и необходимым, чтобы избежать ошибки при нажатии Esc - person chris neilsen; 11.05.2018
comment
@misael вам нужно удалить () вокруг аргументов MsgBox - person chris neilsen; 11.05.2018
comment
@chrisneilsen Я просто хотел явно заявить / уточнить это, потому что я видел несколько случаев, когда люди используют этот формат, ожидая, что arg будет определено как String, или используют что-то вроде Dim t, c as Integer и ожидают, что t будет целым числом в результате. (Кроме того, из того, как @Misael говорит, что the arg variable must be a string, подразумевается (неправильное) понимание того, как именно arg определяется в коде) - person Mistella; 11.05.2018
comment
@mistella перечитывает пост. Я согласен, ОП, вероятно, предполагал, что arg будет строкой. - person chris neilsen; 12.05.2018