質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

解決済

2回答

287閲覧

Outlookメール本文を抽出することについて

u_zu

総合スコア53

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

0クリップ

投稿2025/01/13 08:40

実現したいこと

EXCEL VBAでコードを書いています。
Outlookで受信したメール本文をExcelに張り付ける際に、一つのセルにメール本文全てが張り付いてしまう。メール本文で改行されていたら下のセルに本文を貼り付けたい。
追加部分のコードを書かずに、複数行のセルにまたがって本文を貼り付けたい。

発生している問題・分からないこと

このようになってしまう
イメージ説明

このようにしたい
イメージ説明

エラーメッセージ

error

1エラーメッセージはないです。

該当のソースコード

VBA

1Sub Test1() 2 3’Microsoft Outlook 16.0 Object Library と Microsoft Scripting Runtimeは参照設定されている。 4 5Dim appOL As Outlook.Application 6 7Set appOL = New Outlook.Application 8 9Dim objExplorers As Explorers 10 11Set objExplorers = appOL.Explorers 12 13'Debug.Print objExplorers.Item(1).Selection.Item(1).Subject 14 15Worksheets(1).Range("B2").Value = objExplorers.Item(1).Selection.Item(1).Subject 16' 17'Debug.Print objExplorers.Item(1).Selection.Item(1).Body 18 19Worksheets(1).Range("B4").Value = objExplorers.Item(1).Selection.Item(1).Body 20 21’----この部分を追加し、作成された123.txtを開いて「全て選択」→任意のセルにコピーペーストすると複数行のセルに跨ってペーストされる。---- 22 23Dim str1 As String 24 25str1 = objExplorers.Item(1).Selection.Item(1).Body 26 27Dim myFSO As FileSystemObject 28Set myFSO = New FileSystemObject 29Dim myText As TextStream 30Set myText = myFSO.CreateTextFile("C:\123.txt") 31E: 32myText.WriteLine str1 33 34 35myText.Close 36Set myText = Nothing 37Set myFSO = Nothing 38 39’----この部分を追加し、作成された123.txtを開いて「全て選択」→任意のセルにコピーペーストすると複数行のセルに跨ってペーストされる。 終わり---- 40 41End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

単にメモ帳に書いたテキスト文をエクセルにコピーペーストしても、一つのセルにまとまらずに複数行のセルにペーストされる。 一つのセルにペーストされる場合と複数行にペーストされる場合と違いが分からない。

補足

単にメモ帳に書いたテキスト文をエクセルにコピーペーストしても、一つのセルにまとまらずに複数行のセルにペーストされる。 一つのセルにペーストされる場合と複数行にペーストされる場合と違いが分からない。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2025/01/13 11:06 編集

「上記の詳細・結果」と「補足」の文章が同一のようです。記入ミスでしょうか?ご確認ください。 > ソースコードを自分なりに変更した 上記についても”どう”変更されて結果がどうだったのか教えていただけますか?
u_zu

2025/01/13 11:36

>「上記の詳細・結果」と「補足」の文章が同一のようです。記入ミスでしょうか?ご確認ください。 何か書かなくてはいけなかったので、同じ文章をいれました。 >上記についても”どう”変更されて結果がどうだったのか教えていただけますか? 変更した、というよりは 追加のコードを入れてみて試してみた、という感じです。 追加コードを省略した場合、一つのセルにすべての「メール本文」がセットされてしまうので、 改行に合わせて複数セルにメール本文をセットしたい、ということです。
guest

回答2

0

ベストアンサー

Outlookで受信したメール本文をExcelに張り付ける

メール本文で改行されていたら下のセルに本文を貼り付けたい。

次のようなマクロを実行できれば良い、ということでしょうか。

vba

