• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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

vba_minarai
質問者

お礼

丁寧な回答ありがとうございます。 パターンを調べたところ、ご指摘の通り間違いがありました。 その上、至らない部分を修正までして頂き大変助かります。 何が、至らなかったのか?なぜ、カンマは後につけるのか?などその意味についてじっくりと考えていきたいと思います。本当にありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >実行時エラー'5020': >'Execute'メソッドは失敗しました:'IRegExp2'オブジェクト それは、パターンの書き方を間違えているのですね。

vba_minarai
質問者

お礼

ご指摘の通り、パターンを間違えていました。 Instr関数だけでは、効率よくヒットできないので、正規表現の併設としました。ありがとうございました。

関連するQ&A

専門家に質問してみよう