Все остальные, которые я нашел, указывают на объявленную переменную в виде строки, моя - DOUBLE
Вы не можете иметь Double
. Функция возвращает String
, и вы не можете это изменить. Использование Double
для захвата результата рано или поздно вызовет .
То, что я пытался объяснить в поле для комментариев ранее, это то, что существует вероятность того, что 0
может быть допустимым вводом, поэтому немедленное преобразование ввода в Double
лишает вас возможности сообщить об отмене из 0
- независимо от ошибки несоответствия типов, которая гарантированно произойдет, если результат не числовой.
Как показывают другие ответы, это включает в себя немало сантехники: достаточно, чтобы оправдать втягивание в свою собственную выделенную функцию-обертку.
Проблема в том, что функции возвращают одно значение, поэтому вы можете вернуть Double
и выбрать конкретное «магическое значение», означающее «вход был отменен», но это плохая практика.
Лучший способ - заставить функцию-оболочку возвращать Boolean
и использовать параметр ByRef
для возврата результата - такая функция возвращает False
, если пользователь отменяет приглашение, True
, если запрос не был отменен, и outResult
будет либо 0
для нечислового ввода, либо входом, преобразованным в Double
:
Public Function TryGetDoubleInput( _
ByVal prompt As String, _
ByVal title As String, _
ByVal default As String, _
ByRef outResult As Double) _
As Boolean
Dim result As String
result = VBA.Interaction.InputBox(prompt, title, default)
TryGetDoubleInput = StrPtr(result) <> 0 'return false if cancelled
If IsNumeric(result) Then outResult = CDbl(result)
End Function
Можно использовать так:
Dim value As Double
If TryGetDoubleInput("Enter a numeric value:", "Prompt", "0.00", value) Then
If value = 0 Then
MsgBox "You entered either 0 or a non-numeric value"
Else
MsgBox "You entered " & CStr(value) ' note the irony
End If
Else
MsgBox "You cancelled the prompt"
End If
Теперь, если вам нужно обрабатывать недопустимые значения иначе, чем 0
(т. Е. Если 0
является допустимым вводом), подумайте о том, чтобы выдать ошибку:
Public Function TryGetDoubleInput( _
ByVal prompt As String, _
ByVal title As String, _
ByVal default As String, _
ByRef outResult As Double) _
As Boolean
Dim result As String
result = VBA.Interaction.InputBox(prompt, title, default)
If StrPtr(result) = 0 Then Exit Function 'return false if cancelled
If IsNumeric(result) Then
outResult = CDbl(result)
TryGetDoubleInput = True
Else
Err.Raise 555, "TryGetDoubleInput", "Non-numeric input is invalid."
End If
End Function
И теперь вы можете использовать обработку ошибок для обработки недопустимых вводов, и теперь вы можете сказать действительное 0
из отмененного поля ввода из произвольного неверного ввода:
On Error GoTo ErrHandler
Dim value As Double
If TryGetDoubleInput("Enter a numeric value:", "Prompt", "0.00", value) Then
MsgBox "You entered " & CStr(value) ' note the irony
Else
MsgBox "You cancelled the prompt"
End If
Exit Sub
ErrHandler:
MsgBox Err.Description ' "Non-numeric input is invalid."