<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>メール &#8211; まったりエンジニア</title>
	<atom:link href="https://javeo.jp/tag/%E3%83%A1%E3%83%BC%E3%83%AB/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Tue, 16 Jun 2026 11:21:24 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2-32x32.png</url>
	<title>メール &#8211; まったりエンジニア</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Outlook (new)でメールをExcelに出す【VBA非対応】</title>
		<link>https://javeo.jp/outlook-new-email-export/</link>
					<comments>https://javeo.jp/outlook-new-email-export/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 11:02:41 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[Power Automate]]></category>
		<category><![CDATA[メール]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4691</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/outlook-new-email-export-v2-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>Outlook (new)はVBAやマクロが非対応でメールをExcel化できません、Microsoft公式が代替に挙げるPython(Microsoft Graph)とPower Automateの2つの方法を、コードと手順つきで紹介します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/outlook-new-email-export-v2-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">Outlook (new)に切り替わってから、いつものVBAでメールをExcelに出そうとしたら<strong><span class="swl-marker mark_yellow">マクロがまったく動かなくなった</span></strong>、という方に向けた記事です</p>



<p class="wp-block-paragraph">結論から言うと、Outlook (new)ではVBAやCOM操作が使えません、これはバグでも設定ミスでもなく、Microsoftがそういう作りにしたためです</p>



<p class="wp-block-paragraph">とはいえメールをExcelに落とす手段がなくなったわけではないので、この記事ではMicrosoftが公式に代替として案内している<strong>Python(Microsoft Graph)</strong>とPower Automateの2つを、設定の流れとコードつきで紹介していきます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事で分かること</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Outlook (new)でVBAが動かない理由(公式見解)</li>



<li>過去メールも全件取りたいなら Python + Microsoft Graph</li>



<li>ノーコードでやるなら Power Automate(新着メールの自動収集向き)</li>



<li>2つの方法のどちらを選べばいいか</li>
</ul>
</div></div>



<h2 class="wp-block-heading">なぜOutlook (new)でVBAが使えないのか</h2>



<p class="wp-block-paragraph">まず「なぜ動かないのか」をはっきりさせておきます、ここを理解しておくと、無駄に設定をいじって時間を溶かさずに済みます</p>



<p class="wp-block-paragraph">Outlook (new)は、これまでのOutlook (classic)(デスクトップ版)とはまったく別の作りになっています、中身はWeb技術(WebView2)ベースで、ブラウザで動くOutlook on the webに近いものです</p>



<p class="wp-block-paragraph">VBAでメールを取得するときは、<strong>Outlook.Application</strong> や GetNamespace(&#8220;MAPI&#8221;) といったCOMという仕組み(アプリ同士をつなぐWindowsの仕掛け)を経由してOutlookのデータにアクセスしていました</p>



<p class="wp-block-paragraph">ところがOutlook (new)には、この<strong><span class="swl-marker mark_yellow">COMの窓口そのものが用意されていません</span></strong>、だから CreateObject(&#8220;Outlook.Application&#8221;) の時点で失敗してしまい、これまでのマクロが軒並み動かなくなるわけです</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">Microsoftは公式ドキュメントで<strong><span class="swl-marker mark_yellow" style="color:#e8313b">「Outlook (new)ではVBAとマクロをサポートしない」</span></strong>とはっきり書いています(VBA, Macros, and Custom Flows Alternatives)</p>



<p class="wp-block-paragraph">将来サポートされる予定も今のところアナウンスされていないので、Outlook (new)で使う前提なら、VBA以外の手段に乗り換えるのが現実的です</p>
</div></div>



<h3 class="wp-block-heading">Outlook (classic)に戻せばVBAは今までどおり動く</h3>



<p class="wp-block-paragraph">ここで1つ逃げ道もお伝えしておきます</p>



<p class="wp-block-paragraph">もし手元の環境でOutlook (classic)に戻せるなら、Outlookウィンドウ右上のトグルで切り替えるだけで、これまでのVBAマクロがそのまま使えます、Outlook (classic)は2026年時点でまだサポートが続く見込みです</p>



<p class="wp-block-paragraph">「とりあえず今までのマクロをもう一度動かしたいだけ」という場合は、Outlook (classic)に戻すのが一番手っ取り早いです、VBAでメールをExcel化する具体的なコードは<a href="https://javeo.jp/get-outlook-data/" target="_blank" rel="noopener noreferrer">OutlookのメールデータをExcelに取得するマクロ</a>でまとめているので、そちらをどうぞ</p>



<p class="wp-block-paragraph">会社の方針などでOutlook (classic)に戻せない、あるいは将来を見据えてVBA以外でやっておきたい、という方はこの先の2つの方法に進んでください</p>



<h2 class="wp-block-heading">方法1 Pythonで取得する(Microsoft Graph API)</h2>



<p class="wp-block-paragraph">1つめは<strong>Python + Microsoft Graph API</strong>です、Microsoftが用意しているメール取得用のAPI(外部からデータを取りに行く窓口)をPythonから叩いて、メールをまとめてExcelに書き出します</p>



<p class="wp-block-paragraph">こちらは設定にひと手間かかりますが、<strong><span class="swl-marker mark_yellow">過去メールも含めて全件取得できる</span></strong>のが強みです、日付や件名でフィルタしたり、取得項目を自由に選べたりと、細かい制御が効きます</p>



<h3 class="wp-block-heading">ステップ1 必要なライブラリを入れる</h3>



<p class="wp-block-paragraph">使うライブラリは3つです、認証用のmsal、API通信用のrequests、Excel書き出し用のopenpyxlを入れます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install msal requests openpyxl</code></pre></div>



<h3 class="wp-block-heading">ステップ2 Azure AD(Microsoft Entra ID)にアプリを登録する</h3>



<p class="wp-block-paragraph">Graph APIを使うには、自分のアプリをMicrosoft側に登録して<strong>CLIENT_ID</strong>(アプリの身分証のようなもの)をもらう必要があります、ここが今回いちばんの山場なので、画面ごとに区切って進めていきます</p>



<p class="wp-block-paragraph">作業するのは<strong>Microsoft Entra管理センター</strong>(entra.microsoft.com)です、以前はAzureポータル(portal.azure.com)の「Azure Active Directory」と呼ばれていた場所で、今は<strong>Microsoft Entra ID</strong>に名前が変わっています、どちらから入っても同じ設定にたどり着けます</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">アプリの登録から「新規登録」を開く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Entra管理センターにサインインして、「Entra ID」→「アプリの登録」→「新規登録」と進みます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-1024x538.png" alt="" class="wp-image-4721" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-300x158.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">名前とアカウントの種類を選んで登録する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">新規登録の画面には、上から「名前」「サポートされているアカウントの種類」「リダイレクトURI(任意)」の順で入力欄が並んでいます</p>



<ul class="wp-block-list -list-under-dashed">
<li><strong>名前</strong>:あとから変えられるので、自分が分かる名前でかまいません(例 outlook-mail-export)</li>



<li><strong>サポートされているアカウントの種類</strong>:迷ったら<span class="swl-marker mark_yellow">「任意のEntra IDテナント + 個人用Microsoftアカウント」</span>を選ぶと、個人のOutlook.com(Hotmail/Live)でも会社のMicrosoft 365でも同じ手順で動きます、選んだ種類でコードの<strong>TENANT_ID</strong>が変わるので、下のメモもあわせて見てください</li>



<li><strong>リダイレクトURI(任意)</strong>:ここは空のままでOKです、次のステップの「認証」で設定します</li>
</ul>



<p class="wp-block-paragraph">入力できたら「登録」をクリックします</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42.png"><img decoding="async" width="1024" height="589" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-1024x589.png" alt="" class="wp-image-4722" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-1024x589.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-300x173.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-150x86.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-768x442.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">クライアントIDとテナントIDを控える</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">登録が終わると「概要」画面が開きます、ここに表示される<strong>アプリケーション(クライアント)ID</strong>をコピーしておきます、これがコードの<strong>CLIENT_ID</strong>です</p>



<p class="wp-block-paragraph">同じ画面の<strong>ディレクトリ(テナント)ID</strong>も控えておきます、こちらは<span class="swl-marker mark_yellow">「シングルテナントのみ」を選んだ場合だけ</span>コードのTENANT_IDに入れます(commonや個人用を使うなら不要です)</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-1024x538.png" alt="" class="wp-image-4723" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-300x158.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">リダイレクトURIを設定する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">左メニューの「認証」(画面によっては<strong>「Authentication (Preview)」</strong>と表示されます)を開き、「リダイレクトURI構成」タブの「リダイレクトURIの追加」から<strong>「モバイルアプリケーションとデスクトップアプリケーション」</strong>のタイルを選びます</p>



<p class="wp-block-paragraph">リダイレクトURIに<strong><span class="swl-marker mark_yellow">http://localhost</span></strong>を指定して「構成」で保存します(推奨候補に出ていなければカスタムとして入力します)、<span class="swl-marker mark_yellow" style="color:#e8313b">これを入れておかないと、ログイン画面が返ってこずにエラーになります</span></p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14.png"><img decoding="async" width="1024" height="581" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-1024x581.png" alt="" class="wp-image-4726" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-1024x581.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-300x170.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-150x85.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-768x436.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26.png"><img decoding="async" width="1024" height="581" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-1024x581.png" alt="" class="wp-image-4727" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-1024x581.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-300x170.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-150x85.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-768x436.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">APIのアクセス許可でMail.Readを追加する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">左メニューの「APIのアクセス許可」→「アクセス許可の追加」→「Microsoft Graph」→「委任されたアクセス許可」と進み、<strong>Mail.Read</strong>を探して追加します</p>



<p class="wp-block-paragraph">これで<strong><span class="swl-marker mark_yellow">自分のメールを読む権限</span></strong>がアプリに付きます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57.png"><img decoding="async" width="1024" height="528" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-1024x528.png" alt="" class="wp-image-4728" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-1024x528.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-300x155.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-150x77.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-768x396.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57.png 1353w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10.png"><img decoding="async" width="1024" height="528" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-1024x528.png" alt="" class="wp-image-4729" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-1024x528.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-300x155.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-150x77.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-768x396.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10.png 1353w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>
</div>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">今回は自分のログインでアクセスする<strong>委任(デリゲート)</strong>の方式なので、アプリのシークレット(パスワード的なもの)は不要です</p>



<p class="wp-block-paragraph">はじめてログインするときに、Mail.Readの利用に同意するか聞かれることがあります、自分のアカウントに対する読み取りなので同意して進めて問題ないです</p>



<p class="wp-block-paragraph">ステップ2で選んだ<strong>「サポートされているアカウントの種類」</strong>に合わせて、コードの<strong>TENANT_ID</strong>に入れる値を変えます、ここがズレると<span class="swl-marker mark_yellow" style="color:#e8313b">「Please use the /consumers endpoint」のような認証エラー</span>になります</p>



<ul class="wp-block-list -list-under-dashed">
<li>任意のEntra IDテナント + 個人用(個人でも会社でも動く、迷ったらこれ):<strong><span class="swl-marker mark_yellow">common</span></strong></li>



<li>シングルテナントのみ(会社・学校のMicrosoft 365に限定):控えた<strong>ディレクトリ(テナント)ID</strong></li>



<li>個人用アカウントのみ(Outlook.com専用):<strong><span class="swl-marker mark_yellow">consumers</span></strong></li>
</ul>



<p class="wp-block-paragraph">画面にある「複数のEntra IDテナント」は、複数の会社にまたがって使うSaaSアプリ向けなので、今回のメール取得では選びません</p>
</div></div>



<h3 class="wp-block-heading">ステップ3 認証してメールを取得する</h3>



<p class="wp-block-paragraph">準備ができたらコードに進みます、まずは認証してアクセストークン(API利用の通行証)をもらう部分です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import msal

CLIENT_ID = &quot;ここにアプリケーション(クライアント)ID&quot;
TENANT_ID = &quot;common&quot;  # 個人でも会社でも動く、会社のアカウント専用なら控えたテナントID、個人専用なら consumers
SCOPES = [&quot;https://graph.microsoft.com/Mail.Read&quot;]

# パブリッククライアント(デスクトップアプリ)として認証する
app = msal.PublicClientApplication(
    CLIENT_ID,
    authority=f&quot;https://login.microsoftonline.com/{TENANT_ID}&quot;,
)

# ブラウザが立ち上がってMicrosoftのログイン画面が出る
result = app.acquire_token_interactive(scopes=SCOPES)
token = result[&quot;access_token&quot;]</code></pre></div>



<p class="wp-block-paragraph">このコードを実行するとブラウザが立ち上がり、いつものMicrosoftのログイン画面が出ます、ログインが終わるとトークンが手に入ります</p>



<p class="wp-block-paragraph">続いてGraph APIを叩いてメール一覧を取ります、ポイントは<strong><span class="swl-marker mark_yellow">ページング処理</span></strong>です</p>



<p class="wp-block-paragraph">Graph APIは一度に全件は返してくれず、続きがある場合は応答の中に<strong>@odata.nextLink</strong>という「次のページのURL」が入ってきます、これが無くなるまでループで取りに行きます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import requests

# Prefer ヘッダーで本文をHTMLでなくプレーンテキストで受け取る
headers = {
    &quot;Authorization&quot;: f&quot;Bearer {token}&quot;,
    &quot;Prefer&quot;: &#39;outlook.body-content-type=&quot;text&quot;&#39;,
}

# $top で1ページの件数、$select で欲しい項目だけに絞る
url = (&quot;https://graph.microsoft.com/v1.0/me/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;)

all_messages = []
while url:
    resp = requests.get(url, headers=headers).json()
    all_messages.extend(resp.get(&quot;value&quot;, []))
    # 次のページがあれば nextLink が入る、無ければループ終了
    url = resp.get(&quot;@odata.nextLink&quot;)

print(f&quot;{len(all_messages)} 件取得しました&quot;)</code></pre></div>



<p class="wp-block-paragraph">$selectで欲しい項目だけに絞ると、通信量が減って取得も速くなります、今回は件名・差出人・宛先・CC・受信日時・既読フラグ・添付の有無・本文を取っています、ほかにどんな項目が取れるかは<a href="https://learn.microsoft.com/ja-jp/graph/api/resource/message" target="_blank" rel="noopener noreferrer">messageリソースの公式リファレンス</a>に一覧があります</p>



<h3 class="wp-block-heading">ステップ4 Excelに書き出す</h3>



<p class="wp-block-paragraph">最後にopenpyxlでExcelに書き出します、差出人・宛先・CCはどれも入れ子の構造で、メールによっては<strong>address</strong>が無く<strong>name</strong>だけのこともあるので、取り出す部分を<strong>addr_of</strong>と<strong>addr_list</strong>という小さな関数にまとめておくと扱いやすいです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import openpyxl

# 差出人・宛先・CCを取り出すヘルパー(address が無ければ name を使う)
def addr_of(person):
    ea = (person or {}).get(&quot;emailAddress&quot;, {})
    return ea.get(&quot;address&quot;) or ea.get(&quot;name&quot;, &quot;&quot;)

def addr_list(people):
    # toRecipients や ccRecipients は複数なので ; でつなぐ
    return &quot;; &quot;.join(addr_of(p) for p in (people or []))

wb = openpyxl.Workbook()
ws = wb.active
ws.append([&quot;件名&quot;, &quot;差出人&quot;, &quot;宛先&quot;, &quot;CC&quot;, &quot;受信日時&quot;, &quot;既読&quot;, &quot;添付&quot;, &quot;本文(先頭500字)&quot;])

for msg in all_messages:
    ws.append([
        msg.get(&quot;subject&quot;, &quot;&quot;),
        addr_of(msg.get(&quot;from&quot;)),
        addr_list(msg.get(&quot;toRecipients&quot;)),
        addr_list(msg.get(&quot;ccRecipients&quot;)),
        msg.get(&quot;receivedDateTime&quot;, &quot;&quot;),
        &quot;既読&quot; if msg.get(&quot;isRead&quot;) else &quot;未読&quot;,
        &quot;あり&quot; if msg.get(&quot;hasAttachments&quot;) else &quot;&quot;,
        msg.get(&quot;body&quot;, {}).get(&quot;content&quot;, &quot;&quot;)[:500],
    ])

wb.save(&quot;outlook_mail.xlsx&quot;)
print(&quot;outlook_mail.xlsx に保存しました&quot;)</code></pre></div>



<p class="wp-block-paragraph">本文は長くなりがちなので、ここでは先頭500字だけ取り出しています、全文が欲しい場合は<strong>[:500]</strong>を外してください</p>



<p class="wp-block-paragraph">ここまでをひとつのファイルにまとめたものを置いておきます、CLIENT_IDとTENANT_IDを自分の値に書き換えれば、そのまま動かせるはずです</p>



<div class="swell-block-accordion">
<details class="swell-block-accordion__item" data-swl-acc="wrapper"><summary class="swell-block-accordion__title" data-swl-acc="header"><span class="swell-block-accordion__label">コード全文（コピペ用）</span><span class="swell-block-accordion__icon c-switchIconBtn" data-swl-acc="icon" aria-hidden="true" data-opened="false"><i class="__icon--closed icon-caret-down"></i><i class="__icon--opened icon-caret-up"></i></span></summary><div class="swell-block-accordion__body" data-swl-acc="body">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="get_outlook_mail.py" data-lang="Python"><code>import msal
import requests
import openpyxl

CLIENT_ID = &quot;ここにアプリケーション(クライアント)ID&quot;
TENANT_ID = &quot;common&quot;  # 個人でも会社でも動く、会社のアカウント専用なら控えたテナントID、個人専用なら consumers
SCOPES = [&quot;https://graph.microsoft.com/Mail.Read&quot;]

# --- 認証(ブラウザでMicrosoftにログインする) ---
app = msal.PublicClientApplication(
    CLIENT_ID,
    authority=f&quot;https://login.microsoftonline.com/{TENANT_ID}&quot;,
)
result = app.acquire_token_interactive(scopes=SCOPES)
token = result[&quot;access_token&quot;]

# --- メール一覧を取得する ---
headers = {
    &quot;Authorization&quot;: f&quot;Bearer {token}&quot;,
    &quot;Prefer&quot;: &#39;outlook.body-content-type=&quot;text&quot;&#39;,
}
url = (&quot;https://graph.microsoft.com/v1.0/me/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;)

all_messages = []
while url:
    resp = requests.get(url, headers=headers).json()
    all_messages.extend(resp.get(&quot;value&quot;, []))
    url = resp.get(&quot;@odata.nextLink&quot;)

print(f&quot;{len(all_messages)} 件取得しました&quot;)

# --- Excelに書き出す ---
def addr_of(person):
    ea = (person or {}).get(&quot;emailAddress&quot;, {})
    return ea.get(&quot;address&quot;) or ea.get(&quot;name&quot;, &quot;&quot;)

def addr_list(people):
    return &quot;; &quot;.join(addr_of(p) for p in (people or []))

wb = openpyxl.Workbook()
ws = wb.active
ws.append([&quot;件名&quot;, &quot;差出人&quot;, &quot;宛先&quot;, &quot;CC&quot;, &quot;受信日時&quot;, &quot;既読&quot;, &quot;添付&quot;, &quot;本文(先頭500字)&quot;])

for msg in all_messages:
    ws.append([
        msg.get(&quot;subject&quot;, &quot;&quot;),
        addr_of(msg.get(&quot;from&quot;)),
        addr_list(msg.get(&quot;toRecipients&quot;)),
        addr_list(msg.get(&quot;ccRecipients&quot;)),
        msg.get(&quot;receivedDateTime&quot;, &quot;&quot;),
        &quot;既読&quot; if msg.get(&quot;isRead&quot;) else &quot;未読&quot;,
        &quot;あり&quot; if msg.get(&quot;hasAttachments&quot;) else &quot;&quot;,
        msg.get(&quot;body&quot;, {}).get(&quot;content&quot;, &quot;&quot;)[:500],
    ])

wb.save(&quot;outlook_mail.xlsx&quot;)
print(&quot;outlook_mail.xlsx に保存しました&quot;)</code></pre></div>
</div></details>
</div>



<h3 class="wp-block-heading">受信トレイだけ・期間で絞りたいとき</h3>



<p class="wp-block-paragraph">上のコードはメール全体を取りますが、対象を絞りたいこともあると思います、URLのところを少し変えるだけで対応できます</p>



<p class="wp-block-paragraph">受信トレイだけに絞るなら<strong>me/mailFolders/inbox/messages</strong>にします、受信日時で絞るなら$filterを足します、たとえば2026年1月以降だけなら次のような形です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 受信トレイの、2026年1月以降のメールに絞る例
url = (&quot;https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;
       &quot;&$filter=receivedDateTime ge 2026-01-01T00:00:00Z&quot;)</code></pre></div>



<p class="wp-block-paragraph">このあたりを自由にいじれるのが、Pythonで取る方法のいちばんの魅力かなと思います、$filterや$orderbyで指定できる条件は<a href="https://learn.microsoft.com/ja-jp/graph/api/user-list-messages" target="_blank" rel="noopener noreferrer">List messagesのリファレンス</a>にまとまっています</p>



<h2 class="wp-block-heading">方法2 Power Automateで新着メールをExcelに追記する</h2>



<p class="wp-block-paragraph">2つめはノーコードでできる<strong>Power Automate</strong>です、プログラムを書かずに「メールが届いたらExcelに1行追記する」という流れ(フロー)を組めます</p>



<p class="wp-block-paragraph">Microsoft 365のアカウントがあれば、無料の枠でも基本的な自動フローは作れます、コードを書きたくない方はこちらの方が手軽です</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">先に大事な制約を1つ、Power Automateは<strong><span class="swl-marker mark_yellow">「これから届くメール」を自動で拾う仕組み</span></strong>です</p>



<p class="wp-block-paragraph">すでに受信トレイに溜まっている過去メールを一括でExcel化する用途には向きません、過去分もまとめて欲しいなら、方法1で紹介したPython(Microsoft Graph)の方が適しています</p>
</div></div>



<h3 class="wp-block-heading">事前準備 OneDriveにExcelを置いてテーブル化しておく</h3>



<p class="wp-block-paragraph">フローを作る前に、書き込み先のExcelを用意します、ここを先にやっておかないと後の設定でつまずきます</p>



<ul class="wp-block-list is-style-num_circle -list-under-dashed">
<li>OneDrive(またはSharePoint)にExcelファイルを置く ※ローカルPCのExcelは連携できません</li>



<li>1行目に「件名」「差出人」「受信日時」などの見出しを入れる</li>



<li>見出しを含めて範囲を選び、Excelの「挿入」→「テーブル」でテーブルに変換しておく</li>
</ul>



<p class="wp-block-paragraph">Power Automateの「行の追加」アクションは<strong><span class="swl-marker mark_yellow">テーブルにしか書き込めない</span></strong>ので、ただ見出しを打っただけのシートだと選択肢に出てきません、ここはハマりやすいポイントです</p>



<h3 class="wp-block-heading">フローを作る手順</h3>



<p class="wp-block-paragraph">準備ができたら、Power Automate(make.powerautomate.com)でフローを組みます、流れはとてもシンプルです</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">自動化したクラウドフローを新規作成</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">「作成」から「自動化したクラウドフロー」を選びます、トリガー(きっかけ)になるイベントを後で指定する形式です</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">トリガーに「新しいメールが届いたとき」を選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Office 365 Outlookの<strong>「新しいメールが届いたとき (V3)」</strong>を選びます、特定の差出人や件名だけに絞りたい場合は、ここのオプションで条件を指定できます</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">アクションに「表に行を追加」を選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">次のステップでExcel Online (OneDrive) の<strong>「表に行を追加」</strong>を選び、さきほど用意したファイル・テーブルを指定します</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">各列にメールの値を割り当てる</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">「件名」列にはトリガーの件名、「差出人」列には差出人、というように動的なコンテンツをはめ込んでいきます、これで保存すれば完成です</p>
</div></div>
</div>



<p class="wp-block-paragraph">あとはメールが届くたびに、自動でExcelの最終行に1件ずつ積み上がっていきます、手作業のコピペから解放されるのは地味にうれしいポイントです</p>



<p class="wp-block-paragraph">本文も列に入れたい場合は本文プレビューを割り当てると扱いやすいです、本文全文はHTMLタグが混ざることがあるので、用途に合わせて選んでください</p>



<h2 class="wp-block-heading">どちらを選ぶか(比較)</h2>



<p class="wp-block-paragraph">2つの方法を表にまとめておきます、ざっくり言うと<strong><span class="swl-marker mark_yellow">過去メールも全部欲しいならPython、これからのメールを自動で貯めたいならPower Automate</span></strong>です</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:700px;"><thead><tr><th>項目</th><th>Python(Graph)</th><th>Power Automate</th></tr></thead><tbody><tr><td>必要なスキル</td><td>Pythonの基礎</td><td>ノーコード(画面操作だけ)</td></tr><tr><td>事前準備</td><td>Azure ADのアプリ登録</td><td>OneDriveにExcel+テーブル化</td></tr><tr><td>新着メールの自動収集</td><td>△ 定期実行の仕組みが別途必要</td><td>○ 得意</td></tr><tr><td>過去メールの一括取得</td><td>○ 全件取得できる</td><td>× できない</td></tr><tr><td>日付・件名での絞り込み</td><td>○ 自由に指定できる</td><td>△ 簡単な条件のみ</td></tr><tr><td>費用</td><td>無料(自分のアカウント範囲)</td><td>無料プランあり</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">「溜まった問い合わせメールを一気にExcelで分析したい」のような一括処理ならPython、「届いたメールを台帳に自動で記録していきたい」のような運用ならPower Automate、という住み分けがしっくりくると思います</p>



<p class="wp-block-paragraph">もちろん両方を組み合わせてもいいです、過去分はPythonで一気に吸い出して、これから先はPower Automateで貯めていく、という使い方も現実的です</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Outlook (new)でメールをExcel化する方法を整理しました、最後にもう一度ポイントをまとめておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Outlook (new)はVBA・COM非対応(Microsoft公式が明言、将来サポート予定もなし)</li>



<li>今までのマクロを動かしたいだけなら、Outlook (classic)に戻すのが最短</li>



<li>過去メールも全件・条件指定で取りたいなら Python + Microsoft Graph</li>



<li>新着メールを自動で貯めたいなら Power Automate(ノーコード)</li>
</ul>



<p class="wp-block-paragraph">VBAが使えなくなったと聞くと身構えてしまいますが、代わりの道はちゃんと用意されています、自分の目的に合う方を選んでもらえればと思います</p>



<p class="wp-block-paragraph">Outlook (classic)でVBAを使う具体的なコードは<a href="https://javeo.jp/get-outlook-data/" target="_blank" rel="noopener noreferrer">OutlookのメールデータをExcelに取得するマクロ</a>でまとめています、戻せる環境の方はこちらもあわせてどうぞ</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" id="jv-books-python" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240" alt="Pythonクローリング&amp;スクレイピング 増補改訂版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Pythonクローリング&amp;スクレイピング 増補改訂版</p><p class="jv-book-author">加藤耕太</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4297107384">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4297107384">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var root=document.getElementById('jv-books-'+SHELF);
if(!root||root.dataset.init)return;
root.dataset.init='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "Pythonクローリング&スクレイピング 増補改訂版", "a": "加藤耕太", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7383/9784297107383.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297107384?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F15960670%2F", "id": "4297107384"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/outlook-new-email-export/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【VBA】OutlookのメールデータをExcelに取得するマクロ</title>
		<link>https://javeo.jp/get-outlook-data/</link>
					<comments>https://javeo.jp/get-outlook-data/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 23:00:00 +0000</pubDate>
				<category><![CDATA[Excel・VBA]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[メール]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=2054</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/get-outlook-data-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>ExcelのVBAでOutlookからメール情報（TO/CC/BCC/本文/添付ファイル）を一括取得するマクロを解説、クラシックOutlook専用で新しいOutlookは非対応、2026年現在も使えるコードです]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/get-outlook-data-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">Excel VBAでOutlookのメールデータを抽出するプログラムを作った時に地味に躓いたり、歯痒いところに手が届かないことが多かったので備忘半分でプログラムを残しています</p>



<p class="wp-block-paragraph">調べれば調べるほど微調整箇所が多いのでちょくちょく更新するつもりです、最終更新日をご確認ください</p>
</div></div>



<p class="wp-block-paragraph">このマクロを使うと、Outlookに設定している<strong><span class="swl-marker mark_yellow">全アカウントの受信メールと送信メールをまとめてExcelに書き出せます</span></strong></p>



<p class="wp-block-paragraph">取得できるのは差出人アドレス・TO・CC・BCC・受信日時・件名・本文・添付ファイルで、フォルダ階層も追いかけて再帰的に拾ってくれます</p>



<p class="wp-block-paragraph">1通ずつ手作業でコピペするのが面倒だったり、メールの一覧をExcelで分析したい方の役に立てばうれしいです</p>



<h2 class="wp-block-heading">動作条件（クラシックOutlook専用）</h2>



<p class="wp-block-paragraph">まず最初に大事な前提をお伝えします</p>



<p class="wp-block-paragraph">このマクロが動くのは<strong><span class="swl-marker mark_yellow" style="color:#e8313b">クラシックOutlook（旧Outlook）だけ</span></strong>です</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">このコードは<strong>クラシックOutlook専用</strong>です</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">新しいOutlook（New Outlook）ではVBAが動きません</span></strong>、Microsoftが公式に「新しいOutlookではVBAとマクロをサポートしない」と明言しています</p>



<p class="wp-block-paragraph"><strong>Outlook.Application</strong> や <strong>GetNamespace(&#8220;MAPI&#8221;)</strong> といったCOM経由の操作はすべて使えません、新しいOutlookがWebView2ベースの別アーキテクチャに作り替えられたためです</p>



<p class="wp-block-paragraph">クラシックOutlookは2026年時点で少なくとも2029年まではサポートが続く見込みなので、いま使う分には問題ないです、Outlookウィンドウ右上のトグルでクラシックに切り替えられます</p>
</div></div>



<p class="wp-block-paragraph">2026年4月ごろから個人向けでは新しいOutlookがデフォルトになり始めていますが、右上のトグルでクラシックへ戻せば今までどおりVBAが使えます</p>



<p class="wp-block-paragraph">どうしても新しいOutlookで自動化したい場合は、VBAではなく<strong><span class="swl-marker mark_yellow">Power AutomateやMicrosoft Graph</span></strong>へ寄せることになります、このあたりはMicrosoftが代替手段として案内しているので、頭の片隅に置いておくと安心です</p>



<p class="wp-block-paragraph">VBAはバージョンによって動かなくなることがあるので、このプログラムを作成・利用している私の環境はこちらです</p>



<figure class="wp-block-table"><table><tbody><tr><th>OS</th><td>Windows 10 / 11</td></tr><tr><th>Outlookの種類</th><td>クラシックOutlook（Microsoft 365 / Office 2021以降、32bit・64bit両対応）</td></tr><tr><th>動作対象外</th><td>新しいOutlook（New Outlook）はVBA非対応のため使えません</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">参照設定</h2>



<p class="wp-block-paragraph">プログラムを作り始める前に、まずは参照設定からです</p>



<p class="wp-block-paragraph">外部ライブラリを読み込んだ方がプログラムを作りやすいので、今回はOutlook用の「<strong><span class="swl-marker mark_yellow">Microsoft Outlook 16.0 Object Library</span></strong>」を有効にしてあげます</p>



<p class="wp-block-paragraph">VBE（Visual Basic Editor）のメニューから「ツール」→「参照設定」と進んで、リストの中からチェックを入れるだけです</p>



<figure class="wp-block-image size-full is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2024/04/2024-04-16_22h31_12.png" target="_blank" rel="noopener noreferrer"><img decoding="async" width="455" height="317" src="https://javeo.jp/wp-content/uploads/2024/04/2024-04-16_22h31_12.png" alt="VBEの参照設定でMicrosoft Outlook 16.0 Object Libraryにチェックを入れる画面" class="wp-image-2056" srcset="https://javeo.jp/wp-content/uploads/2024/04/2024-04-16_22h31_12.png 455w, https://javeo.jp/wp-content/uploads/2024/04/2024-04-16_22h31_12-300x209.png 300w, https://javeo.jp/wp-content/uploads/2024/04/2024-04-16_22h31_12-150x105.png 150w" sizes="(max-width: 455px) 100vw, 455px" /></a></figure>



<h2 class="wp-block-heading">全体プログラム</h2>



<p class="wp-block-paragraph">説明はいいからとにかくマクロが欲しいって方へ</p>



<p class="wp-block-paragraph">標準モジュールに全部コピペすれば使えるはずです</p>



<div class="swell-block-accordion">
<details class="swell-block-accordion__item" data-swl-acc="wrapper"><summary class="swell-block-accordion__title" data-swl-acc="header"><span class="swell-block-accordion__label">コード全文（コピペ用）</span><span class="swell-block-accordion__icon c-switchIconBtn" data-swl-acc="icon" aria-hidden="true" data-opened="false"><i class="__icon--closed icon-caret-down"></i><i class="__icon--opened icon-caret-up"></i></span></summary><div class="swell-block-accordion__body" data-swl-acc="body">
<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-file="main.bas" data-lang="Visual Basic + VBA"><code>Declare PtrSafe Function SHCreateDirectoryEx Lib &quot;shell32&quot; _
    Alias &quot;SHCreateDirectoryExA&quot; _
    (ByVal hwnd As LongPtr, _
     ByVal pszPath As String, _
     ByVal psa As LongPtr) As Long
&#39;---後で編集しやすいように列番号は列挙型で宣言しておく
Enum lngCol
    Account = 1
    FolderName
    SenderEmailAddress
    MailTO
    MailCC
    MailBCC
    ReceivedTime
    MailSubject
    MailBody
    AttachmentsCount
End Enum
Public ws As Worksheet
Sub GetOutlookMail()
Dim oApp As New Outlook.Application
Dim oNS As Outlook.Namespace
Dim oFld As Outlook.Folder

&#39;---画面更新処理を止めておく
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

&#39;---出力するシートの設定
Set ws = CreateSheet
ws.Select
ws.Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)).EntireRow.Delete

&#39;---MAPIをセット
Set oNS = oApp.GetNamespace(&quot;MAPI&quot;)
For Each oFld In oNS.Folders
    &#39;---アカウント名を継承させながらフォルダを再帰処理しながら検索する
    Call SearchFolder(oFld.Name, &quot;&quot;, oFld)
Next
Set oNS = Nothing

Set ws = Nothing
&#39;---画面更新処理を復旧させる
With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With

&#39;---終了メッセージ
MsgBox &quot;更新完了しました&quot;
End Sub
Private Function SearchFolder(Account As String, FolderPath As String, TargetFolder As Outlook.Folder)
&#39;==============================
&#39;メールフォルダを再帰処理で検索する
&#39;==============================
Dim oFld As Outlook.Folder

&#39;---同期の問題と同期の失敗フォルダを除外する処置
If TargetFolder.Name Like &quot;同期の*&quot; Then
    Exit Function
End If

&#39;---フォルダタイプがメールだったら中のメール情報を取得する
If TargetFolder.DefaultItemType = olMailItem Then
    Call GetMailData(Account, FolderPath, TargetFolder)
End If

&#39;---フォルダ情報をパンくず形式で継承しつつ再帰処理させる
For Each oFld In TargetFolder.Folders
    Call SearchFolder(Account, FolderPath & IIf(Len(FolderPath) &gt; 0, &quot; &gt; &quot;, &quot;&quot;) & oFld.Name, oFld)
Next
End Function
Private Function GetMailData(Account As String, TargetFolderName As String, TargetFolder As Outlook.Folder)
&#39;==============================
&#39;対象フォルダからメール情報を取得してエクセルに反映させる
&#39;==============================
Dim oItems As Outlook.Items
Dim oItem As Outlook.MailItem
Dim oAtt As Outlook.Attachment
Dim i As Long
Dim lngRow As Long
Dim strFilter
Dim savePath As String

With ws
    .Select
    Set oItems = TargetFolder.Items
    &#39;---ステータスバーに取得フォルダ等を表示する
    Application.StatusBar = &quot;「&quot; & Account & &quot;」の「&quot; & TargetFolderName & &quot;」から&quot; & oItems.Count & &quot;件のデータ取得中・・・&quot;
    &#39;---取得したメールを反映させる
    For i = 1 To oItems.Count
        &#39;---データがメールタイプじゃない可能性があるので確認して取得する
        If oItems(i).Class = olMail Then
            &#39;---入力行（最下行の次）を取得する
            lngRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            &#39;---メールアイテムを変数にセットする
            Set oItem = oItems(i)
            .Cells(lngRow, lngCol.Account).Value = Account
            .Cells(lngRow, lngCol.FolderName).Value = TargetFolderName
            .Cells(lngRow, lngCol.SenderEmailAddress).Value = oItem.SenderEmailAddress
            .Cells(lngRow, lngCol.MailTO).Value = SplitMailStr(oItem.To, oItem.Recipients)
            .Cells(lngRow, lngCol.MailCC).Value = SplitMailStr(oItem.CC, oItem.Recipients)
            .Cells(lngRow, lngCol.MailBCC).Value = SplitMailStr(oItem.BCC, oItem.Recipients)
            .Cells(lngRow, lngCol.ReceivedTime).Value = oItem.ReceivedTime
            With .Cells(lngRow, lngCol.MailSubject)
                .NumberFormatLocal = &quot;@&quot; &#39;---先頭文字が=(イコール)などで始まるとエラーになるから表示形式を文字列にする
                .Value = oItem.Subject
                .WrapText = False &#39;---折り返し表示すると動作が重くなるので解除する
                .NumberFormatLocal = &quot;G/標準&quot; &#39;---表示形式を標準に戻す
            End With
            With .Cells(lngRow, lngCol.MailBody)
                .NumberFormatLocal = &quot;@&quot; &#39;---本文が=(イコール)で始まるとエラーになるから表示形式を文字列にする
                .Value = oItem.Body
                .WrapText = False &#39;---折り返し表示すると動作が重くなるので解除する
                .NumberFormatLocal = &quot;G/標準&quot; &#39;---表示形式を標準に戻す
            End With
            &#39;---添付ファイルを取得する
            .Cells(lngRow, lngCol.AttachmentsCount).Value = oItem.Attachments.Count
            For Each oAtt In oItem.Attachments
                &#39;---受信日時をベースにフルパスフォルダ名を決める
                savePath = ThisWorkbook.Path & &quot;\att\&quot; & Format(oItem.ReceivedTime, &quot;yyyymmdd_hhmm&quot;)
                &#39;---多重階層フォルダを作成する
                rc = SHCreateDirectoryEx(0&, savePath, 0&)
                &#39;---ここで実際にフォルダを作成する
                oAtt.SaveAsFile savePath & &quot;\&quot; & oAtt.Filename
            Next
            &#39;---内外全てにグレー罫線を引く
            With .Range(Cells(lngRow, lngCol.Account), Cells(lngRow, lngCol.AttachmentsCount)).Borders()
                .LineStyle = xlContinuous
                .Weight = xlThin
                .Color = RGB(128, 128, 128)
            End With
            Set oItem = Nothing
        End If
    Next
    &#39;---ステータスバーをリセットする
    Application.StatusBar = False
End With
End Function
Private Function SplitMailStr(MailStr As String, RecipientsData As Recipients)
&#39;==============================
&#39;宛先が複数ある場合は;（セミコロン）区切りになっているので一度分解してChangeAliasで変換した後に結合する
&#39;==============================
Dim i As Long, MailArray As Variant

MailArray = Split(MailStr, &quot;;&quot;)
For i = LBound(MailArray) To UBound(MailArray)
    MailArray(i) = ChangeAlias(MailArray(i), RecipientsData)
Next
SplitMailStr = Join(MailArray, &quot;;&quot;)
End Function
Private Function ChangeAlias(Alias As Variant, RecipientsData As Recipients)
&#39;==============================
&#39;宛先情報がエイリアスになっている場合があるからメアドに変換する
&#39;==============================
Dim RecipientData As Recipient
&#39;---@が含まれているならメアドなのでそのまま
If Alias Like &quot;*@*&quot; Then
    ChangeAlias = Alias
    Exit Function
End If

&#39;---表示名が受信者情報と一致していたらアドレスに変換する
For Each RecipientData In RecipientsData
    If Trim(RecipientData.Name) = Trim(Alias) Then
        ChangeAlias = RecipientData.Address
        Exit Function
    End If
Next

&#39;---変換できなかったらそのまま返す ※ココに到達することはないはず
ChangeAlias = Alias
End Function
Private Function CreateSheet(Optional SheetName = &quot;OUTPUT&quot;) As Worksheet
Set CreateSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
With CreateSheet
    &#39;---シート名を変えるけど重複する可能性があるのでエラー無視する
    On Error Resume Next
    .Name = SheetName
    On Error GoTo 0
    &#39;---ヘッダー部の設定
    .Cells(1, lngCol.Account).Value = &quot;Account&quot;
    .Cells(1, lngCol.FolderName).Value = &quot;FolderName&quot;
    .Cells(1, lngCol.SenderEmailAddress).Value = &quot;SenderEmailAddress&quot;
    .Cells(1, lngCol.MailTO).Value = &quot;MailTO&quot;
    .Cells(1, lngCol.MailCC).Value = &quot;MailCC&quot;
    .Cells(1, lngCol.MailBCC).Value = &quot;MailBCC&quot;
    .Cells(1, lngCol.ReceivedTime).Value = &quot;ReceivedTime&quot;
    .Cells(1, lngCol.MailSubject).Value = &quot;MailSubject&quot;
    .Cells(1, lngCol.MailBody).Value = &quot;MailBody&quot;
    .Cells(1, lngCol.AttachmentsCount).Value = &quot;AttachmentsCount&quot;
    With .Range(Cells(1, lngCol.Account), Cells(1, lngCol.AttachmentsCount))
        .EntireColumn.ColumnWidth = 19.88
        .Interior.Color = RGB(191, 191, 191)
        With .Borders()
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(128, 128, 128)
        End With
    End With
End With
End Function</code></pre></div>
</div></details>
</div>



<h2 class="wp-block-heading">プロシージャ別の説明</h2>



<p class="wp-block-paragraph">ここからはプロシージャ別に分解して、少し詳しく説明します</p>



<h3 class="wp-block-heading">共通部分</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Declare PtrSafe Function SHCreateDirectoryEx Lib &quot;shell32&quot; _
    Alias &quot;SHCreateDirectoryExA&quot; _
    (ByVal hwnd As LongPtr, _
     ByVal pszPath As String, _
     ByVal psa As LongPtr) As Long
&#39;---後で編集しやすいように列番号は列挙型で宣言しておく
Enum lngCol
    Account = 1
    FolderName
    SenderEmailAddress
    MailTO
    MailCC
    MailBCC
    ReceivedTime
    MailSubject
    MailBody
    AttachmentsCount
End Enum
Public ws As Worksheet</code></pre></div>



<p class="wp-block-paragraph"><strong>SHCreateDirectoryEx</strong>は多重階層でフォルダを作成する時のWindows APIです<br>添付ファイルを保存する時に使うので宣言しておきます</p>



<p class="wp-block-paragraph"><strong>lngCol</strong>は列挙型で列番号を宣言しておくとプログラムが作りやすい気がする、個人的なお作法です</p>



<p class="wp-block-paragraph"><strong>ws</strong>はプロシージャを跨いで使うのでPublicで宣言しておきます</p>



<h3 class="wp-block-heading">GetOutlookMail</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Sub GetOutlookMail()
Dim oApp As New Outlook.Application
Dim oNS As Outlook.Namespace
Dim oFld As Outlook.Folder

&#39;---画面更新処理を止めておく
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

&#39;---出力するシートの設定
Set ws = CreateSheet
ws.Select
ws.Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)).EntireRow.Delete

&#39;---MAPIをセット
Set oNS = oApp.GetNamespace(&quot;MAPI&quot;)
For Each oFld In oNS.Folders
    &#39;---アカウント名を継承させながらフォルダを再帰処理しながら検索する
    Call SearchFolder(oFld.Name, &quot;&quot;, oFld)
Next
Set oNS = Nothing

Set ws = Nothing
&#39;---画面更新処理を復旧させる
With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With

&#39;---終了メッセージ
MsgBox &quot;更新完了しました&quot;
End Sub</code></pre></div>



<p class="wp-block-paragraph">メインのプロシージャです</p>



<p class="wp-block-paragraph">これ自体にはたいして説明する部分はないですが、画面更新を止めるのは個人的なお作法です</p>



<p class="wp-block-paragraph">ポイントは<strong>GetNamespace(&#8220;MAPI&#8221;)</strong>で、ここでOutlookのデータ階層にアクセスして、<strong><span class="swl-marker mark_yellow">アカウントごとのフォルダを順番にたどっていきます</span></strong></p>



<h3 class="wp-block-heading">SearchFolder</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Private Function SearchFolder(Account As String, FolderPath As String, TargetFolder As Outlook.Folder)
&#39;==============================
&#39;メールフォルダを再帰処理で検索する
&#39;==============================
Dim oFld As Outlook.Folder

&#39;---同期の問題と同期の失敗フォルダを除外する処置
If TargetFolder.Name Like &quot;同期の*&quot; Then
    Exit Function
End If

&#39;---フォルダタイプがメールだったら中のメール情報を取得する
If TargetFolder.DefaultItemType = olMailItem Then
    Call GetMailData(Account, FolderPath, TargetFolder)
End If

&#39;---フォルダ情報をパンくず形式で継承しつつ再帰処理させる
For Each oFld In TargetFolder.Folders
    Call SearchFolder(Account, FolderPath & IIf(Len(FolderPath) &gt; 0, &quot; &gt; &quot;, &quot;&quot;) & oFld.Name, oFld)
Next
End Function</code></pre></div>



<p class="wp-block-paragraph">Outlookがアカウントを起点としたフォルダ構成になっているので、<strong><span class="swl-marker mark_yellow">再帰処理で順番にフォルダを巡りながら</span></strong>、そのフォルダからメール情報を取得するようにしています</p>



<p class="wp-block-paragraph">フォルダの中には連絡先などメールフォルダではないものがあるので、メールを取得する対象かどうか<strong>DefaultItemType</strong>で判定しています</p>



<h3 class="wp-block-heading">GetMailData</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Private Function GetMailData(Account As String, TargetFolderName As String, TargetFolder As Outlook.Folder)
&#39;==============================
&#39;対象フォルダからメール情報を取得してエクセルに反映させる
&#39;==============================
Dim oItems As Outlook.Items
Dim oItem As Outlook.MailItem
Dim oAtt As Outlook.Attachment
Dim i As Long
Dim lngRow As Long
Dim rc As Long
Dim strFilter
Dim savePath As String

With ws
    .Select
    Set oItems = TargetFolder.Items
    &#39;---ステータスバーに取得フォルダ等を表示する
    Application.StatusBar = &quot;「&quot; & Account & &quot;」の「&quot; & TargetFolderName & &quot;」から&quot; & oItems.Count & &quot;件のデータ取得中・・・&quot;
    &#39;---取得したメールを反映させる
    For i = 1 To oItems.Count
        &#39;---データがメールタイプじゃない可能性があるので確認して取得する
        If oItems(i).Class = olMail Then
            &#39;---入力行（最下行の次）を取得する
            lngRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            &#39;---メールアイテムを変数にセットする
            Set oItem = oItems(i)
            .Cells(lngRow, lngCol.Account).Value = Account
            .Cells(lngRow, lngCol.FolderName).Value = TargetFolderName
            .Cells(lngRow, lngCol.SenderEmailAddress).Value = oItem.SenderEmailAddress
            .Cells(lngRow, lngCol.MailTO).Value = SplitMailStr(oItem.To, oItem.Recipients)
            .Cells(lngRow, lngCol.MailCC).Value = SplitMailStr(oItem.CC, oItem.Recipients)
            .Cells(lngRow, lngCol.MailBCC).Value = SplitMailStr(oItem.BCC, oItem.Recipients)
            .Cells(lngRow, lngCol.ReceivedTime).Value = oItem.ReceivedTime
            With .Cells(lngRow, lngCol.MailSubject)
                .NumberFormatLocal = &quot;@&quot; &#39;---先頭文字が=(イコール)などで始まるとエラーになるから表示形式を文字列にする
                .Value = oItem.Subject
                .WrapText = False &#39;---折り返し表示すると動作が重くなるので解除する
                .NumberFormatLocal = &quot;G/標準&quot; &#39;---表示形式を標準に戻す
            End With
            With .Cells(lngRow, lngCol.MailBody)
                .NumberFormatLocal = &quot;@&quot; &#39;---本文が=(イコール)で始まるとエラーになるから表示形式を文字列にする
                .Value = oItem.Body
                .WrapText = False &#39;---折り返し表示すると動作が重くなるので解除する
                .NumberFormatLocal = &quot;G/標準&quot; &#39;---表示形式を標準に戻す
            End With
            &#39;---添付ファイルを取得する
            .Cells(lngRow, lngCol.AttachmentsCount).Value = oItem.Attachments.Count
            For Each oAtt In oItem.Attachments
                &#39;---受信日時をベースにフルパスフォルダ名を決める
                savePath = ThisWorkbook.Path & &quot;\att\&quot; & Format(oItem.ReceivedTime, &quot;yyyymmdd_hhmm&quot;)
                &#39;---多重階層フォルダを作成する
                rc = SHCreateDirectoryEx(0&, savePath, 0&)
                &#39;---ここで実際にフォルダを作成する
                oAtt.SaveAsFile savePath & &quot;\&quot; & oAtt.Filename
            Next
            &#39;---内外全てにグレー罫線を引く
            With .Range(Cells(lngRow, lngCol.Account), Cells(lngRow, lngCol.AttachmentsCount)).Borders()
                .LineStyle = xlContinuous
                .Weight = xlThin
                .Color = RGB(128, 128, 128)
            End With
            Set oItem = Nothing
        End If
    Next
    &#39;---ステータスバーをリセットする
    Application.StatusBar = False
End With
End Function</code></pre></div>



<p class="wp-block-paragraph">これがズバリ、メール情報の取得部分でポイントが何点か・・・</p>



<p class="wp-block-paragraph">For Nextでループしているとメールタイプじゃないアイテムも検知してしまい、型エラーの原因になるので<strong><span class="swl-marker mark_yellow">Classでメールかどうか判断しています</span></strong></p>



<p class="wp-block-paragraph">TO・CC・BCCはそのままだと連絡先のエイリアスが反映してしまい、メアドがわからなくなってしまうので、サブプロシージャで変換するようにします</p>



<p class="wp-block-paragraph">件名と本文はExcelに反映させた時、標準書式の状態で<strong>=</strong>や<strong>@</strong>が先頭だと数式判定になってエラーになるので、反映前に文字列化→反映→標準書式へ戻す手順で反映させています</p>



<p class="wp-block-paragraph">添付ファイルを取得する時に、メールとの紐づきがわかるように受信日時のフォルダを作成してそこに保存するようにしていますが、判断しにくいなら適当に編集してもらえれば大丈夫です</p>



<h3 class="wp-block-heading">SplitMailStr</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Private Function SplitMailStr(MailStr As String, RecipientsData As Recipients)
&#39;==============================
&#39;宛先が複数ある場合は;（セミコロン）区切りになっているので一度分解してChangeAliasで変換した後に結合する
&#39;==============================
Dim i As Long, MailArray As Variant

MailArray = Split(MailStr, &quot;;&quot;)
For i = LBound(MailArray) To UBound(MailArray)
    MailArray(i) = ChangeAlias(MailArray(i), RecipientsData)
Next
SplitMailStr = Join(MailArray, &quot;;&quot;)
End Function</code></pre></div>



<p class="wp-block-paragraph">次の<strong>ChangeAlias</strong>のためのサブプロシージャです</p>



<p class="wp-block-paragraph">TOやCCに複数名設定されているとセミコロン（;）をデリミタで結合された状態になっていて、エイリアス→メアドの変換がうまくできないので、分解してそれぞれにChangeAliasします</p>



<h3 class="wp-block-heading">ChangeAlias</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Private Function ChangeAlias(Alias As Variant, RecipientsData As Recipients)
&#39;==============================
&#39;宛先情報がエイリアスになっている場合があるからメアドに変換する
&#39;==============================
Dim RecipientData As Recipient
&#39;---@が含まれているならメアドなのでそのまま
If Alias Like &quot;*@*&quot; Then
    ChangeAlias = Alias
    Exit Function
End If

&#39;---表示名が受信者情報と一致していたらアドレスに変換する
For Each RecipientData In RecipientsData
    If Trim(RecipientData.Name) = Trim(Alias) Then
        ChangeAlias = RecipientData.Address
        Exit Function
    End If
Next

&#39;---変換できなかったらそのまま返す ※ココに到達することはないはず
ChangeAlias = Alias
End Function</code></pre></div>



<p class="wp-block-paragraph"><strong>GetMailData</strong>にも書いた通り、エイリアスをメアドに変える処理です</p>



<p class="wp-block-paragraph">Recipientsの中にエイリアスとメアドのセット情報があるので、変換元になるエイリアスと一致したら<strong><span class="swl-marker mark_yellow">メアドを返してあげます</span></strong></p>



<h3 class="wp-block-heading">CreateSheet</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Private Function CreateSheet(Optional SheetName = &quot;OUTPUT&quot;) As Worksheet
Set CreateSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
With CreateSheet
    &#39;---シート名を変えるけど重複する可能性があるのでエラー無視する
    On Error Resume Next
    .Name = SheetName
    On Error GoTo 0
    &#39;---ヘッダー部の設定
    .Cells(1, lngCol.Account).Value = &quot;Account&quot;
    .Cells(1, lngCol.FolderName).Value = &quot;FolderName&quot;
    .Cells(1, lngCol.SenderEmailAddress).Value = &quot;SenderEmailAddress&quot;
    .Cells(1, lngCol.MailTO).Value = &quot;MailTO&quot;
    .Cells(1, lngCol.MailCC).Value = &quot;MailCC&quot;
    .Cells(1, lngCol.MailBCC).Value = &quot;MailBCC&quot;
    .Cells(1, lngCol.ReceivedTime).Value = &quot;ReceivedTime&quot;
    .Cells(1, lngCol.MailSubject).Value = &quot;MailSubject&quot;
    .Cells(1, lngCol.MailBody).Value = &quot;MailBody&quot;
    .Cells(1, lngCol.AttachmentsCount).Value = &quot;AttachmentsCount&quot;
    With .Range(Cells(1, lngCol.Account), Cells(1, lngCol.AttachmentsCount))
        .EntireColumn.ColumnWidth = 19.88
        .Interior.Color = RGB(191, 191, 191)
        With .Borders()
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(128, 128, 128)
        End With
    End With
End With
End Function</code></pre></div>



<p class="wp-block-paragraph">出力先になるシートをセットします</p>



<p class="wp-block-paragraph">ヘッダーの文字に書式と罫線を設定していますが、内容はお好みでどうぞ</p>



<h2 class="wp-block-heading">あとがき</h2>



<p class="wp-block-paragraph"><strong>ChangeAlias</strong>をはじめ、満足な結果を得るためには面倒な箇所があったので、地味に時間がかかりました・・</p>



<p class="wp-block-paragraph">実際にExcelでマクロにするときは取得対象期間を設定できるようにしたり改修の余地はあるのですが、プログラムだけで公開するとややこしくなるのでここでは反映していません</p>



<p class="wp-block-paragraph">私はこのマクロで目的を達成しましたが、他にも取得できる情報はあるので、上記プログラムでは不十分な方がいればコメントいただけると改修して更新しますね</p>



<p class="wp-block-paragraph">VBAでメールまわりを触る話だと、送信側を自動化したい方も多いと思います、GmailをVBAから送る方法は<a href="https://javeo.jp/vba-gmail-send/" target="_blank" rel="noopener noreferrer">VBAでGmailを送信する（CDO）</a>でまとめているので、あわせてどうぞ</p>


<div class="p-blogParts post_content" data-partsID="4601">
<div class="jv-books" id="jv-books-vba" data-shelf="vba"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> VBAの独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5722/9784839975722_1_2.jpg?_ex=240x240" alt="Excel VBA塾【動画×本で学ぶ!】" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Excel VBA塾【動画×本で学ぶ!】</p><p class="jv-book-author">たてばやし淳</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4839975728">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4839975728">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8755/9784297108755.jpg?_ex=240x240" alt="パーフェクトExcel VBA" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">パーフェクトExcel VBA</p><p class="jv-book-author">高橋宣成</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4297108755">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4297108755">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1291/9784815631291.jpg?_ex=240x240" alt="Excel マクロ&amp;VBA［実践ビジネス入門講座］完全版 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">Excel マクロ&amp;VBA［実践ビジネス入門講座］完全版 第3版</p><p class="jv-book-author">国本温子</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="amazon" data-book="4815631298">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="vba" data-mall="rakuten" data-book="4815631298">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='vba';
var root=document.getElementById('jv-books-'+SHELF);
if(!root||root.dataset.init)return;
root.dataset.init='1';
var POOL=[{"t": "Excel VBA塾【動画×本で学ぶ!】", "a": "たてばやし淳", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/5722/9784839975722_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839975728?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16918602%2F", "id": "4839975728"}, {"t": "パーフェクトExcel VBA", "a": "高橋宣成", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8755/9784297108755.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4297108755?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16076590%2F", "id": "4297108755"}, {"t": "Excel マクロ&VBA［実践ビジネス入門講座］完全版 第3版", "a": "国本温子", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1291/9784815631291.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4815631298?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18165619%2F", "id": "4815631298"}, {"t": "増強改訂版 できる イラストで学ぶ 入社1年目からのExcel VBA", "a": "きたみあきこ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8414/9784295018414.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295018414?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17725381%2F&m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17725381%2F", "id": "4295018414"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/get-outlook-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
