- ベストアンサー
ExcelでRegExpのFunctionの作成
エクセルVBAで、文字列と正規パターンを引数として渡すと、マッチした文字位置の羅列を","区切りの文字列で返すようなFunctionを作ろうと考えています。なかなかうまく作れなくて困っています。どなたか、詳しいかたいらっしゃいましたら教えて頂けないでしょうか?宜しくお願いいたします。 発生する実行時エラー 実行時エラー'5020': 'Execute'メソッドは失敗しました:'IRegExp2'オブジェクト 追伸:ネットで、自動作成してくれるサイトがありそのコードを参考にアレンジしました。つじつまが合わない部分は、私の改編によるものだと思います。 Function Get_Position_RegExp(MySource As String, MyPattern As String) As Variant Dim MyReg As RegExp Dim MyMatch As MatchCollection Dim i As Match Set MyReg = CreateObject("VBScript.RegExp") With MyReg .Pattern = MyPattern .Global = True Set MyMatch = .Execute(MySource) End With Get_Position_RegExp = "" For Each i In MyMatch Get_Position_RegExp = Get_Position_RegExp & "," & i.FirstIndex + 1 Next Set MyMatch = Nothing Set MyReg = Nothing End Function
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Function プロシージャに致命的なエラーはありません。#1 ご回答のように マッチパターン(MyPattern)の指定に誤りがあるようですね。 細かな部分を若干修正してみました。ご参考までに。 Sub TestProc() Dim s As String s = Get_Position_RegExp("RegExpテスト。RegExpでマッチ位置を調べる。", _ "RegExp") MsgBox s End Sub ' // MyPattern にマッチする位置をカンマ区切りの文字列で返す Function Get_Position_RegExp( _ ByVal MySource As String, _ ByVal MyPattern As String _ ) As String Dim MyReg As RegExp Dim MyMatch As MatchCollection Dim i As Match Dim s As String Set MyReg = CreateObject("VBScript.RegExp") With MyReg .Pattern = MyPattern .IgnoreCase = False ' 大文字・小文字を区別しない .Global = True Set MyMatch = .Execute(MySource) End With If MyMatch.Count > 0 Then For Each i In MyMatch ' // カンマは後ろにつける s = s & CStr(i.FirstIndex + 1) & "," Next ' // 末尾の余計なカンマを落とす Get_Position_RegExp = Left$(s, Len(s) - 1) End If Set MyMatch = Nothing Set MyReg = Nothing End Function
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >実行時エラー'5020': >'Execute'メソッドは失敗しました:'IRegExp2'オブジェクト それは、パターンの書き方を間違えているのですね。
お礼
ご指摘の通り、パターンを間違えていました。 Instr関数だけでは、効率よくヒットできないので、正規表現の併設としました。ありがとうございました。
お礼
丁寧な回答ありがとうございます。 パターンを調べたところ、ご指摘の通り間違いがありました。 その上、至らない部分を修正までして頂き大変助かります。 何が、至らなかったのか?なぜ、カンマは後につけるのか?などその意味についてじっくりと考えていきたいと思います。本当にありがとうございました。