1Sub CopyMailBodyFromOutlook() 2 3 Dim olkApp As Outlook.Application 4 5 On Error Resume Next 6 '実行中の Outlook アプリケーションを参照 7 Set olkApp = GetObject(, "Outlook.Application") 8 '参照に失敗した場合 9 If Err.Number <> 0 Then 10 Err.Clear 11 On Error GoTo 0 12 'Outlook アプリケーションの新規インスタンスを生成して参照 13 Set olkApp = CreateObject("Outlook.Application") 14 End If 15 On Error GoTo 0 16 17 Dim olkNameSpace As Outlook.Namespace 18 Dim olkAccount As Outlook.Account 19 20 '最初のアカウントを参照 21 Set olkNameSpace = olkApp.GetNamespace("MAPI") 22 Set olkAccount = olkNameSpace.Accounts.Item(1) 23 24 Debug.Print "参照したアカウントの表示名: " & olkAccount.DisplayName 25 26 Dim olkFolderInbox As Outlook.Folder 27 Dim olkItems As Outlook.Items 28 29 'そのアカウントの既定の[受信トレイ]フォルダの参照 30 Set olkFolderInbox = olkAccount.Session.GetDefaultFolder(olFolderInbox) 31 'そのフォルダ内のアイテムコレクションを参照 32 Set olkItems = olkFolderInbox.Items 33 34 'アイテムが1つもなければメッセージボックスを表示して終了 35 If olkItems.Count = 0 Then 36 MsgBox "アカウント'" & olkAccount.DisplayName & "'の受信トレイの中にアイテムがありません。", _ 37 vbExclamation, _ 38 "アイテムなし" 39 Set olkItems = Nothing 40 Set olkFolderInbox = Nothing 41 Set olkAccount = Nothing 42 Set olkNameSpace = Nothing 43 Set olkApp = Nothing 44 Exit Sub 45 End If 46 47 '[受信日時]プロパティの降順にアイテムをソート 48 olkItems.Sort "[ReceivedTime]", True 49 50 Dim olkItem As Object 'Outlook.MailItem または Outlook.MeetingItem 51 52 '最初のアイテムを参照 53 Set olkItem = olkItems.GetFirst 54 55 Debug.Print "件名:" & olkItem.Subject 56 Debug.Print "受信日時:" & olkItem.ReceivedTime 57 58 Dim wsDestination As Excel.Worksheet 59 60 'このブックの1つめのワークシートを参照 61 Set wsDestination = ThisWorkbook.Worksheets(1) 62 63 Application.ScreenUpdating = False 64 65 'そのワークシートを選択 66 wsDestination.Select 67 68 '全てのセルをクリア 69 wsDestination.Cells.Clear 70 '全てのセルの表示形式を一時的に「文字列」にする 71 wsDestination.Cells.NumberFormat = "@" 72 73 '行見出しの設定 74 wsDestination.Cells(2, 1).Value = "件名:" 75 wsDestination.Cells(4, 1).Value = "本文:" 76 77 'B2セルに件名を代入 78 wsDestination.Cells(2, 2).Value = olkItem.Subject 79 80 'アイテムの本文をクリップボードにコピー 81 olkItem.GetInspector.WordEditor.Content.Copy 82 83 'B4セルを選択 84 wsDestination.Cells(4, 2).Select 85 'Unicode テキスト形式で貼り付け 86 wsDestination.PasteSpecial Format:="Unicode テキスト", _ 87 Link:=False, _ 88 DisplayAsIcon:=False 89 90 'B2セルを選択 91 wsDestination.Cells(2, 2).Select 92 93 '全てのセルの表示形式を「標準」にする 94 wsDestination.Cells.NumberFormat = "General" 95 96 Application.ScreenUpdating = True 97 98 Set olkItem = Nothing 99 Set olkItems = Nothing 100 Set olkFolderInbox = Nothing 101 Set olkAccount = Nothing 102 Set olkNameSpace = Nothing 103 Set olkApp = Nothing 104 105 Set wsDestination = Nothing 106 107End Sub

投稿2025/01/14 00:02

編集2025/01/14 01:29
sk.exe

総合スコア982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u_zu

2025/01/14 01:25

sk.exeさん どうもありがとうございます。 やりたいことはこのコードで実現できます。すごいです。 PasteSpecial Format:="Unicode という感じで実現できるんですね。 このコードで登場するPasteSpecialは よくエクセルVBAの本で見る、PasteSpecialメソッドとは 違うんですか? FormatとかLinkなどの引数は見たことはないので。 ネットで調べると、「指定された形式で、クリップボードの内容をシートに貼り付けます。 他のアプリケーションからデータを貼り付けるときや、あるいは特別な形式でデータを貼り付ける場合に 使います。」 とあり、エクセルだけで完結する場合以外で活用するように思われるので。
sk.exe

2025/01/14 01:57

