不規則なフォーマットのメール内容をエクセルに抽出したいのですが、どなたかお教えいただけませんでしょうか。
小さな会社でメール問い合わせの受付をしています。
現在はポータルサイト経由で来たメールの内容をエクセルの表に転記しているのですが、
以前から使っていたポータルからのメールはフォーマットが決まっているため、メール本文から必要なところをコピーし、決まったセルにそのまま貼り付け、MID関数やLENを使って名前や住所など、必要な情報を別の場所に抜き出し、それを自動マクロを駆使して別のワークシートにある表にコピーする方法で何とか自動化することができていました。
ところが、最近加入したポータル経由の問い合わせメールは、項目の上から順に入力のあったところだけが表示されていて行数がバラバラなので、上記の方法が使えません。
例1)
問い合わせ番号:0000001
お名前:○山○子
メールアドレス:aaa@aaa.com
詳しい内容:掲載の商品について教えて欲しいのですが
一番気になるのは写真が掲載されているもので、2番目
に気になるのは価格が一番安いものです。
どの商品が一番人気か教えてもらえませんか?
ご希望の連絡方法:メール
年代・性別:30代女性
例2)
問い合わせ番号:0000002
お名前:△原△雄
お電話番号:00000000000
FAX番号:0000000000
メールアドレス:bbb@bbb.co.jp
住所:大阪府***********
詳しい内容:商品がすぐ欲しいので一度電話で連絡ください
ご希望の連絡方法:電話
ご希望の商品:********
年代・性別:40代男性
といった感じで、「問い合わせ番号」と「お名前」「詳しい内容」以外は
項目があったり無かったりして、行数も場所も定まりません。
さらに「詳しい内容」の欄は文字数が決まっていないため、
何行にもわたる場合があります。
現在は1項目ごとにコピぺでエクセルの表に転記しているのですが、とても大変なのと、ミスをしそうで怖いので、なんとかVBAを使ってエクセルへ取り込みたいのです。
しかしなにぶん自動マクロを駆使する程度のスキルのため、どうすればいいのかさっぱりわかりません。
どなたか良い方法をお教えいただけませんでしょうか。
No.2ベストアンサー
- 回答日時:
こんにちは
セルの位置などの具体的な内容がほしかったのですが、位置関係が分からないので、以下のマクロを加工してくださるようにお願いします。パターンは、定型句を使っていることが条件ですから、それが違っているとヒットしません。また、こちらは、Goo 側から回答していますので、半角和字が使用できませんので、代用のワイルドカードの文字(.)を使っています。例えば、年代・性別の間の、中黒点は全角でも半角でもヒットするように作られています。
Sheet1 のA1 に貼り付けたものを、Sheet2 のA1 に別けて貼りつけます。
なお、「問い合わせ番号」は、0も取れていますが、貼付けの際に「数値」に変わってしまうので、0がなくなってしまいます。書式の文字列にしてください。それができないなら、マクロで処理します。
この文字列を取得するマクロは、慣れている人なら簡単ですが、いくつかのポイントの勉強が必要になります。
'-------------------------------------------
Sub PickUpData()
Dim Patterns(8) As String
Dim Datas(8) As String
Dim Matches As Object
Dim c As Range
Dim i As Variant
Dim buf As String
Dim sh As Worksheet
Set sh = Worksheets("Sheet1")
'パターン群
Patterns(0) = "問い合わせ番号:(\d+)"
Patterns(1) = "お名前.(.+)$"
Patterns(2) = "詳しい内容.(.+)$"
Patterns(3) = "お電話番号.([\d\-]+)$"
Patterns(4) = "メールアドレス.(.+)$"
Patterns(5) = "住所.(.+)$"
Patterns(6) = "ご希望の連絡方法.(.+)$"
Patterns(7) = "ご希望の商品.(.+)$"
Patterns(8) = "年代.性別.(.+)$"
With CreateObject("VBScript.RegExp")
Application.ScreenUpdating = False
For i = 0 To UBound(Patterns)
.Pattern = Patterns(i)
.Global = False
For Each c In sh.Range("A1", sh.Range("A18"))
If c.Value <> "" Then
Set Matches = .Execute(c.Text)
If Matches.Count > 0 Then
If i = 2 Then
buf = Matches(0).SubMatches(0)
buf = buf & vbLf & CombineText(c)
Datas(i) = buf
Else
Datas(i) = Matches(0).SubMatches(0)
Exit For
End If
End If
End If
Next c
Next i
Application.ScreenUpdating = True
End With
'貼付け先
Worksheets("Sheet2").Range("A1").Resize(9).Value = Application.Transpose(Datas)
Set sh = Nothing
End Sub
Function CombineText(c As Range)
Dim j As Long
Dim buf As String
With ActiveSheet
For j = 1 To Cells(c.Rows.Count, c.Column).End(xlUp).Row
buf = buf & vbLf & c.Offset(1).Text
Next j
End With
CombineText = buf
End Function
No.1
- 回答日時:
こんにちは。
何も分からないままに読んでいると、まず、例 1)のようなスタイルが問題だとおっしゃっているのですか?例2)も問題だとおっしゃっているのですか?本来、こうあるべきだというフォーマット(書式)で、マクロを動かしているのが、マクロが働かないということなのでしょうか?
実際に、関数やマクロを見せていただいたほうが早いと思います。
実際に、自動化マクロにするためには、どのようにしてよいのか、こちらからでは分からないのです。ボータルから入ってきたデータを、次に、どのようにしていくのか分かりません。コピペと書いてあるのですが、ペースト側の貼り付けのシートやセルの位置などはどうなっているのでしょうか?
>「問い合わせ番号」と「お名前」「詳しい内容」以外は
>項目があったり無かったりして、行数も場所も定まりません。
どのようにしたらよいのか、肝心な点が分からないので、今のところは手が付けられません。ある程度VBAが分かる方なら、こういう場合は、配列変数にして、項目の受け皿を用意して、後は正規表現で、検索して代入すればよいだろうというアドバイスだけで済みますが、たぶん、それでは理解されないと思います。
この回答への補足
ご回答ありがとうございます。
書き方がまずくてすみません。
>例1)のようなスタイルが問題だとおっしゃっているのですか?
>例2)も問題だとおっしゃっているのですか?
これはまず例1)と例2)が混在している事が問題と感じています。
従来から使っているものは、
氏名:****
メールアドレス:****
電話番号:****
・
・
・
問い合わせ内容:****
という順番が固定しており、空白があっても項目数・・・つまり行数は変わらないので、
メール本文の必要な部分をコピーし、エクセルの決まったセルに貼り付けると、決まった行に決まった項目が入ります。
そこからMID関数などで「氏名:」「メールアドレス:」を省いたものを、別シートに作った一番上の列がタイトル行になっている、よくある一覧表の下にマクロで貼り付けています。
(問い合わせ内容はこちらも文字数不定ですが、一番下なので、そこだけ別にコピーをして特定のセルへ貼り付けています。)
しかしその方法では決まった行に決まった項目が入らないと使えませんので、どうすればいいのか分からず、新しい方のメールはまだマクロを組んでおりません。
現在は従来のものとは別シートで、同じように一番上の列がタイトル行の表を作り、下に名前やメールアドレスなどの項目を一つずつ手作業で貼り付けています。
このような説明でお分かりいただけますでしょうか。
実はVBAも勉強しようと思って独学で取り組んではみたのですが、まず基礎すらあいまいな状態では配列がどうしても理解できないのと、エラー処理、繰り返し処理など、勉強しなければいけないことが山ほどあるようで挫折してしまい、ここに投稿させていただいたのです。時間をかけて学んで行くにしてもハードルが高すぎて、今実務で必要なものを作るには間に合わないのです。
どうかお助けくださいますようお願い致します。
御礼が遅くなり申し訳ありません!
こちらがあいまいな表現でお伝えしていたにもかかわらず、
完璧なコードを書いてくださり、ありがとうございます。
心から感謝しております!!!
本当に助かりました。どうもありがとうございました。
<(_ _*)> ))
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) CICでの情報開示について CICのインターネット開示を利用しているのですが、必要事項を入力後に確定 1 2023/04/04 16:11
- その他(メールソフト・メールサービス) これは詐欺メールでしょうか? カテ違いでしたらすみません。 「楽天カードから緊急のご連絡」というタイ 7 2022/06/30 19:37
- その他(ネットショッピング・通販・ECサイト) 垢バンになってしまうのでしょうか? 1 2022/09/17 00:25
- ビジネスマナー・ビジネス文書 メールの内容について 初耳というか、夜中や早朝に平気でメールが来る時点でちょっとおかしい気もしたので 3 2023/07/30 09:10
- Amazon アマゾン 7 2022/06/11 11:03
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- その他(資産運用・投資) 助けてください 株購入、配当について 正式なグリー株式会社から 身に覚えのない手紙が届きました。 手 8 2023/08/28 12:50
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) エクセルの表でダブりを解消する方法を、教えてください。 5 2023/04/12 12:11
- 金銭トラブル・債権回収 通販で買う予定の会社の情報が 代表の名前が中国人でした。 心配だったので、 国税庁の法人番号サイトで 2 2023/05/15 12:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
EXCELのVBAでRange("A1:C4")を...
-
一つのTeratermのマクロで複数...
-
Excel VBAからAccessマクロを実...
-
メッセージボックスのOKボタ...
-
非表示の列をすべて削除するマクロ
-
エクセルに張り付けた写真のフ...
-
エクセルで別のセルにあるふり...
-
ExcelのVBA。public変数の値が...
-
ExcelVBAでPDFを閉じるソース
-
VBA アドインについて お詳しい...
-
TERA TERMを隠す方法
-
マクロで空白セルを詰めて別シ...
-
EXCELマクロでのThisisWor...
-
サクラエディタ・マクロ → VSCo...
-
エクセルマクロ自動更新
-
[初心者です]VBAで指定列か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
ExcelVBAでPDFを閉じるソース
-
EXCELのVBAでRange("A1:C4")を...
-
Excel VBAからAccessマクロを実...
-
TERA TERMを隠す方法
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
マクロ実行時、ユーザーフォー...
-
Excelのマクロについて教えてく...
-
ソース内の行末に\\
おすすめ情報