こんにちは!日々のメール業務、本当にお疲れ様です。
「複数のメールアカウントを使い分けているけれど、Outlook VBAでマクロを走らせたら、いつも決まった『既定のアカウント』から送信されてしまい、別の部署や配信用のアカウントから送れなくて困った……」
そんな壁にぶつかっていませんか?
マクロの記録から一歩抜け出し、実務でバリバリ使える自動化を目指すあなたへ。今回は、Outlook VBAで複数のメールアカウントを自在に操り、宛先や条件に応じて送信元(From)をスマートに切り替える極意を伝授します。
ここをクリアすれば、Outlook VBAのオブジェクトモデルの本質が見えてきます。優しく、そして深く解説していきますので、ぜひ最後までついてきてくださいね!
—
1. なぜ「送信元のアカウント切り替え」でつまづくのか?
初学者がまずやりがちなのが、`CreateItem` でメールを作成した後に、そのまま `Send` メソッドを叩いてしまうパターンです。これだと、Outlookのアプリ側で「現在選択されている(既定の)アカウント」から強制的に送信されてしまいます。
業務で複数のアカウント(個人のメール、代表メール、プロジェクト用アドレスなど)を使い分けている場合、これでは大惨事になりかねません。
Outlook VBAにおける「送信元」の2つのアプローチ
実は、送信元を制御する方法には大きく分けて2つあります。
1. `SentOnBehalfOfName` プロパティを使う方法
- 「〜を代理して送信する」という形式。権限さえあれば別のアカウント名義で送れますが、セキュリティ制限や組織のポリシーに引っかかることがあります。
2. `Account` オブジェクトを明示的に指定する方法(★今回おすすめする本命)
- Outlookに登録されているアカウントのリストから、プログラムで「このアカウントを使ってね!」と直接指定する方法です。確実でモダンなアプローチと言えます。
—
2. 【実践】複数アカウントを列挙し、動的に切り替えるVBAコード
それでは、実務でそのままコピー&ペーストして使える実用的なコードをお見せします。
このコードは、宛先のドメインや特定のキーワードに応じて、どのアカウントから送信するかを自動判定するロジックを組み込んでいます。
Sub CreateMailWithSpecificAccount()
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim olAccounts As Outlook.Accounts
Dim olAccount As Outlook.Account
Dim targetAccountName As String
Dim sendTo As String
Dim foundAccount As Boolean
‘ 1. アプリケーションとメールアイテムの初期化
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(olItem)
‘ 2. 送信先の指定(テスト用に書き換えてください)
sendTo = “client@example.com”
‘ ===================================================================
‘ 3. 送信元アカウントを動的に決定するロジック
‘ ===================================================================
‘ 例:宛先のドメインによって使い分ける
If InStr(sendTo, “@internal-domain.com”) > 0 Then
targetAccountName = “社内連絡用アカウント
Else
targetAccountName = “外部案件用アカウント
End If
‘ 4. Outlookに登録されているアカウント群から合致するものを検索
Set olAccounts = olApp.Session.Accounts
foundAccount = False
For Each olAccount In olAccounts
‘ アカウントのDisplayName(表示名やメールアドレス)に部分一致するか確認
If InStr(olAccount.DisplayName, targetAccountName) > 0 Then
‘ 【重要】該当するアカウントオブジェクトをメールに紐付ける
Set olMail.SendUsingAccount = olAccount
foundAccount = True
Exit For
End If
Next olAccount
‘ 5. アカウントが見つからなかった場合の安全装置
If Not foundAccount Then
MsgBox “指定されたアカウントが見つかりませんでした。既定のアカウントで作成します。”, vbExclamation, “警告”
‘ 必要に応じて処理を抜ける(Exit Sub)などのハンドリングを追加してください
End If
‘ 6. メールのプロパティを設定して画面に表示
With olMail
.To = sendTo
.Subject = “【自動作成】マルチアカウントテストメール”
.Body = “いつもお世話になっております。” & vbCrLf & _
“このメールは適切なアカウントから自動送信されています。”
‘ すぐに送信せず、下書きまたは画面表示して人間が最終確認する場合
.Display
‘ ※完全に自動送信する場合は .Display の代わりに .Send を使います
End With
‘ 7. オブジェクトの解放(メモリリークを防ぐプロの作法)
Set olMail = Nothing
Set olAccounts = Nothing
Set olApp = Nothing
MsgBox “メールの作成が完了しました!”, vbInformation, “完了”
End Sub
—
3. コードのキモを徹底解説!知っておくべき3つのポイント
先輩エンジニアとして、このコードの特に重要なポイントを3つ解説しておきます。ここを押さえておけば、どんな複雑な要件が来ても怖くありません。
① `olApp.Session.Accounts` で全アカウントを掴む
Outlookには複数のメールアドレス(プロファイル)が登録されています。`Session.Accounts` は、現在Outlookが認識しているすべてのアカウントの「コレクション(一覧の箱)」を返します。これを `For Each` で総なめにして、目当てのアカウントを探し出すのが基本戦術です。
② `SendUsingAccount` プロパティの威力
見つけた `Account` オブジェクトを、作成した `MailItem` の `.SendUsingAccount` に代入する。これが今回の最大のハイライトです。
これにより、「このメールはこのアカウントから送りなさい」という強力なアンカー(錨)を打つことができます。
③ 丁寧なオブジェクトの解放(メモリ管理)
コードの最後で `Set olMail = Nothing` などの解放処理を行っています。VBAは自動でメモリ掃除(ガベージコレクション)をしてくれますが、OutlookやExcelなどの外部アプリケーションを操作するCOMオブジェクトは、明示的に解放してあげないと裏でプロセスが残り続け、動作が重くなる原因になります。プロとしての美しい習慣にしましょう。
—
4. 陥りやすい罠とエラー対策
現場でこのコードを動かす際によくあるトラブルを事前にシェアしておきます。
- 罠1:「指定されたアカウントが見つかりませんでした」と出る
- 原因: コード内の `targetAccountName` の文字列と、実際のOutlook上の「アカウント名(またはメールアドレス)」が完全一致、あるいは部分一致していません。
- 対策: 一度イミディエイトウィンドウに `Debug.Print olAccount.DisplayName` と出力させて、正確な名称を確認してください。
- 罠2:セキュリティの警告が出る
- 原因: 組織のセキュリティポリシーやアンチウイルスソフトの設定によっては、VBAからの自動送信やアカウントの強制変更がブロックされることがあります。
- 対策: 必要に応じてOutlookの信頼センターの設定を見直すか、いきなり `.Send` せず `.Display` で人間の目で確認するフローを挟みましょう。
—
おわりに:ここをクリアすれば、あなたももう中級者!
お疲れ様でした!
「複数のアカウントを列挙し、条件分岐で選び出し、メールに紐付ける」という一連の流れ、イメージできましたか?
このテクニックが使えるようになると、定型業務の自動化だけでなく、部署をまたぐ複雑な一斉送信システムや、担当者ごとの送信元切り替えツールなど、作れるものの幅がグッと広がります。
「ここ、どういうことだろう?」という疑問や、「こんな応用はできる?」といった質問があれば、いつでも気軽にコメントや相談をしてくださいね。あなたのVBAライフを、私はいつも応援しています!
