Напишите отдельную функцию, отвечающую за это приглашение, и используйте ее, например, следующим образом:
Dim casingSize As String
If GetCasingSize(casingSize) Then
ActiveSheet.Range("C2").Value = casingSize
End If
Функция должна вернуть Boolean
, чтобы это работало - она возвращает True
, если входдопустимо, False
, если нет действительного ввода для работы (например, приглашение было отменено). Что делает эту работу, так это передачу результата в виде аргумента ByRef
, например:
Public Function GetCasingSize(ByRef outResult As String) As Boolean
Do
Dim raw As Variant
raw = InputBox("Casing size?")
If VarType(raw) = vbBoolean Then
'handle cancelled prompt:
Exit Do
End If
If ValidateFractional(raw) Then
'handle valid input:
outResult = CStr(raw)
GetCasingSize = True
Exit Do
End If
'handle invalid input:
If MsgBox("The value '" & raw & "' is not valid. Try again?", vbYesNo) = vbNo Then
Exit Do
End If
Loop
End Function
Обратите внимание, что функция ValidateFractional
сама по себе важна - отдельная функция Private
будет работать, ноЯ бы порекомендовал сделать его Public
и модульное тестирование , чтобы убедиться, что он работает, как и предполагалось, с учетом широкого разнообразия вводов в крайнем случае - и наличие его в отдельной функции означает, что логика в GetCasingSize
не нужно менять, если требуется точная настройка проверки;например, эта наивная реализация использует оператор Like
и будет работать для 5-1/4
, но не для, например, 15-5/8
:
Public Function ValidateFractional(ByVal value As String) As Boolean
ValidateFractional = value Like "#[-]#/#"
End Function
Использование Регулярных выражений для этого, вероятно, будетхорошая идея.