Excel (VBA)

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

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

いつもお世話になっております。
連続投稿失礼いたします。
 
正規表現で「0以上1以下」のチェックを行いたいです。
引数「strPattern」に [0]|[0].[\d]+|[1]|[1].[^1-9]+
と指定して引数「varTarget」に…
 
 0
 0.00
 0.0123456789
 0.99999
 1
 1.00
 
などを指定して確認したところ、
以下コードで変数「blnReturn」が「True」になることは確認できました。
 
しかしながら
 
 -1
 1.01
 
を指定しても「True」になってしまいます。
*Falseになってほしい
 
どのように指定したら「0以上1以下」のチェックができるか!?
をご教示くださいませ。
 
よろしくお願いいたします。
 
 
Public Sub funcCheck(ByVal varTarget As Variant, strPattern As String)
  
    Dim objRegExp As New RegExp
    Dim blnReturn As Boolean
  
            With objRegExp
                .Global = True
                .IgnoreCase = True
                .Pattern = strPattern
            End With
  
            blnReturn = objRegExp.Test(curTarget)
            Debug.Print blnReturn
  
End Sub

回答
投稿日時: 25/09/05 15:41:55
投稿者: simple

・IsNumeric関数で数値かどうか判定
・数値なら、数値に変換してから判定する
というのが普通ではないですか?
そもそも正規表現が活躍するケースとも思えません、というのが率直な感想です。

投稿日時: 25/09/05 16:51:29
投稿者: tsusasu

simpleさま
ご回答どうもありがとうございます。
 
おっしゃる通りVBAコードで記述した方が簡単です。
正規表現を使用しなければいけない訳でもありませんし。
 
ただ先ほどの質問にご回答をいただいて、
とても効果を感じましたので、勉強がてら質問させていただきました。
 
このままどなたからもご回答いただけないようであれば
クローズさせていただきます。

回答
投稿日時: 25/09/05 18:23:13
投稿者: sk

引用:
正規表現で「0以上1以下」のチェックを行いたいです。

念のため確認しますが、次のようなケースについては
どのように扱われたいのでしょうか。
 
・"+0"、"-0."、"-0.0" のように正負の符号が付加されているが、
 数値表現において 0 と同等である文字列。
 
・"0,000"、"0,000,000"、"0,001.0000" のようにカンマ区切りされているが、
 数値表現において『0以上1以下』の範囲に含まれる値と同等である文字列。
 
細かいことを言えば、通貨記号の有無なども検討する必要がありそうですが、
ここでは割愛します。

回答
投稿日時: 25/09/05 18:52:56
投稿者: simple

直接の回答は後ほど載せるとして、学習にあたって材料にしているテキストなり
Webの記事を示して貰えますか?

回答
投稿日時: 25/09/05 23:42:43
投稿者: simple

VBScriptに関する原典は下記です。
 
VBScriptの正規表現についてのマニュアル
https://learn.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392149(v=msdn.10)
リファレンス(ここを起点にリンクをたどって下さい)
https://learn.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392403(v=msdn.10)
 
私の勝手仕様に基づくコードを参考までに示します。私はここまでとします。
 

Sub test()
    Dim s$
    s = Join(Array("^0$", "^1$", "^0\.\d+", "^1\.0+$"), "|")
    
    Debug.Assert check("0", s) = True
    Debug.Assert check("0.", s) = False
    Debug.Assert check("0.0", s) = True
    Debug.Assert check("0.00", s) = True
    Debug.Assert check("0.0123456789", s) = True
    Debug.Assert check("0.99999", s) = True
    Debug.Assert check("1", s) = True
    Debug.Assert check("1.", s) = False
    Debug.Assert check("1.00", s) = True
    Debug.Assert check("1.01", s) = False
    Debug.Assert check("-1", s) = False
    Debug.Assert check("-1.0", s) = False
End Sub

Function check(ByVal strTarget As String, strPattern As String) As Boolean
    Dim objRegExp As New RegExp
    With objRegExp
        .Global = True
        .IgnoreCase = True
        .pattern = strPattern
    End With
    check = objRegExp.test(strTarget)
End Function

なお、正規表現自体は大抵の言語で利用可能になっていますので、
学習自体が無駄になることは無いと思いますが、
マイクロソフト社はVBScriptを廃止すると言っています。
このため、VBAで現在のMicrosoft VBScript Regular Expression 5.5は、
ゆくゆくは使えなくなることに留意して下さい。

投稿日時: 25/09/06 02:42:57
投稿者: tsusasu

skさま
ご回答ありがとうございます。
 
チェック対象として想定しているのは割合データで、
負の数のみ接頭に(-)が付きます。
 
Excel上の表記ではカンマ区切りされていますが、
実際にチェックするデータは
 
  正の数なら 0.123、0.999、1.03 など…
  負の数なら -0.1、-1.1、-2 など…
 
になります。
 
繰り返しですが単純にチェックする値が
 
  0以上1以下(それぞれ含む)
 
であればチェックOK(Trueを返す)
上記条件を満たさなければチェックNG(Falseを返す)
というのを ”正規表現で簡単に実現できるのなら” 実装したく質問させていただきました。
 
正規表現については色々なサイトを調べている程度で、
体系的に学んできた訳ではありません。
 
あるサイトにカンマ区切りがあるデータの小数部分を検出するために
 
 ^\s*([.+-0-9]+)\s*,\s*([.+-0-9]+)\s*:\s*(.*)$
 
のようなサンプルがありましたが、今時点ではしっかりと理解できません。
 
今回は正規表現に拘らずVBAコードでチェック関数を作成していきたいと思います。
色々とありがとうございました。
今後もよろしくお願いいたします。

投稿日時: 25/09/06 02:47:23
投稿者: tsusasu

simpleさま
ご回答どうもありがとうございます。
参考リンクもご提示いただき感謝いたします。
 
正規表現について…調べて、自分なりに取り組んでみて、それでもてこずるもの(チェック)
についてはVBAコードで関数作って対応していきたいと思います。
 
お手数をおかけいたしました。
どうもありがとうございました。
今後もよろしくお願いいたします。