電子書籍の厳選無料作品が豊富!

動作環境:
Windows10
EXCEL 2016 VBA
Microsoft VBScript regular Expressions 5.5 参照設定
===============
上記環境で
正規表現で文字列の存在を確認する場合
文字列 myStr = "{(a+b+c),d}"
の中に、文字パターン myPtn = ",d}"の存在を確認する例として、
===
Sub 正規EXP_tst()
Dim myStr As String
Dim myPtn As String

myStr = "{(a+b+c),d}" ’対象文字列

myPtn = ",d}" '存在を確認したい文字パターン

Debug.Print RegExpExists(myPtn, myStr)

End Sub

Function RegExpExists(myPtn As String, myStr As String)
'Microsoft VBScript Regular Expressions 5.5 参照設定
Dim myRegExp As VBScript_RegExp_55.RegExp
Dim myMatchClc As VBScript_RegExp_55.MatchCollection
Dim myMatch As VBScript_RegExp_55.Match
Set myRegExp = New VBScript_RegExp_55.RegExp
With myRegExp
.Pattern = myPtn 'パターンの設定
.IgnoreCase = True '大文字と小文字を区別しない
.Global = True '文字列全体を検索
RegExpExists = .Test(myStr)
End With
Set myMatchClc = Nothing 'オブジェクトの解放
Set myMatch = Nothing
Set myRegExp = Nothing
End Function
===
を実行すれば、イミディエイト画面にはTrueを表示し、対象文字列に",d}”の文字パターンが記されていることを確認できます。
文字パターン種類がいくつかありまた、未次自体もd以外のA1セルに入力した文字を確認したい時、
w1 = Range("A1")
Range("A2")に "," & w1 & "}"と入力し
myPtn = Range("A2")
と変数に入力して実行すれば良いはずです。
Range("A1")にdを入力すれば、myPtn = ",d}"
となるので、d以外の文字列記載の確認も可能なはずです。ところが、
===
Sub 正規EXP_tst()
'Microsoft VBScript Regular Expressions 5.5 参照設定
Dim myStr As String
Dim myPtn As String
Dim w1 As String
Dim p1 As String

w1 = Range("A1").Value ’ dを入力
p1 = Range("A2").Value ’ "," & w1 & "}"を入力

myStr = "{(a+b+c),d}"
myPtn = p1 'パターンを指定する

Debug.Print RegExpExists(myPtn, myStr)
End Sub
===
を実行するとイミディエイト画面にはFalseを表示して存在しないことになります。すなわちタターンを検出しません。
ウオッチウインドウで確認すると、
w1は、入力した文字dを表示します。
p1は、入力したパターン "," & w1 & "}"をそのまま表示します。",d}"が表示されると思っていましたが、w1のままでした。
実行時にw1として入力したdに置き換わと思っていたのですが、
実行結果がFalseであることから置換処理は実行されていないようです。
正規表現のパターン表現を変数を含んだパターンとして実行する方法があれば教えて下さい。

A 回答 (1件)

>p1 = Range("A2").Value



p1が『セルの値』を代入されるから

>p1は、入力したパターン "," & w1 & "}"をそのまま表示します

になりますよ。

少なくともセルA2に ="," & A1 & "}" と『数式』を入れておき

'w1 = Range("A1").Value ’ dを入力 ・・・不要
p1 = Range("A2").Value ’ 数式の結果を代入

なら出来ると思いますけど?(検証はしてません)

セルA2に必要性がわからないですが

w1 = Range("A1").Value ’ dを入力
p1 = "," & w1 & "}"
Range("A2").Value = p1

でも良いのかもしれません。
    • good
    • 0
この回答へのお礼

多量の文字列を対象として、特定の文字(w1)を、
複数の表示パターン(p1)で表示した文字列を識別するプログラムを組んでいます。
w1、p1はともに表にしているので質問時はRange("A1")、Range("A2")としています。
全ての文字w1が各々p1のパターンで表現されていることを判定するためにFor Each w1 In Range("A"),
For Each p1 In Range("A2")で全組み合わせのチェックを実行します。
例えば、パターンは
"," & w1 & "}"
"," & w1 & "\)"
"\*" & w1 & "}"
"\*" & w1 & "\)"
"," & w1 & "\/"
"\*" & w1 & "/"
"," & w1 & "\*"
"\+" & w1 & "/"
"\+" & w1 & "\*"
の形式で、
w1は専門用語リストです。
多量の文字列は専門書(技術論文)です。
質問のため簡略にしたつもりですが、イメージを伝えないままの質問は失礼になると思い追加記述としました。
VBAを勉強して3か月です。これが初めてのプログラムなのですが、何とか使えそうになっています。
最後の機能実装で前に進まなくなったので質問しました。
即、回答いただきイメージが出来ましたので早速作業を進めることが出来そうです。この休日で解決できそうです。
ありがとうございました。深謝です。

お礼日時:2017/08/26 10:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!