• ベストアンサー

EXCELのマクロで正規表現

EXCELのマクロで正規表現のサイトを色々検索してみましたが ほとんどが,色を変えたり,置換のことしかのっていません 自分がやりたいことはマッチした部分を隣りのセルに移動させる といったことです あいうえお.abcde A1セルに上記の文があった時に正規表現 [a-zA-Z]+ でマッチした部分 (abcde)を B1セルに移動する よろしくお願いします

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

標準モジュールに Sub test01() 'Microsoft VBScipt Regular Expressions 1.0 に参照設定 Set fso = CreateObject("Scripting.FileSystemObject") d = Range("a65536").End(xlUp).Row 'MsgBox d For i = 1 To d j = 6 x = Cells(i, "A") 'MsgBox x Dim re Dim mach Set re = New RegExp re.Pattern = "[a-zA-Z]+" Set matchs = re.Execute(x) For Each mach In matchs ' MsgBox mach.Value Cells(i, j) = mach.Value j = j + 1 Next Next i End Sub 無理に見やすいように結果はF列に表示。j=6を2とかにして。 ーー 例と結果 例 下記の英字文字列はこの場合F列 ああいうXabcdG型は安い.fgh型は高い XabcdG ああYabcdG型は安い.fgh型は高い YabcdG いうZZabcdG型は安い.fgh型は高い ZZabcdG あうQQQXabcdG型は安い.fgh型は高い QQQXabcdG うHUIXabcdG型は安い.fgh型は高い HUIXabcdG あうKXabcdG型は安い.fgh型は高い KXabcdG

nightcrows
質問者

お礼

返信がおそくなりすみません ほとんどの記述を参考にさせてもらいました ありがとうございました

その他の回答 (3)

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

発想の転換が必要です。 [^a-z]で、英字以外を指定することができるので、 英字以外を長さがゼロの文字に置き換えます。 そうすると、英字が残りますので、それを取り出せば、お望みのことができます。

参考URL:
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_regexp.html
nightcrows
質問者

お礼

返信がおそくなりすみません 発想の転換ができていなかったこともあり、やりたいことばかりみていました すごく良いヒント下さってありがとうございます

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

移動ではないですが、正規表現を用いたユーザー定義関数を作成した事があります。 B1セルに、次の式を入れると、ヒットすればabcdeを、しなければ#N/Aを戻します。 =extractAlphabet(A1) スピードは速くはないと思います。 ユーザー定義式のコードは次の通りです。 Function extractAlphabet(targetString As String) As Variant extractAlphabet = subMatchWord(targetString, "([A-z ]+)") End Function Private Function subMatchWord(targetString As String, matchString As String) As Variant Dim regEX As Variant Dim Matches As Variant Dim match As Variant Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = False regEX.Pattern = matchString regEX.ignorecase = True regEX.Global = False On Error GoTo errorHandle Set Matches = regEX.Execute(targetString) If Matches(0).subMatches.Count > 0 Then subMatchWord = Matches(0).subMatches.Item(0) Else subMatchWord = CVErr(xlErrNA) End If Set Matches = Nothing Set regEX = Nothing Exit Function errorHandle: subMatchWord = CVErr(xlErrNA) End Function 実際にA1から、"abcde"を削除したい場合は、ユーザー定義式ではなくて、ループを回す必要がありますが、小改造でいけると思います。

nightcrows
質問者

お礼

