如何检测用户是否选择取消InputBox VBA Excel

时间:2014-10-08 19:23:23

标签: excel vba

我有一个输入框,要求用户输入日期。如果用户单击取消或关闭输入对话框而不是按下确定,如何让程序知道停止。

喜欢的东西 if str=vbCancel then exit sub

目前,用户可以点击“确定”或“取消”,但程序仍然可以运行

str = InputBox(Prompt:="Enter Date MM/DD/YYY", _ Title:="Date Confirmation", Default:=Date) enter image description here

4 个答案:

答案 0 :(得分:23)

如果用户单击“取消”,则返回零长度字符串。你不能将其与输入空字符串区分开来。但是,您可以创建自己的自定义InputBox类...

编辑根据this answer正确区分空字符串和取消。

你的例子

Private Sub test()
    Dim result As String
    result = InputBox("Enter Date MM/DD/YYY", "Date Confirmation", Now)
    If StrPtr(result) = 0 Then
        MsgBox ("User canceled!")
    ElseIf value = vbNullString Then
        MsgBox ("User didn't enter anything!")
    Else
        MsgBox ("User entered " & result)
    End If
End Sub

当用户删除默认字符串时会告诉用户他们取消,或者他们点击取消。

请参阅http://msdn.microsoft.com/en-us/library/6z0ak68w(v=vs.90).aspx

答案 1 :(得分:2)

上述解决方案并非在所有InputBox-Cancel情况下都适用。最值得注意的是,如果必须 InputBox 一个 Range ,它起作用。

例如,尝试使用以下InputBox定义自定义范围(“ sRange”,类型:= 8,需要Set + Application.InputBox),按“取消”会出现错误:

Sub Cancel_Handler_WRONG()
Set sRange = Application.InputBox("Input custom range", _
    "Cancel-press test", Selection.Address, Type:=8)
If StrPtr(sRange) = 0 Then  'I also tried with sRange.address and vbNullString
    MsgBox ("Cancel pressed!")
    Exit Sub
End If
    MsgBox ("Your custom range is " & sRange.Address)
End Sub

在这种情况下,唯一有效的方法是在输入框+ ErrorHandler之前 之前输入“ On Error GoTo ErrorHandler”语句:

Sub Cancel_Handler_OK()
On Error GoTo ErrorHandler
Set sRange = Application.InputBox("Input custom range", _
    "Cancel-press test", Selection.Address, Type:=8)
MsgBox ("Your custom range is " & sRange.Address)
Exit Sub
ErrorHandler:
    MsgBox ("Cancel pressed")
End Sub

因此,问题是如何使用 If 语句检测 错误 StrPtr()= 0?

答案 2 :(得分:2)

以下示例使用InputBox方法验证用户输入以取消隐藏工作表: 重要的是要在StrPtr中使用wrap InputBox变量,以便在用户选择单击InputBox上的“ x”图标时可以将其与“ 0”进行比较。

Sub unhidesheet()

Dim ws As Worksheet
Dim pw As String

pw = InputBox("Enter Password to Unhide Sheets:", "Unhide Data Sheets")
If StrPtr(pw) = 0 Then

   Exit Sub
ElseIf pw = NullString Then
   Exit Sub
ElseIf pw = 123456 Then
    For Each ws In ThisWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next
End If
End Sub

答案 3 :(得分:0)

另一个建议。

inputbox 返回空值时创建一个消息框。示例:

Dim PrC as string = MsgBox( _
"No data provided, do you want to cancel?", vbYesNo+vbQuestion, "Cancel?")