🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Outlook — マクロからメールを送る(そして New Outlook が壊すもの)

|

Excel VBA の Outlook — マクロからメールを送る(そして New Outlook が壊すもの)

検証環境: Excel 365 v2509 · Excel 2021 · Excel 2019(クラシック Outlook)· 最終確認 2026-06-12

要点 — Excel からメールを送るとは、別の アプリのオブジェクトモデルを操ることです。重要な決断は 2 つ。どう Outlook につなぐか(遅延バインディングCreateObject が移植性のある選択)と、どう送るか(.Display で安全に確認、.Send で即送信してセキュリティの確認に当たる)。先に一つ:「New Outlook」は VBA サポートを完全に削除しました — これが動くのは クラシック Outlook だけです。

Sub SendFromExcel()
    Dim olApp As Object, mail As Object
    Set olApp = CreateObject("Outlook.Application")   ' 遅延バインディング — 参照設定は不要
    Set mail = olApp.CreateItem(0)                    ' 0 = olMailItem

    With mail
        .To = "[email protected]"
        .Subject = "日次レポート"
        .Body = "数値を添付します。— Excel から送信"
        .Attachments.Add ThisWorkbook.FullName
        .Display                                       ' 確認する。即送信は .Send
    End With

    Set mail = Nothing
    Set olApp = Nothing
End Sub

考え方の軸:あなたは Excel のコードでなく、別アプリを遠隔操作している

マクロの他のすべては Excel と話します。これは違います。CreateObject("Outlook.Application")別の プログラムへ手を伸ばして操ります。これが以下のすべての問いを組み替えます:Outlook につなぐのはアプリ間の握手(だからバージョンの違いが効く)であり、メールを送るのは Excel が自分のセルには決して課さない セキュリティの境界 を越えること(だから同意の確認の壁は仕様であってバグではない)です。

この絵を持てば、本当の 2 つの決断が見えてきます。第一に、どう Outlook への取っ手を得るか — 参照設定で早く結ぶか、CreateObject で遅く結ぶか。第二に、実際にどう送るか — 下書きを出して人に確認させるか、送ってセキュリティの確認に出会うか。この 2 つを正せば、あとは .To.Subject.Body を埋めるだけです。

唯一のルール:遅延バインディング(CreateObject)は旅をし、事前バインディングは一台に縛る

これが、マクロを同僚にメールしても生き残るかを決める決断です。

事前バインディング は参照設定が要ります(ツール → 参照設定 → Microsoft Outlook XX.0 Object Library)。IntelliSense と olMailItem のような名前付き定数が手に入ります — が、ファイルはその正確なライブラリ版に縛られ、別バージョンの Outlook の PC では 「プロジェクトまたはライブラリが見つかりません」 を投げます。遅延バインディングCreateObject("Outlook.Application")、変数は Object 型)は参照設定なし、バージョンをまたいで動き、共有するコードの正しい既定です。

遅延バインディングの代償は、名前付き定数が存在しないこと — 数値を使います:CreateItem(olMailItem) でなく CreateItem(0)。移植性のための小さな代価です。

' ✓ 遅延バインディング — 移植可能、参照設定なし、バージョン差に耐える
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
Dim mail As Object
Set mail = olApp.CreateItem(0)        ' 0 = olMailItem(定数はここには存在しない)

' 事前バインディング(参照設定あり)ならこう書ける:
'   Dim olApp As Outlook.Application
'   Set mail = olApp.CreateItem(olMailItem)
' ...が別バージョンの Outlook では「プロジェクトまたはライブラリが見つかりません」で壊れる。

コードを 書いている 間は事前バインディングを使い — IntelliSense は本当に助かります — 共有する前に遅延バインディングへ切り替えます。(新規に起動するのでなく既存のインスタンスを探すなら、GetObjectCreateObject と対になります。)

罠:.Send はセキュリティの壁に当たる — たいていは .Display が欲しい

第二の決断は、メールがどう出ていくか。.Send は即座に発送します — そして多くの構成で、これは Outlook のプログラムによるアクセスの保護、「プログラムがあなたの代わりにメールを送ろうとしています」 の確認、あるいはポリシーによる拒否を引き起こします。

.Display     ' ✓ 下書きを開き、人が確認して送信をクリック — セキュリティの確認なし
.Send        ' ⚠ 即送信。セキュリティの確認、またはポリシーによるブロックを覚悟

.Display は人をループに残すことで問題全体を回避します:メールが、完全に埋まった状態で開き、その人が送信をクリックします。「50 通の個別メールを下書きして、私が目を通して送る」流れなら、これは制約ではなく — より安全な設計です。.Send は信頼された無人の自動化に取っておき、それを静かに動かすとは、一行の修正ではなくセキュリティモデル(信頼できる場所、Exchange のポリシー、Redemption のようなツール)に対処することだと知っておきましょう。

コードで回避できない壁:New Outlook には VBA がない

これは古いチュートリアルが触れない部分で、2026 年のここで最も重要なことです。

「New Outlook」 — Microsoft が既定として展開している、作り直された Web ベースのクライアント — は VBA も COM アドインもマクロも一切サポートしません。 VBA エディターも ThisOutlookSession も、自動化できる Outlook.Application もありません。本記事のすべては クラシック Outlook を要します。