返信が遅くなりすみませんでした 今回の件に関しては他の方の回答を参考にしました ありがとうございました

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 正規表現とは言い難いかもしれませんが・・・ 一例です。 元データはA列1行目以降にあるとして、B列に表示させるとします。 (アルファベットのA~zの単なる抜き出しです。) Sub test() Dim i, k As Long Dim str, buf As String Application.ScreenUpdating = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For k = 1 To Len(Cells(i, 1)) str = Mid(Cells(i, 1), k, 1) If str Like "[A-z]" Then buf = buf & str End If Next k Cells(i, 2) = buf buf = "" Next i Application.ScreenUpdating = True End Sub ※ 質問では >マッチした部分を隣りのセルに移動させる とありますので、その場合は↓のコードでマクロを試してみてください。 Sub test2() Dim i, k As Long Dim str, buf As String Application.ScreenUpdating = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row For k = 1 To Len(Cells(i, 1)) str = Mid(Cells(i, 1), k, 1) If str Like "[A-z]" Then buf = buf & str Cells(i, 1) = Replace(Cells(i, 1), str, "*") End If Next k Cells(i, 1) = WorksheetFunction.Substitute(Cells(i, 1), "*", "") Cells(i, 2) = buf buf = "" Next i Application.ScreenUpdating = True End Sub あくまで一例ですので、これがベストだという訳ではありません。m(_ _)m

nightcrows
質問者

お礼

返信が遅くなりすみませんでした 今回の件に関しては他の方の回答を参考にしました ありがとうございました

