我有一个输入框,要求用户输入日期。如果用户单击取消或关闭输入对话框而不是按下确定,如何让程序知道停止。
喜欢的东西
if str=vbCancel then exit sub
目前,用户可以点击“确定”或“取消”,但程序仍然可以运行
str = InputBox(Prompt:="Enter Date MM/DD/YYY", _
Title:="Date Confirmation", Default:=Date)
答案 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?")