VBAで改行の入ったデータの正規表現について
- VBAで複数行のデータの一部を抜き出す際、改行がついてしまう問題について解決方法を教えてください。
- 質問者はVBAで複数行のデータの一部を抜き出そうとしていますが、抜き出したデータの先頭に改行がついてしまう状況です。
- 正規表現を使用してデータを抜き出す際に、改行を無視する方法が知りたいです。
- ベストアンサー
VBAで改行の入ったデータの正規表現について
vbaで複数行のデータの一部を抜き出そうと思っています。 下記のようにすると、抜き出したデータの先頭に改行がついてしまいます。 何かいい方法はないでしょうか。 data = "start" & vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end" Set re = New RegExp re.Pattern = "start((.|\n)*?)end" re.MultiLine = True Set mc = re.Execute(data) For i = 0 To mc.Count - 1 MsgBox m.SubMatches(0) Next i 上記を実行すると vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf となってしまいます。 ”ABC”から抜き出す場合、正規表現をどう書けばいいのでしょうか。 よろしくお願いします。
- a-z_A-Z
- お礼率85% (222/260)
- オフィス系ソフト
- 回答数2
- ありがとう数8
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 vbCrLfを表すパターンは、 \r\n です。 Sub Re8780307() Dim re As VBScript_RegExp_55.RegExp Dim mc As VBScript_RegExp_55.MatchCollection Dim m As VBScript_RegExp_55.Match Dim Data Data = "start" & vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end" & vbCrLf & _ "start" & vbCrLf & "JKL" & vbCrLf & "MNO" & vbCrLf & "PQR" & vbCrLf & "end" Set re = New RegExp re.Global = True re.MultiLine = True re.Pattern = "start(\r\n((.|\r\n)*?)\r\n)end" Set mc = re.Execute(Data) For Each m In mc Debug.Print "■"; m.SubMatches(1); "■" Next End Sub みたいなことをなさりたいのでは?
その他の回答 (1)
- Gotthold
- ベストアンサー率47% (396/832)
> re.Pattern = "start((.|\n)*?)end" ここでstartの後の改行をかっこの外に出しておくべきなのでは? re.Pattern = "start\n((.|\n)*?)end"
お礼
ありがとうございます。 今回、質問に書いたプログラムと、実際のプログラムは少し違います。 プログラムの一部を、簡略化しています。 実際は、正規表現でマッチしたのを、分割してコレクションに入れています。 その分割したデータを、再分割するところのプログラムが、今回質問したところです。 そこでは、なぜか正規表現がうまくマッチしません。 >re.Pattern = "start\n((.|\n)*?)end" これも試してみましたが、startの文字を入れるとマッチしなくなります。 どうも、コレクションの挙動がおかしいので、その辺から見直してみます。 ありがとうございました。
関連するQ&A
- 【VBA】【正規表現】
23歳OLです。 VBAと正規表現についての質問です。 ▼やりたいこと ================================================ 1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09 という数列から 1234567890 という数字のみを抜き出したいです。 正確には2本目の|と3本目の|の間に入っている様々な数字です。 ※桁数が固定されていません。 ================================================ ▼実際書いたコード ================================================ Sub Sample2() Dim RE, strPattern As String, i As Long, msg As String, reMatch Set RE = CreateObject("VBScript.RegExp") strPattern = "☆この部分☆" With RE .Pattern = strPattern .IgnoreCase = True .Global = True For i = 1 To 10 Set reMatch = .Execute(Cells(i, 1)) If reMatch.Count > 0 Then msg = msg & reMatch(0).Value & vbCrLf End If Next i End With MsgBox msg Set reMatch = Nothing Set RE = Nothing End Sub ================================================ ☆この部分に☆に何を入れればよいでしょう? ご指導よろしくおねがいします。
- ベストアンサー
- Visual Basic
- vbaで正規表現
正規表現のコードなんですが、 上手く動きません。 何故でしょうか… Sub Test() Dim reg As Object Dim ans As Object Dim c As Range Set reg = CreateObject("VBScript.RegExp") For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp)) With reg .Pattern = "^【[(1)-(20)](\d*/\d*)" Set ans = .Execute(c.Value) End With If ans > 0 Then If Len(ans(0).submatches(0)) > 0 Then Debug.Print c.Address & "|" & ans(0).submatches(0) End If End If Next End Sub
- 締切済み
- Visual Basic
- ExcelのVBAの正規表現で二重引用符を含む文字列を検索できるようにしたい
二重引用符を含む文字列を検索できるようにするには 下記の記述の re.Pattern = "<hr class=\"separate\">" の部分をどのように直せばよいのでしょうか? Sub tagCount() Dim cnt As Integer Dim IE As Object Dim HTML As String Set IE = CreateObject("InternetExplorer.Application") IE.Navigate ("http://www.yahoo.co.jp/") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend HTML = IE.Document.body.innerHTML IE.Quit Dim re As RegExp Dim mc As MatchCollection Dim m As Match Set re = New RegExp re.Pattern = "<hr class=\"separate\">" re.Global = True re.IgnoreCase = True Set mc = re.Execute(HTML) MsgBox mc.Count End Sub ご存知の方がおられましたらご回答をよろしくお願いします。 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003
- ベストアンサー
- オフィス系ソフト
- これは正規表現とは言えないでしょうか?
正規表現を勉強しようと思っているのですが まずはじめに確認させて下さい。VBAです。 Sub 正規表現() If a Like "*a*" Then End If End Sub は正規表現とは言えないでしょうか? *を使っているからそう思いました。 Dim re As RegExp Set re = New RegExp を使わないと、正規表現といえないのでしょうか? よろしくお願い致します。
- ベストアンサー
- Visual Basic
- 正規表現について
ExcelにてVBScriptの正規表現を使用していますが、 理解できないところがあるので、教えてください 1.EXCEL VBAにて下記のコードがあります Sub Sample2() Const strCHK As String = "000AAA111BBB2222BBB333" Dim RE, strPattern As String, i As Long, msg As String, reMatch, Item Set RE = CreateObject("VBScript.RegExp") strPattern = "AAA.+bbb" With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set reMatch = .Execute(strCHK) For Each Item In reMatch Debug.Print Item.Value & " FirstIndex→" & Item.FirstIndex & " Length→" & Item.Length Next End With Set reMatch = Nothing Set RE = Nothing End Sub 2.上記を動作させると、イミディエイトに下記が出力されます AAA111BBB2222BBB FirstIndex→3 Length→16 3.疑問 strPattern = "AAA.+bbb"にて検索しているのに、 AAA111BBBが表示されないのは、何故なのでしょうか? よろしくお願いします
- ベストアンサー
- その他MS Office製品
- VBA改行について
Sub 改行() MsgBox "a" & vbCr & "i" MsgBox "a" & Chr(13) & "i" MsgBox "a" & vbLf & "i" MsgBox "a" & Chr(10) & "i" MsgBox "a" & vbCrLf & "i" MsgBox "a" & vbNewLine & "i" MsgBox "a" & Chr(13) + Chr(10) & "i" End Sub 上記のコードを実行すると、すべて改行できますが、 どれが正しい、一般的な改行のコードなのでしょうか? どれも正解だとは思いますが、 企業でプログラムを作る際、 どの改行のコードを使うのか知りたいです。 よろしくお願い致します。
- ベストアンサー
- Visual Basic
- VBS正規表現の方法
教えてください。 <内容> VBSにてメールアドレスチェックをしているのですが、うまくいきません。 <仕様> アカウント 大文字不可。 ドメイン 大文字不可。 最後は英文字で終わる。 .(ドット)とかで終わりにしない。 <ソース> Set objRE = New RegExp objRE.Global = True objRE.IgnoreCase = False objRE.Pattern = "([0-9a-z_\.+-]*)(@?)([0-9a-z-\.]*)([a-z]+)" Set Matches = objRE.Execute(mstrMailValue) Set objSM = Matches(0) mAccount = objSM.SubMatches(0) mAtmark = objSM.SubMatches(1) mDomain = objSM.SubMatches(2) & objSM.SubMatches(3) MsgBox (mAccount & mAtmark & mDomain) If (mAtmark <> "@") Then MailChk = False Else If (Len(mAccount) < 1) Or (Len(mAccount) >= 80) Then MailChk = False Else If (Len(mDomain) <= 3) Or (Len(mDomain) >= 63) Then MailChk = False Else If (mAccount & mAtmark & mDomain) <> mstrMailValue Then MailChk = False Else MailChk = True End If End If End If End If objRE.Patternがうまくいっていないと思います。 全て数値にすると、エラー(VBSがストップ)する。 どなたか教えてくださいませ。m(-_-)m 上記のソースよりも他の手があれば教えてください。
- ベストアンサー
- Visual Basic
- VBAで正規表現を使った置き換え
”KFEGYKLNI"のような長い文字列の文字の間に".*"を入れて"K.*F.*E.*G.*Y.*K.*L.*N.*I”のような検索パターンを作りたいのですが".*"を簡単に入れる方法を教えてください。 excel2003を使っています。 Set re = CreateObject("VBScript.RegExp") re.replace("s//\.\*/g","KFEGYKLNI") としてみましたがうまくいきません。 またhelpをどのような語句で検索したよいのでしょうか
- ベストアンサー
- オフィス系ソフト
- VBAの正規表現について (エクセル)
正規表現は苦手なもので、すみませんが教えてください。 下のサンプルで、マッチングに "[(|(].*?[)|)]$"を指定すれば、最後から最短の()内を取得できるものと期待していましたが、実行してみると最短の「(c)」ではなく「(a)x(b)y(c)」がマッチしてしまうようです。 $を除いて"[(|(].*?[)|)]"と"[(|(].*[)|)]"で実行してみると、ちゃんと違いがあるのですが… $をつけた場合で最短の表記方法は、どのようにすればよいのでしょうか? Sub sample() Dim RegE, RegMc Dim str1 As String, str2 As String Set RegE = CreateObject("VBScript.RegExp") str1 = "test(a)x(b)y(c)" str2 = "" RegE.Pattern = "[(|(].*?[)|)]$" Set RegMc = RegE.Execute(str1) If RegMc.Count > 0 Then str2 = RegMc(0).Value str1 = RegE.Replace(str1, "") End If MsgBox (str1 & vbLf & str2) End Sub
- ベストアンサー
- オフィス系ソフト
- vbaでの正規表現について教えてください
「セルに入ってる値が数値ならA列からE列まで赤色にする」 を正規表現で行いたいのですがよくわかりません。 http://officetanaka.net/excel/vba/tips/tips38.htm を参考にしているのですが Sub Sample1() Dim RE, strPattern As String, r As Range Set RE = CreateObject("VBScript.RegExp") strPattern = "SUM\(" With RE .Pattern = strPattern ''検索パターンを設定 .IgnoreCase = True ''大文字と小文字を区別しない .Global = True ''文字列全体を検索 For Each r In ActiveSheet.UsedRange If .test(r.Formula) Then r.Interior.ColorIndex = 3 Next r End With Set RE = Nothing End Sub を、どう改造すれば、私のやりたい事になるのでしょうか? 【1】 まずstrPattern で、「数値ならば」はどうやればいいでしょうか? 【2】 次にtest(r.Formula)は、数式だからFormulaを使ってるのですよね? 数値を検索する場合はFormulaを何に変えればいいでしょうか? 【3】 最後に、 r.Interior.ColorIndex = 3はそのセルだけの色を変えるのですよね? A列からE列までにするにはどうすればいいでしょうか? 例えば A3セルに「1」が、A6セルに「3」が入っていたら、 A列からE列まで赤色にしたいです。
- ベストアンサー
- オフィス系ソフト
お礼
ありがとうございます。 すっかり、「¥r」の存在を忘れていました。 たぶん、これでスッキリ解決だと思います。 今からテストしてみます。