関連するQ&A

  • 秀丸の正規表現

    秀丸の正規表現 http://pc.dearie.jp/hidemaru/replace/14.html 上記URLでメールの正規表現について解説があります。 [A-Za-z0-9\-\.\_]+@[A-Za-z0-9\-\_]+\.[A-Za-z0-9\-\.\_]+ この正規表現でメールの検索をおこなっています。この正規表現は理解出来ます。 .*([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+)([^a-z0-9@\.\-\_]+).* キャプチャを使って正規表現でメールアドレスをマッチしているのは理解できます。 なぜ置換で、「\1,」とやっても、メールアドレスのみを取得できないのでしょうか? 実際に秀丸エディタを使ってやってみましたが、メールアドレスのみ取得することができませんでした。 検索ではメールアドレスにマッチするのに、なんでキャプチャが正しく動かないのかがわかりません・・・

  • 秀丸での正規表現:複雑な条件を指定する場合

    秀丸エディタの強調表示設定を正規表現を使用して使用しています。 [a-zA-Z][a-zA-Z0-9_]+\s+[a-zA-Z][a-zA-Z0-9_]+ という正規表現でマッチさせたいのですが、else if というケースでもヒットすると思います。これを例外としてマッチさせたくない場合、どういった記述になるのかが思いつきません。直接的な答えでなくてもいいので、何か解法のヒントなどありましたらご指南いただけませんでしょうか。 よろしくお願いいたします

  • 正規表現で行ではなく単語のみをファイル化したい

    正規表現で電話やアドレスを検索するとその行丸々表示されてしまいます。 [例]'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+' [結果] 何々、xx@aa,bb,cc 正規表現の単語部分(何々、を除いた部分)だけを取り出すにはどうすればいいのですか お願いします。

  • メールアドレスの正規表現

    メールアドレスの正規表現 正規表現の勉強をしています。下記のURLのメールアドレスの正規表現の一部が理解できません。 http://hodade.adam.ne.jp/seiki/page.php?s_mail ^[a-zA-Z0-9!$&*.=^`|~#%'+\/?_{}-]+@([a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,4}$ この中の「[a-zA-Z]{2,4}$」の部分がわかりません。 行末が英文字2以上4以下というのは何を表しているのでしょうか? なぜ2以上4以下になるかが理解できません・・・ 宜しくお願いします!!

  • 正規表現

    正規表現の使い方を教えて下さい。 下記のソースでは、oPerl5Util.matchメソッドから戻って来ません。 正規表現文字列が悪いのか それともメソッドの呼び方の手順などが悪いのか 指摘して下さい。 import org.apache.oro.text.perl.Perl5Util; public class clsTestMain {  public clsTestMain() {}  public static void main(String[] args) {   clsTestMain clsTestMain1 = new clsTestMain();   Perl5Util oPerl5Util = new Perl5Util();   String sPattern = "/[0-9a-zA-Z_!#$%&'*+-/=?^`{|}~]+(.[0-9a-zA-Z_!#$%&'*+-/=?^`{|}~]+)*@[0-9a-zA-Z-]+(.[0-9a-zA-Z-]+)*/";   String sTaget = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@.jp";     try {    boolean bResult = oPerl5Util.match(sPattern,sTaget); // ここで処理が止まる    System.out.println(bResult); // ここにも来ない   } catch (Exception oException) {    oException.printStackTrace(); // ここにも来ない   }  } }

    • ベストアンサー
    • Java
  • どなたかこの正規表現を変更してくれませんか?

    正規表現の素人で困っています。 s/(http:\/\/[0-9A-Za-z]+[\-\.\/0-9A-Za-z_~]*[\/0-9A-Za-z]+)([\x80-\x9f\xe0-\xfc].)?/<A HREF="$1">$1<\/A> という正規表現が「引数付きURLの引数部分(?より先)は無視する」 という内容になっていまして、?より先も含めるようにしたいのです。 現状だと以下のURLを例に http://test.japan.com/test.php?d=404861&c=c6 http://test.japan.com/test.php test.phpまでしか拾ってくれません。 どの様に書き換えればいいのでしょうか?

  • 正規表現について

    正規表現で、最初に出てきた条件に合うものだけマッチさせて置換したく、それ以降に条件に合うものがあってもマッチさせたくないのですが、どうすればいいでしょうか? 現在、オプションはつけてないのですが、最後にマッチしたものがとりだされてしまいます。 ---------------------------------------- s/aaa(.*)ccc/$1/; ・・・・・正規表現 ---------------------------- aaabbbccc : : aaadddccc : aaaeeeccc ---------- だと、eeeに置換されるのですが、bbbに置換したいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現

    数字と大文字、小文字のアルファベットは入力OK。 記号も入力OK。でも、記号の中でも「”」、「.」は ダメ。しかも、10桁くらい入力できるようにする。 を表す正規表現は [a-zA-Z0-9&&[\"\.]]* と思ったのですが、 正しく表す正規表現はどの様なものになるのでしょうか? お願いします。

    • ベストアンサー
    • Java
  • Excelで正規表現やワイルドカードなどを使って置換したいのですが…

    Excelの中で置換をしたいのですが、 例えば以下のように( )かっこでくくられた不規則な数字を検索し、その前後に記号を付加するといった具合です。 Wordだと置換で正規表現が使えますが、Excelではやはりマクロを作らないとだめなのでしょうか?  置換前   あいう(123)かきく(あああ)   さしす(ははは)たち(589)つ    ・      ・    ・      ・  置換後   あいう★(123)★かきく(あああ)   さしす(ははは)たち★(589)★つ    ・      ・    ・      ・

  • Excel : タグ付き正規表現による文字置換は可能?

    アクティブセルの文字を、正規表現を利用して文字置換をしたいと考えています。 ただ、単純な文字置換ではなく、正規表現にマッチした文字列を記憶して、 置換後の文字列として呼び出して利用します。 秀丸エディタにあるような「タグ付き正規表現」を利用したいです。 Excelでも同じようなことは可能なのでしょうか? 一例として挙げますと、次のような文字置換です。 ●「?」の後に全角スペース以外の文字がある場合には、「?」の後に全角スペースを1つ入れる。 ●「?」の後に全角スペースが複数続く場合には、「?」の後の全角スペースを1つだけにする。 つまり、★を全角スペースとすると、次のようになります。 あいう?あいう   → あいう?★あいう あいう?★★あいう → あいう?★あいう さらに、一例を挙げますと、 ●「AさんはBさんの友達です」というような文章を、「BさんはAさんの友達です」にする。  つまり、AとBに相当する部分を入れ替える。 よろしくお願いいたします。

専門家に質問してみよう