これは憶測ではなく、Microsoft が表明した方向であり、公式の代替は新しい VBA ではなく Power Automate です。クラシック Outlook は今日まだ動き、CreateObject("Outlook.Application") は今もそれを操ります — が、あなたは今、自社のベンダーが引退の印を付けたクライアントを自動化しています。どこに投資するか選ぶなら、これは効きます:クラシック Outlook 経由で送るマクロは、すでに更地化が始まった土地に立っています。

どれをいつ使うか

目的 使うもの
PC をまたいで共有するコード 遅延バインディング — CreateObject("Outlook.Application")
今まさに書いているコード(IntelliSense が欲しい) 参照設定で事前バインディング、共有前に切り替え
送信前に人に確認させる .Display
無人で送る(信頼された自動化のみ) .Send(セキュリティモデルを覚悟)
ブックを添付する .Attachments.Add ThisWorkbook.FullName
受信 メールに反応する ThisOutlookSession + WithEvents(クラシック Outlook のみ)

意見:2026 年に新しい自動化を Outlook VBA の上に作るな

私が約束する一線:ゼロから始めるなら、メール自動化を Outlook VBA に錨で固定するな。 クラシック Outlook では今日動きますし、すでに動いているマクロがあるなら、そのまま動かしてください。でも Microsoft は明言しました:New Outlook — 新規インストールの既定 — に VBA はなく、「既定」とは、ユーザーが選ぼうと選ぶまいと向かっていく先です。Outlook.Application に対して真新しいマクロを書くのは、大家がすでに解体予告を貼った土台に建てることです。

だから既存の Outlook VBA は、拡張する型ではなく保守するレガシーとして扱いましょう。新しい「Excel が外の世界に届く」自動化 — メール、スケジュール、アプリ間の移動 — が要るなら、Microsoft が取り除いているプロセスモデルに依存しないものを選びます。CreateObject を配線しセキュリティの確認と戦うのに費やす数分は、New Outlook の展開が終わったあとも存在するアプローチに使うほうがよいのです。

よくある VBA Outlook のミス(と直し方)

症状 原因 直し方
別の PC で「プロジェクトまたはライブラリが見つかりません」 事前バインディングが特定の Outlook 版に縛られた 遅延バインディングへ(CreateObjectAs Object
.Send ごとにセキュリティの確認 プログラムによるアクセスの保護が仕事をしている .Display を使う、または .Send 用にセキュリティモデルに対処
429 /「オブジェクトを作成できません」 New Outlook(VBA なし)か Outlook 未インストール クラシック Outlook が必要
olMailItem が未定義 参照設定なし(遅延バインディング) 数値を使う:CreateItem(0)
添付が見つからない ブック未保存で FullName が名前だけ 先に保存、Attachments.Add にフルパスを渡す
Outlook が開いたまま / メモリリーク オブジェクトを解放していない Set mail = NothingSet olApp = Nothing

メール自動化が積み上がってきたら — 代わりに「やりたいこと」を伝える

あなたはバインディングモードとセキュリティの確認を学ぶつもりはありませんでした。「毎週月曜、各マネージャーにそのチームの数値をメールしたい」だっただけです。遅延バインディングを選び、.Send の壁を .Display でかわし、ユーザーの半分が何も動かない New Outlook だと気づく頃には、配管が午前を食い尽くしています。ExcelMaster Agent なら、結果を自然な日本語で説明できます — 「このシートをマネージャーごとに分けて、各人に自分の行を添付したメールを下書きして」 — すると Microsoft が引退させつつあるプロセスモデルに頼らずそれを行い、ブックを先にバックアップします。無料で試す →

関連ガイド

よくある質問

Excel から VBA でメールを送るには? CreateObject("Outlook.Application") で Outlook の application オブジェクトを作り、CreateItem(0) でメールアイテムを作り、.To.Subject.Body を設定してから、確認するなら .Display、送るなら .Send を呼びます。どの Outlook 版でも動くよう遅延バインディング(As Object)を使い、これには クラシック Outlook が要ることを忘れずに。

Outlook の事前バインディングと遅延バインディングの違いは? 事前バインディングは Microsoft Outlook Object Library への参照設定が要り、IntelliSense と olMailItem のような定数をくれますが、ファイルを一つの Outlook 版に縛ります。遅延バインディングは CreateObjectAs Object 変数を使い — 参照設定なしで完全に移植可能 — 代わりに olMailItem でなく 0 のような数値を使います。共有は遅延バインディングで。

VBA の .Send がセキュリティ警告を出すのはなぜ? Outlook のプログラムによるアクセスの保護が「プログラムがあなたの代わりにメールを送ろうとしています」を表示し、マルウェアが静かに送るのを防ぎます。.Display を使って人が送信をクリックすれば、確認は完全に回避できます。無人で送るにはセキュリティモデル — 信頼できる場所、Exchange のポリシー、Redemption のようなツール — を満たす必要があります。

New Outlook で VBA は動く? いいえ。New Outlook — Microsoft が既定にしている Web ベースのクライアント — には VBA も COM アドインもマクロサポートもありません。CreateObject("Outlook.Application") が操るのは クラシック Outlook だけです。自動化について Microsoft が推奨する代替は Power Automate です。

VBA で Outlook メールにファイルを添付するには? .Attachments.Add にフルパスを渡します:.Attachments.Add ThisWorkbook.FullName で現在のブックを添付します。先にブックを保存してください。さもないと FullName はパスなしのファイル名だけを返し、添付が見つかりません。