検証環境: 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 は本当に助かります — 共有する前に遅延バインディングへ切り替えます。(新規に起動するのでなく既存のインスタンスを探すなら、GetObject が CreateObject と対になります。)
罠:.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 版に縛られた | 遅延バインディングへ(CreateObject、As Object) |
.Send ごとにセキュリティの確認 |
プログラムによるアクセスの保護が仕事をしている | .Display を使う、または .Send 用にセキュリティモデルに対処 |
429 /「オブジェクトを作成できません」 |
New Outlook(VBA なし)か Outlook 未インストール | クラシック Outlook が必要 |
olMailItem が未定義 |
参照設定なし(遅延バインディング) | 数値を使う:CreateItem(0) |
| 添付が見つからない | ブック未保存で FullName が名前だけ |
先に保存、Attachments.Add にフルパスを渡す |
| Outlook が開いたまま / メモリリーク | オブジェクトを解放していない | Set mail = Nothing と Set olApp = Nothing |
メール自動化が積み上がってきたら — 代わりに「やりたいこと」を伝える
あなたはバインディングモードとセキュリティの確認を学ぶつもりはありませんでした。「毎週月曜、各マネージャーにそのチームの数値をメールしたい」だっただけです。遅延バインディングを選び、.Send の壁を .Display でかわし、ユーザーの半分が何も動かない New Outlook だと気づく頃には、配管が午前を食い尽くしています。ExcelMaster Agent なら、結果を自然な日本語で説明できます — 「このシートをマネージャーごとに分けて、各人に自分の行を添付したメールを下書きして」 — すると Microsoft が引退させつつあるプロセスモデルに頼らずそれを行い、ブックを先にバックアップします。無料で試す →
関連ガイド
- VBA On Error — Resume Next と GoTo、マクロがバグを隠す理由
- VBA MsgBox — はい/いいえ・ボタンと括弧のルール
- VBA VLookup — 見つからないと落ちる罠と、Dictionary が勝つとき
- VBA Copy Paste — クリップボードを飛ばして速いマクロに
- VBA For ループ — 実務の 8 例
よくある質問
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 版に縛ります。遅延バインディングは CreateObject と As 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 はパスなしのファイル名だけを返し、添付が見つかりません。