> このコードで登場するPasteSpecialは よくエクセルVBAの本で見る、 > PasteSpecialメソッドとは違うんですか? Range オブジェクトの PasteSpecial メソッドではなく、 Worksheet オブジェクトの PasteSpecial メソッドを呼び出しています。 Range.PasteSpecial メソッド (Excel): https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.pastespecial Worksheet.PasteSpecial メソッド (Excel): https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheet.pastespecial 前者は「コピーされたセル範囲を任意の形式で別のセル範囲に貼り付ける」場合に、 後者は「別のアプリケーションからクリップボードにコピーされたデータ (テキスト、画像、オブジェクトなど)を任意のワークシートのアクティブセルに 貼り付ける」場合に使用します。 今回の場合は Outlook のメッセージウィンドウからその本文をクリップボードにコピーし、 貼り付け先として B4 セルをアクティブセルにしてから Unicode テキスト形式で (プレーンテキストのみの)貼り付けを実行するようにしています。 クリップボードにコピーされたのが「改行文字やタブ文字を含むテキスト」である場合は、 貼り付けが実行される際に Excel が自動的に解釈して貼り付け先の範囲を拡張します。
u_zu

2025/01/14 02:35

sk.exeさん どうもありがとうございます。ご提示いただいた、 Worksheet.PasteSpecial メソッド (Excel): https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheet.pastespecial のサイトを見たのですが、今回のFormatパラメーターに指定されている、"Unicode テキスト" のような 引数の一覧?のようなものはどこで調べたらよろしいのでしょうか?ググったのですが、可能な引数を 列挙しているようなサイトは見当たらず。。。自分で色々と試してみたいのですが、参考サイトなどを 御存じでしたら御教示お願いできないでしょうか?
sk.exe

2025/01/14 03:01 編集

> 今回のFormatパラメーターに指定されている、 > "Unicode テキスト" のような引数の一覧?のようなものは > どこで調べたらよろしいのでしょうか? 引数 Format に渡すことが出来る文字列は、その時点においてクリップボードに コピーされているデータの形式、および実行環境の言語によって異なります。 全ての組み合わせを網羅した公式ドキュメントは公開されていません。 基本的には、別のアプリケーション(今回の場合は Outlook )から任意のデータが クリップボードにコピーされた状態で Excel 側で[形式を選択して貼り付け]コマンドを 呼び出した際に選択可能な形式のいずれか1つを示す文字列を記述することになります。 よく分からない場合は[マクロの記録]機能を使用し、自動作成された マクロのコードを参考になさればよいでしょう。
u_zu

2025/01/14 05:35

sk.exeさん どうもありがとうございます。 大変参考になりました。
guest

0

特定セルのvalueに文字列(メールのBodyプロパティーは文字列型)を代入したらそうなります。

「文字列を改行で分割して、複数のセル(同じ列の複数行)にそれぞれの行を入れたい」
がやりたいことであれば、そのままそれをプログラムにするのが簡明だと思います。
文字列をsplit関数で分割して、あとはループするだけ。

別案としては、データリボンの「区切り位置」の機能に該当するTextToColumnsというメソッドがあるので、まず1セルに全部代入して、このメソッドで改行で横方向に分割した後、縦横転置するというのも考えられますが、上の案に対してのメリットがなさそう。余計面倒な気がします。
もしTextToRowsのようなメソッドがあればそれを使えば良いですが、無いのでそれは無理。

投稿2025/01/13 14:23

otn

総合スコア85989

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u_zu

2025/01/13 14:45

otnさん ありがとうございます。 >「文字列を改行で分割して、複数のセル(同じ列の複数行)にそれぞれの行を入れたい」 がやりたいことであれば、そのままそれをプログラムにするのが簡明だと思います。 文字列をsplit関数で分割して、あとはループするだけ。 この部分は理解できるのですが、メモ帳などで改行がある文章全体を選択→コピーして エクセルの任意のセルにペーストすると、複数セルに貼り付けられて、やりたいことと 同じことが出来るんですよね。仰っておられる、「特定セルのValueに文字列を代入」しているのと 異なる、ということなのでしょうか? 御存じでしたら教えてください。
otn

2025/01/14 10:35 編集

お書きの「メモ帳からコピペ」は、Excel側から見ると「クリップボード内容をペースト」ですね。やってることは全然違います。 そうか、そういう案もありますね。 と、思ったらすでに回答されていた。sk.exeさんのコードが完全に理解できたのならそれで良いかと思います。 私の回答の前半は、「VBAの基本の理解だけでできる」という意味で、簡明と書きました。
u_zu

2025/01/16 01:32

otnさん どうもありがとうございます。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問