引用:
funcCheck = True
・まず、関数の戻り値として
無条件で True を返すようにしているのが
第 1 の原因である。
引用:
1.数字のみであること
2.4桁であること
3.接頭が0でないこと
引用:
Public Function funcCheck(ByVal curTarget As Currency, strPattern As String) As Boolean
・Currency (通貨)型の変数/引数に "0123" という文字列を渡した場合、
暗黙的な型変換によって 123 という数値データに変換される。
引用:
blnReturn = objRegExp.Test(curTarget)
Debug.Print blnReturn
・Test メソッドの引数 sourceString のデータ型は String 型である。
・String 型の変数/引数に 123 という数値データを渡した場合、
暗黙的な型変換によって "123" という文字列データに変換される。
・つまり、「先頭の文字が "0" である 4 桁の数字」( "0123" )が
「先頭の文字が "0" ではない 3 桁の数字」( "123" )として評価されたり、
「先頭の文字が "0" である 5 桁の数字」( "01234" )が
「先頭の文字が "0" ではない 4 桁の数字」( "1234" )として評価されたりする
ケースが発生することになる。
・したがって、引数 curTarget のデータ型が String 型ではなく
Currency 型として宣言されていることが第 2 の原因である。
引用:
引数「strPattern」に
[1-9]{1}[0-9]{3}
のように指定して引数「curTarget」に「12345」を指定したらTrue判定になりました。
・Test メソッドは、Pattern プロパティに渡されたパターンと一致している文字列が
引数 sourceString に渡された文字列の中に
含まれているか否かを返す機能である。
・引数 sourceString に渡された "12345" のうち、"1234" が
上記のパターンを満たしているため、Test メソッドは True を返す。
・前方一致方式で検索したいのであれば、メタ文字 ^ を使用すべきである。
・後方一致方式で検索したいのであれば、メタ文字 $ を使用すべきである。
・完全一致方式で検索したいのであれば、その両方を使用するべきである。
---------------------------------------------------------------------
Private Sub Test1()
Dim strPattern As String
strPattern = "
^[1-9]{1}[0-9]{3}
$"
Dim varArray As Variant
varArray = Array("12345", "01234", "0123", "1234", "012", "123")
Dim varItem As Variant
For Each varItem In varArray
Debug.Print varItem & " -> " & funcCheck(varItem, strPattern)
Next
End Sub
Public Function funcCheck(ByVal
strTarget As String, strPattern As String) As Boolean
Dim objRegExp As New RegExp
funcCheck = False
With objRegExp
.Global = True
.IgnoreCase = True
.Pattern = strPattern
End With
funcCheck = objRegExp.Test(strTarget)
End Function
---------------------------------------------------------------------