この間作った数値チェック自作関数をもうちょっと高級にした版。
小数点とか符号とかチェックするようにしたよ。
Public Enum DecimalType Digit = 0 '符号なし整数 Sign = 1 '符号付き整数 Deci = 2 '符号なし小数 SignDeci = 3 '符号付き小数 End Enum ' 【機 能】 入力されている文字列は、「数値」かをチェックする ' DecimalTypeによって符号なし整数、符号付き整数、符号なし小数、符号付き小数を確認する ' ' 【形 式】 IsDigitDecimal ' ' 【入出力】 decimaltype: (I) Enum型の検査種別 ' Value : (I) 検査したい文字列 ' ' 【戻り値】 数値か True:成功 False:失敗 ' Public Function IsDigitDecimal(ByVal dtype As DecimalType, ByVal value As String) As Boolean Dim ii As Long 'ループカウンタ Dim bDeci As Boolean '小数フラグ '--------------------------- '入力チェック '--------------------------- If Len(value) = 0 Then Exit Function End If '--------------------------- '初期化 '--------------------------- IsDigitDecimal = False bDeci = False '-------------------------------------------------------- ' 実行部 '-------------------------------------------------------- For ii = 1 To Len(value) If ii = 1 Then If dtype = DecimalType.Sign Or dtype = DecimalType.SignDeci Then '--------------------------- '符号付きの場合最初の1桁目が符号である事を確認 '--------------------------- If Mid(value, ii, 1) <> "+" And Mid(value, ii, 1) <> "-" Then IsDigitDecimal = False Exit Function End If '--------------------------- '小数の場合最初の1桁目が小数の場合NG '--------------------------- If dtype = DecimalType.SignDeci Then If Mid(value, ii, 1) = "." Then IsDigitDecimal = False Exit Function End If End If Else '--------------------------- '符号なしの場合1桁目が文字はNG '--------------------------- If Not Mid(value, ii, 1) Like "#" Then IsDigitDecimal = False Exit Function End If End If '--------------------------- ' どの種別の場合でも1桁目が小数点はNG '--------------------------- If Mid(value, ii, 1) = "." Then IsDigitDecimal = False Exit Function End If '--------------------------- 'それ以外の場合 '--------------------------- Else '数字以外か? If Not (Mid(value, ii, 1) Like "#") Then '--------------------------- '符号付き小数の場合、2桁目が文字はNG '--------------------------- If ii = 2 And dtype = DecimalType.SignDeci Then IsDigitDecimal = False Exit Function End If '--------------------------- '小数点が入ってる場合でもDecimalTypeが小数を許容しない場合はエラー '--------------------------- If Mid(value, ii, 1) = "." And (dtype <> DecimalType.Deci And dtype <> DecimalType.SignDeci) Then IsDigitDecimal = False Exit Function '--------------------------- '小数点が入っていて、DecimalTypeが小数を許容する場合、小数点が複数入ってないか '--------------------------- ElseIf Mid(value, ii, 1) = "." And (dtype = DecimalType.Deci Or dtype = DecimalType.SignDeci) Then If bDeci = True Then IsDigitDecimal = False Exit Function Else '小数点が数値の最後でないか If ii = Len(value) Then IsDigitDecimal = False Exit Function End If End If bDeci = True Else IsDigitDecimal = False Exit Function End If End If End If Next ii '全ての文字を検査した後、小数の場合、小数があったか確認 If dtype = DecimalType.Deci Or dtype = DecimalType.SignDeci Then If bDeci = False Then IsDigitDecimal = False Exit Function End If End If IsDigitDecimal = True End Function
こういう結果になる
Dim ret As Boolean Debug.Print "debugAnswer:" Debug.Print "digittest" '整数 ret = IsDigitDecimal(Digit, ""): Debug.Print ret ret = IsDigitDecimal(Digit, ".123"): Debug.Print ret ret = IsDigitDecimal(Digit, ".1.23"): Debug.Print ret ret = IsDigitDecimal(Digit, "A123"): Debug.Print ret ret = IsDigitDecimal(Digit, "123"): Debug.Print ret ret = IsDigitDecimal(Digit, "123A"): Debug.Print ret ret = IsDigitDecimal(Digit, "-123"): Debug.Print ret ret = IsDigitDecimal(Digit, "123-"): Debug.Print ret ret = IsDigitDecimal(Digit, "1.2.3"): Debug.Print ret ret = IsDigitDecimal(Digit, "-1.2.3"): Debug.Print ret ret = IsDigitDecimal(Digit, "1.23"): Debug.Print ret ret = IsDigitDecimal(Digit, "12.3"): Debug.Print ret ret = IsDigitDecimal(Digit, "123."): Debug.Print ret ret = IsDigitDecimal(Digit, "-1.23"): Debug.Print ret ret = IsDigitDecimal(Digit, "-12.3"): Debug.Print ret ret = IsDigitDecimal(Digit, "-123."): Debug.Print ret ret = IsDigitDecimal(Digit, "-A123"): Debug.Print ret ret = IsDigitDecimal(Digit, "-.123"): Debug.Print ret '符号整数 Debug.Print "Signtest" ret = IsDigitDecimal(Sign, ""): Debug.Print ret ret = IsDigitDecimal(Sign, ".123"): Debug.Print ret ret = IsDigitDecimal(Sign, ".1.23"): Debug.Print ret ret = IsDigitDecimal(Sign, "A123"): Debug.Print ret ret = IsDigitDecimal(Sign, "123"): Debug.Print ret ret = IsDigitDecimal(Sign, "123A"): Debug.Print ret ret = IsDigitDecimal(Sign, "-123"): Debug.Print ret ret = IsDigitDecimal(Sign, "123-"): Debug.Print ret ret = IsDigitDecimal(Sign, "1.2.3"): Debug.Print ret ret = IsDigitDecimal(Sign, "-1.2.3"): Debug.Print ret ret = IsDigitDecimal(Sign, "1.23"): Debug.Print ret ret = IsDigitDecimal(Sign, "12.3"): Debug.Print ret ret = IsDigitDecimal(Sign, "123."): Debug.Print ret ret = IsDigitDecimal(Sign, "-1.23"): Debug.Print ret ret = IsDigitDecimal(Sign, "-12.3"): Debug.Print ret ret = IsDigitDecimal(Sign, "-123."): Debug.Print ret ret = IsDigitDecimal(Sign, "-A123"): Debug.Print ret ret = IsDigitDecimal(Sign, "-.123"): Debug.Print ret '小数 Debug.Print "Decitest" ret = IsDigitDecimal(Deci, ""): Debug.Print ret ret = IsDigitDecimal(Deci, ".123"): Debug.Print ret ret = IsDigitDecimal(Deci, ".1.23"): Debug.Print ret ret = IsDigitDecimal(Deci, "A123"): Debug.Print ret ret = IsDigitDecimal(Deci, "123"): Debug.Print ret ret = IsDigitDecimal(Deci, "123A"): Debug.Print ret ret = IsDigitDecimal(Deci, "-123"): Debug.Print ret ret = IsDigitDecimal(Deci, "123-"): Debug.Print ret ret = IsDigitDecimal(Deci, "1.2.3"): Debug.Print ret ret = IsDigitDecimal(Deci, "-1.2.3"): Debug.Print ret ret = IsDigitDecimal(Deci, "1.23"): Debug.Print ret ret = IsDigitDecimal(Deci, "12.3"): Debug.Print ret ret = IsDigitDecimal(Deci, "123."): Debug.Print ret ret = IsDigitDecimal(Deci, "-1.23"): Debug.Print ret ret = IsDigitDecimal(Deci, "-12.3"): Debug.Print ret ret = IsDigitDecimal(Deci, "-123."): Debug.Print ret ret = IsDigitDecimal(Deci, "-A123"): Debug.Print ret ret = IsDigitDecimal(Deci, "-.123"): Debug.Print ret '符号小数 Debug.Print "SignDecitest" ret = IsDigitDecimal(SignDeci, ""): Debug.Print ret ret = IsDigitDecimal(SignDeci, ".123"): Debug.Print ret ret = IsDigitDecimal(SignDeci, ".1.23"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "A123"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "123"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "123A"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-123"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "123-"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "1.2.3"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-1.2.3"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "1.23"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "12.3"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "123."): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-1.23"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-12.3"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-123."): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-A123"): Debug.Print ret ret = IsDigitDecimal(SignDeci, "-.123"): Debug.Print ret
結果
debugAnswer: digittest False False False False True False False False False False False False False False False False False False Signtest False False False False False False True False False False False False False False False False False False Decitest False False False False False False False False False False True True False False False False False False SignDecitest False False False False False False False False False False False False False True True False False False
それなりにいいかんじ。
123- とか、 .123 とか 123. とか、アメリカ式に許容したい場合は作りかえてね。