Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Microsoft 365)
正規表現を使用してチェックを行いたい
投稿日時: 25/09/05 11:22:39
投稿者: tsusasu

おはようございます。
いつもお世話になっております。
 
参照設定:Microsoft VBScript Regular Expression 5.5
を使用してチェックを行う関数を作成しようと思っております。
*エラートラップ、判定後の処理は未記載。
 
例えば
 
 1.数字のみであること
 2.4桁であること
 3.接頭が0でないこと
 
をチェックしたい場合、引数「strPattern」に 
[1-9]{1}[0-9]{3}
のように指定して引数「curTarget」に「12345」を指定したらTrue判定になりました。
 
[^0]{1}[0-9]{3} なども試しましたが上記3つの条件を満たす判定になりません。
正規表現を使用したことがなかったので苦戦しております。
 
どのように指定すればよいか!?をご教示くださいませ。
よろしくお願いいたします。
 
Public Function funcCheck(ByVal curTarget As Currency, strPattern As String) As Boolean
 
    Dim objRegExp As New RegExp
    Dim blnReturn As Boolean
 
        funcCheck = False
 
            With objRegExp
                .Global = True
                .IgnoreCase = True
                .Pattern = strPattern
            End With
 
            blnReturn = objRegExp.Test(curTarget)
            Debug.Print blnReturn
 
       funcCheck = True
 
End Function

回答
投稿日時: 25/09/05 12:09:35
投稿者: simple

こういうことでしょうか。

Sub test()
    Debug.Assert funcCheck("1234", "^[1-9]\d{3}$") = True
    Debug.Assert funcCheck("12345", "^[1-9]\d{3}$") = False
    Debug.Assert funcCheck("0234", "^[1-9]\d{3}$") = False
End Sub
Public Function funcCheck(ByVal curTarget As Currency, strPattern As String) As Boolean
    Dim objRegExp As New RegExp
    With objRegExp
        .Global = True
        .IgnoreCase = True
        .Pattern = strPattern
    End With
    funcCheck = objRegExp.test(curTarget)
End Function

^ は文字列の先頭にマッチ
$ は文字列の末尾にマッチ
します。
 
なお、Assertionに失敗すると、そこで実行がストップします。
そうでなければ、何も表示はされません。

回答
投稿日時: 25/09/05 12:24:21
投稿者: sk

引用:
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
---------------------------------------------------------------------

投稿日時: 25/09/05 12:35:19
投稿者: tsusasu

simpleさま
ご回答どうもありがとうございます。
 
知りたい内容そのものです。
想定通りの判定、動作確認もできました。
 
他チェックについてもやりたいことがあるのですが、
まず自分で調べながらトライしていきます。
その際、行き詰った時にはまたご教示くださいませ。
 
どうもありがとうございました!