• ベストアンサー

EXCELマクロ

EXCELで、以下3つの条件によるシートよりの文字抽出をしたいのですが、どのようにすればいいか教えて下さい。 1、XXX出張所名を抽出(事業部、営業所より優先。部は無視) 2、XXX営業所名を抽出(出張所が付かない場合。事業部より優先。部は無視) 3、XXX事業部名を抽出(出張所、営業所が付かない場合。部は無視) <シート記載例文>コンマでセルが横に分かれる XXX事業部、 XXX部 XXX事業部、 XXX営業所 XXX事業部、 XXX営業所、XXX出張所

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

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

#2です。 ???? エクセルではマクロ=VBAです。 アクセスではマクロとVBAは別物ですが。 補足をみると「関数」でとのご希望の様ですので、このご質問は閉じて、改めて質問される事をお勧めします。 関数の達人の皆様がスルーしてしまうかもしれません。

その他の回答 (3)

回答No.4

人によっては、「マクロの記録」で作るのがマクロで、VBA は VBA だと思っている場合もあるのかもしれませんが……。 実際は No.3 さんのおっしゃるとおり、Excel において、マクロと VBA は同じことだと考えていただいて結構です。マクロという機能の内容を記述する言語が VBA だということです。 Excel 4.0 マクロという VBA によらないマクロも残っていないこともないですが、もはや殆ど使われていないと言えるでしょう。 「マクロの記録」を実行すると、行った操作に相当する VBA の記述が記録されるのです。作ったマクロを実行するというのは、この記録された VBA コードを実行するということです。 簡単な操作だけなら「マクロの記録」だけで十分な場合もありますが、難しいことをしようとするほど、コードを編集できる能力が必要になります。ちょっとだけ難しいことをしたいという場合であれば、「マクロの記録」で書かれたコードをちょっとだけ手直しするだけで済むかもしれません。とても難しいことをするには、深い知識が必要です。

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

久しぶりに正規表現をやってみました。 シート構造が不明ですし、「抽出」という意味が何をなさりたいのかはっきりしませんが、とりあえずシート内の全てのセルを対象にして、該当する情報を抜き出すという内容のコードです。 コンマ「、」が本当は半角という場合は、修正が必要です。 <元データ> XXX1事業部、 XXX部 XXX2事業部、 XXX1営業所 XXX3事業部、 XXX2営業所、 XXX3出張所 YYY1事業部、 YYY部 YYY2事業部、 YYY1営業所 YYY3事業部、 YYY2営業所、 YYY3出張所 ZZZ1事業部、 ZZZ部 ZZZ2事業部、 ZZZ1営業所 ZZZ2事業部、 ZZZ2営業所、 ZZZ3出張所 <抽出結果> XXX3出張所 YYY3出張所 ZZZ3出張所 XXX1営業所 YYY1営業所 ZZZ1営業所 XXX1事業部 YYY1事業部 ZZZ1事業部 Sub test() Dim regEx As Variant, Matches As Variant Dim buf As Variant Dim i As Long, j As Long 'ActiveSheetの使用しているセル範囲を配列に取込 buf = ActiveSheet.UsedRange.Value Set regEx = CreateObject("VBScript.RegExp") '初期設定 With regEx regEx.MultiLine = False regEx.IgnoreCase = True '大文字小文字を区別しない regEx.Global = True '複数マッチすればすべて対象 End With '出張所を含む文字列の、直前の「、」から出張所までを抽出 regEx.Pattern = ".+、(.+出張所)" For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) Set Matches = regEx.Execute(buf(i, j)) If Matches.Count > 0 Then Debug.Print Trim(Matches(0).submatches.Item(0)) End If Next j Next i '営業所で終わる文字列の、、直前の「、」から営業所までを抽出 regEx.Pattern = ".+、(.+営業所$)" For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) Set Matches = regEx.Execute(buf(i, j)) If Matches.Count > 0 Then Debug.Print Trim(Matches(0).submatches.Item(0)) End If Next j Next i ’部で終わる文字列の、~事業部の部分を抽出 regEx.Pattern = "(.+事業部).+部$" For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) Set Matches = regEx.Execute(buf(i, j)) If Matches.Count > 0 Then Debug.Print Trim(Matches(0).submatches.Item(0)) End If Next j Next i Set Matches = Nothing Set regEx = Nothing End Sub 「VBA 正規表現」でWeb検索してみて下さい。沢山ヒットします。下記は一例。 http://codezine.jp/article/detail/1655

chibuchan
質問者

お礼

詳細回答を頂き、ありがとうございます。 しかし、VBAとなると私の理解を超えてました・・・ 言葉足らずですみません。 <シート記載例文>を範囲指定し、VLOCKUPやIF関数を用いて、1,2,3の条件による抽出した名称を任意の列に表示させたいと思っております。

回答No.1

InStr、Left、Mid、Right 関数で文字列をちぎって、隣の列あたりに書き出してみては?関数の仕様は、VBE 画面でヘルプ(キーボードの F1 キー)を見てください。

chibuchan
質問者

お礼

回答ありがとうございます。 しかし、VBEとなると私の理解を超えてますので、これからの学習課題にしてみます。

関連するQ&A