みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelVBAマクロでの正規表現の方法

ExcelVBAマクロについて確認させてください。
下記のように読み込みたいファイルをフォームで指定して
それを変数aに読み込ませています。
変数aから、半角で書かれた括弧つきの数字(1)~(99)またはは全角で書かれた括弧つきの数字
(1)~(99)の文字列を削除したいのですが、例として"(1)"を削除する場合、次のような命令文
a = Replace(a, "(1)", "")のような書き方でもいいのですが、正規表現を使って
もっと効率良い書き方がありますでしょうか。
ぜひご教授下さい。
以上、よろしくお願いします。
----------------------------------
Sub sample()

Dim buf As String
Dim a As String

buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入

With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream'指定したファイルを開く
a = .ReadAll'テキスト文書の内容を文字列aに代入
.Close'指定したファイルを閉じる
End With

End Sub

投稿日時 - 2012-09-11 23:10:23

QNo.7693029

すぐに回答ほしいです

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

こんばんは、こんな感じかな?
buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル")
With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream
  a = .ReadAll
  .Close
End With
With CreateObject("VBScript.RegExp")
  .Pattern = "[((][0-90-9]{1,2}[))]"
  .Global = True
  a = .Replace(a, "")
End With

投稿日時 - 2012-09-12 21:37:43

お礼

ご回答ありがとうございます。
この方法ですと半角、全角関係なく対応出来ました。

今後の参考になりました。
色々とありがとうございます!

投稿日時 - 2012-09-17 00:16:35

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

RegExpオブジェクトを利用しましょう。
Replaceのメソッドがあるので、適正な条件で一発置換が行えます。


Private Function カッコ数字消し(ByVal p_str置換対象文字列 As String) As String
  Dim regObj As Object 'RegExp
  '参照:http://cheb.sakura.ne.jp/gena/blog/archives/2006/03/vb60.html
  
  Set regObj = CreateObject("VBScript.RegExp")
  
  regObj.Pattern = "(\(.\d*\))|(.\d*)"
  regObj.Global = True
  
  Dim l_strRet As String
  l_strRet = regObj.Replace(p_str置換対象文字列, "")
  
  カッコ数字消し = l_strRet
End Function

投稿日時 - 2012-09-12 11:13:31

お礼

ご回答ありがとうございます。
RegExpオブジェクトという便利な機能、初めて知りました!

今後の参考にさせていただきます。
色々とありがとうございました!

投稿日時 - 2012-09-17 00:17:13

ANo.1

中途半端な回答ですみません。最初に謝っときます。
何が中途半端かというと。
(123) や (12)などのように全て半角か全角の場合は変換します。
括弧の両側が半角・全角で揃っていなくても大丈夫。
しかし、括弧の中の数字に半角・全角が混じっていたら見逃してしまいます。
他にも漏れがあるかもしれません。。。

Function ReplaceXX(ByVal aRg As Variant) As String
  Dim oRg As Object
  Dim Match As Object
  Dim Matches As Object
  
  If IsNull(aRg) Then
    ReplaceXX = Null
    Exit Function
  End If
  
  Set oRg = CreateObject("VBScript.RegExp")
  oRg.Pattern = "(\(|\()([1-9][0-9]{0,}|[1-9][0-9]{0,})(\)|\))"
  oRg.Global = True
  Set Matches = oRg.Execute(aRg)
  For Each Match In Matches
    aRg = Replace(aRg, Match.Value, "", compare:=vbTextCompare)
  Next
  ReplaceXX = aRg
  Set oRg = Nothing
End Function

投稿日時 - 2012-09-12 10:36:43

お礼

ご回答ありがとうございます。
実践していただき、ありがとうございます!

RegExpオブジェクトは参考になりました。
色々とありがとうございました!

投稿日時 - 2012-09-17 00:17:57

あなたにオススメの質問