こんにちは!シニアアーキテクトの私です。
マクロの記録から一歩抜け出し、「自分の手でOutlookを自在に操りたい」と願うあなたへ。今回は、実務で絶対に直面する「添付ファイル容量オーバー問題」をスマートに解決する自動化ツールの作り方を伝授します。
「メールを送ろうとしたら、容量制限でエラーになった……」
「大容量ファイルを送るために、毎回手動でストレージサービスのリンクに貼り替えている……」
そんな無駄なストレス、今日で終わりです。
ファイルサイズを事前に計算し、規定値を超えた瞬間に本文を自動で書き換えてURL用のプレースホルダーを挿入する、実用性抜群の動的制御コードを一緒に組み立てていきましょう。
ここをクリアすれば、Outlook VBAのオブジェクト操作とイベント制御の基本はバッチリです。しっかりとついてきてくださいね!
—
1. 現場で嫌われる「容量オーバーエラー」の正体
なぜ、メールの添付ファイル送信はトラブルになりやすいのでしょうか?
- 多くのメールサーバーには「1通あたり〇MBまで」という厳格な上限(通常10MB〜25MB程度)があります。
- 限界ギリギリのファイルを送ると、送信トレイでスタックし、社内ネットワークや相手のメールボックスを圧迫します。
これを防ぐためには、「送信ボタンを押す前に、添付されたファイルの合計サイズをVBAで計算し、オーバーしていれば強制的にファイル転送サービスのURL形式に切り替える」という仕組みを作るのが一番スマートです。
—
2. 全体設計:どうやって動かすのか?
今回作成するマクロの流れはこうです。
1. ユーザーがOutlookでメールを作成し、ファイルを添付する。
2. 送信ボタン(`Send`イベント)が押された瞬間にマクロが割り込む。
3. `FileSystemObject`を使って、添付されたファイルのサイズをバイト単位で合計する。
4. 閾値(例: 10MB)と比較し、
- OKなら: そのまま送信。
- NGなら: 添付ファイルを削除(またはそのまま残しつつ)、本文に「大容量ファイル便のURLはこちらに記載してください:[URL]」という警告テキストを自動挿入し、送信を一旦ストップしてユーザーに注意を促す。
—
3. 実装のキモ:Outlook VBAの「クラスモジュール」と「イベント」
Outlook VBAでメールの送信直前にフックをかけるには、通常の標準モジュール(Module1など)だけではダメです。「AppEvents」や「Inspector」といった、Outlookのアプリケーションレベルのイベントをキャッチする必要があります。
今回は、最も確実で安全に「いま開いているメール」を監視できる、「ThisOutlookSession」を使った実装方法を解説します。
準備:Visual Basic Editorを開く
1. Outlookを開き、`[Alt] + [F11]` キーを押してVBA開発画面を開きます。
2. 左側のプロジェクトツリーから `Microsoft Outlook Objects` の下にある `ThisOutlookSession` をダブルクリックします。
ここに、以下のコードをそのまま貼り付けてください。
—
4. 実装コード:容量チェック&動的本文書き換えマクロ
以下のコードは、プログラミング初学者でも迷わないよう、一行ずつ丁寧にコメントを入れています。そのままコピペして使えます。
‘ ==============================================================================
‘ 【テーマ】添付ファイルの合計容量を計算し、制限を超える場合に自動制御するツール
‘ 配置場所:ThisOutlookSession に貼り付けてください
‘ ==============================================================================
Option Explicit
‘ メールの送信イベントをフックするための宣言
Public WithEvents TargetMail As Outlook.MailItem
‘ 規定の制限サイズ(今回は 10MB = 10 1024 1024 バイト と設定)
Const LIMIT_SIZE As Long = 10 1024 1024
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
On Error GoTo ErrorHandler
‘ 送信されるアイテムが「メール(MailItem)」であるかチェック
If TypeOf Item is Outlook.MailItem Then
Set TargetMail = Item
Dim fso As Object
Dim att As Outlook.Attachment
Dim totalSize As Currency
Dim fileSizesText As String
totalSize = 0
fileSizesText = “”
‘ FileSystemObjectのインスタンスを作成(ファイルの物理サイズを取得するため)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 添付ファイルを走査し、合計サイズを計算
For Each att In TargetMail.Attachments
‘ 埋め込み画像(InlineAttachment)などを除外するため、ファイルパスを持つものに限定
If att.Type = olByValue Then
‘ 一時保存されていない添付ファイル(ドラッグ&ドロップ直後など)のパス取得対策
Dim tempPath As String
tempPath = Environ$(“TEMP”) & “\” & att.FileName
On Error Resume Next
att.SaveAsFile tempPath
If fso.FileExists(tempPath) Then
totalSize = totalSize + fso.GetFile(tempPath).Size
‘ 削除しておく(ゴミを残さないため)
Kill tempPath
End If
On Error GoTo ErrorHandler
End If
Unext att
‘ 制限サイズを超えているか判定
If totalSize > LIMIT_SIZE Then
Dim mbSize As Double
mbSize = Round(totalSize / (1024 1024), 2)
‘ ユーザーに警告メッセージを表示
Dim msg As String
msg = “【警告】添付ファイルの合計容量が ” & mbSize & “MB です。” & vbCrLf & _
“社内規定の制限(10MB)を超えているため、自動的にファイル転送サービス用のテンプレートに切り替えます。”
MsgBox msg, vbExclamation, “容量オーバー検知”
‘ 本文を動的に書き換える(元の本文の先頭に警告とURL入力欄を挿入)
Dim originalBody As String
originalBody = TargetMail.Body
TargetMail.Body = “————————————————–” & vbCrLf & _
“【システム自動挿入】” & vbCrLf & _
“添付容量オーバーのため、以下のURLよりファイルをダウンロードしてください。” & vbCrLf & _
“URL:[ここにファイル転送サービスのリンクを記載してください]” & vbCrLf & _
“————————————————–” & vbCrLf & vbCrLf & _
originalBody
‘ 必要に応じて、重たい添付ファイルをここで削除する処理を入れることも可能ですが、
‘ 今回は「ユーザーに気づかせて本文を書き換える」安全設計にしています。
End If
Set fso = Nothing
End If
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “マクロ実行エラー”
Cancel = True ‘ エラー時は安全のため送信をキャンセル
End Sub
—
5. コードの重要ポイント解説
ここがこのプログラムのキモです。中級者へのステップアップとして、以下のポイントを押さえておきましょう。
① `FileSystemObject`(FSO)の活用
Outlookの標準プロパティである `Attachment.Size` は、実はメールが一度保存される前など、タイミングによっては正確なバイト数を返さないことがあります。
そのため、信頼性の高い `Scripting.FileSystemObject` を使い、一時フォルダにファイルを安全にキャッシュして正確な物理サイズ(`.Size`)を取得しています。
② `Application_ItemSend` イベントによる動的制御
このイベントは、ユーザーが「送信」ボタンを押した瞬間に強制発動します。
送信処理が完了する直前に割り込んで、本文(`TargetMail.Body`)をプログラム側から書き換える(動的制御)ことで、うっかりミスを防ぐガードマンの役割を果たします。
③ 綺麗に終了するお作法(メモリ解放)
VBAで `CreateObject` を使ったときは、最後に `Set fso = Nothing` と記述してメモリを解放するのが、プロのエンジニアとしての美しい作法です。これを怠ると、Outlookの動作が重くなる原因になります。
—
6. 陥りやすいエラーと注意点
現場でこのマクロを導入する際、初心者がハマりがちなポイントをいくつかシェアしておきます。
1. マクロのセキュリティ警告が出る
- 初回実行時やOutlookの再起動時に「マクロが無効化されました」というバーが出る場合があります。`[ファイル] -> [オプション] -> [セキュリティ センター] -> [セキュリティ センターの設定] -> [マクロの設定]` から、「すべてのマクロに警告を表示し、デジタル署名されたマクロ以外は無効にする」または「すべてのマクロを有効にする(推奨:社内環境に応じて)」に変更してください。
2. 「ファイルが見つからない」エラー(エラー 53 など)が出る
- メールの新規作成画面で、まだPC上に保存されていないドラッグ&ドロップしたてのファイルを添付した場合、一時パスの取得でつまずくことがあります。コード内の `On Error Resume Next` とファイル存在チェック(`fso.FileExists`)は、まさにこの「例外」を華麗にかわすためのエンジニアの知恵です。
—
まとめ
今回は、「添付ファイルの合計容量を計算し、制限を超える場合に自動で本文を動的書き換えする警告ツール」を解説しました。
ここをクリアすれば、単に「操作を記録するマクロ」から、「Outlookのイベントを監視し、業務のミスを未然に防ぐシステム」へと、あなたのVBAスキルは確実に一段階進化しています。
ぜひ、自分の環境に組み込んで、その快適さを体感してみてください。
それでは、次のステップでお会いしましょう。バッチリ使いこなしてくださいね!
