こんにちは!日々のメール業務、本当にお疲れ様です。
「大きなファイルを添付して送信ボタンを押したあと、容量オーバーでエラーになり、下書きに戻って添付を外し……ああ、また最初からやり直し!」
そんな冷や汗をかくような経験、あなたにもありませんか?
マクロの記録から一歩抜け出し、自分の手でOutlookを自在にコントロールしたい中級者のあなたへ。今回は、「送信直前に添付ファイルの合計容量を自動計算し、組織の制限を超える場合は警告を出してファイル転送サービスのURLに置き換える」という、実務で即戦力になるセキュリティ強化マクロを授けましょう。
ここをクリアすれば、Outlook VBAのオブジェクトモデルとイベント制御の本質がグッと見えてきますよ。さあ、一緒にプロの領域へ踏み出しましょう!
—
1. なぜこの仕組みが必要なのか?(本質的アプローチ)
Outlookの標準機能でも、添付ファイルのサイズが大きすぎると「サイズが大きすぎます」と警告が出ることはあります。しかし、単に止まるだけで「じゃあどうすればいいのか」までは導いてくれません。
私たちが目指すのは、単なるエラー回避ではありません。
「容量オーバーを検知した瞬間、自動的にファイルを切り離し、あらかじめ決めておいたファイル転送サービスの案内文(URL付き)を本文に差し込む」という、スマートでセキュアな自動化です。
これを実現するために、Outlook VBAの`ItemSend`イベントと、ファイルシステムを操るFileSystemObject (FSO)を組み合わせていきます。
—
2. 全体像の設計図
今回のプログラムの動きはこうです。
1. 送信ボタンが押される (`ItemSend` イベント)
2. メールに添付されているファイルをスキャンし、合計サイズを計算する
3. もし制限サイズ(例: 10MB)を超えていたら……
- 送信を一旦ストップ!
- メッセージボックスで警告を表示。
- 添付ファイルをメールから削除。
- 本文に「ファイル転送サービスを利用してください」という案内とダミーURLを自動挿入。
4. そのまま安全に送信、またはユーザーに再確認を促す
—
3. 実装コード(コピペで使える実用マクロ)
ここからは、Outlook VBAの心臓部である `ThisOutlookSession` モジュールにコードを書き込んでいきます。
※標準モジュールではなく、必ず左側のツリーにある `ThisOutlookSession` をダブルクリックして開いたエディタに貼り付けてください。
Option Explicit
‘ =====================================================================
‘ 処理名: 添付ファイル容量チェック&自動代替案内システム
‘ 概要: 送信前のMailItemを監視し、規定サイズ超過時に添付を外してURLに置換
‘ =====================================================================
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
‘ 1. 処理対象が「メール」であるか厳密にチェック(会議予定やタスクの誤爆を防ぐ)
If TypeName(Item) <> “MailItem” Then Exit Sub
Dim mail As MailItem
Set mail = Item
‘ 2. 定数の定義
‘ 組織の送信上限(ここでは安全を見て 10MB = 10 1024 1024 バイイト とする)
Const LIMIT_SIZE As Long = 10 1024 1024
Const TRANSFER_URL As String = “https://example.file-transfer-service.com/upload”
Dim attach As Attachment
Const tempFolder As String = “C:\TempOutlookGuard\” ‘ 一時保存用(今回はサイズ計算用)
Dim totalSize As Currency
totalSize = 0
‘ 3. 添付ファイルの合計サイズを計算
‘ ※OutlookのAttachmentsコレクションは 1 から始まる点に注意
If mail.Attachments.Count > 0 Then
‘ FSOを使って正確なファイルサイズを取得する準備
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim i As Long
‘ 添付ファイルは削除していくとインデックスがズレるため、後ろからループするのが鉄則!
For i = mail.Attachments.Count To 1 Step -1
Set attach = mail.Attachments(i)
‘ 埋め込み画像(インライン画像)などを除外したい場合はここで判定しますが、
‘ 今回はシンプルにすべての添付ファイルを対象にします。
‘ 添付ファイルを一時的にディスクに保存してサイズを取得、または
‘ パソコン上の元ファイルパスが取れる場合はそこからサイズを取得します。
‘ ここでは安全確実にサイズを測定するため、一度テンポラリに書き出します。
On Error Resume Next
‘ ディレクトリがなければ作成
If Not fso.FolderExists(tempFolder) Then fso.CreateFolder tempFolder
Dim tempFilePath As String
tempFilePath = tempFolder & attach.FileName
attach.SaveAsFile tempFilePath
If fso.FileExists(tempFilePath) Then
Dim f As Object
Set f = fso.GetFile(tempFilePath)
totalSize = totalSize + f.Size
Set f = Nothing
‘ 使い終わったテンポラリファイルは削除
Kill tempFilePath
End If
On Error GoTo 0
Next i
Set fso = Nothing
End If
‘ 4. 制限サイズを超えている場合の処理
If totalSize > LIMIT_SIZE Then
Dim msg As String
msg = “【セキュリティ警告】” & vbCrLf & _
“添付ファイルの合計サイズが ” & Format(totalSize / 1024 / 1024, “0.0”) & “MB です。” & vbCrLf & _
“組織の送信制限(10MB)を超えているため、ファイルを自動的に削除し、” & vbCrLf & _
“ファイル転送サービスの案内を本文に挿入します。”
MsgBox msg, vbExclamation, “容量オーバー検知”
‘ 5. 添付ファイルの削除(後ろから再度ループしてすべて外す)
For i = mail.Attachments.Count To 1 Step -1
mail.Attachments(i).Delete
Next i
‘ 6. 本文にファイル転送サービスの案内を追記
Dim noticeText As String
noticeText = vbCrLf & vbCrLf & _
“————————————————–” & vbCrLf & _
“【お知らせ】” & vbCrLf & _
“大容量ファイルが添付されていたため削除しました。” & vbCrLf & _
“以下のファイル転送サービスよりダウンロードしてください。” & vbCrLf & _
“URL: ” & TRANSFER_URL & vbCrLf & _
“————————————————–”
mail.Body = mail.Body & noticeText
‘ 7. ここであえて送信をキャンセルせず、本文を変更した状態で送信を継続させる場合:
‘ Cancel = False のままにする(今回は親切に本文を書き換えてそのまま送る仕様)
‘ もし送信自体を完全に止めたいなら Cancel = True にしてください。
End If
End Sub
—
4. チーフアーキテクトが教える「陥りやすい罠」と回避の極意
このコードを実務に導入する際、初心者が必ずハマる「3つの罠」があります。ここを知っておくだけで、あなたのエンジニアとしてのレベルは一段と跳ね上がります。
罠①:コレクションの「順方向ループ」による破綻
添付ファイルを削除する際、`For i = 1 To mail.Attachments.Count` のように前から順番に削除していくと、インデックスのズレ(Index Out of Range)が発生し、一部のファイルが削除しきれずに残る、あるいは予期せぬエラーでマクロがクラッシュします。
- 回避策: 複数のアイテムを削除・操作するコレクションは、必ず後ろから数える(Step -1)のが鉄則です。
罠②:`ItemSend` イベントが発火しない?
「コードを書いたのに、送信ボタンを押しても何も起きない!」という相談をよく受けます。
- 原因:
1. 標準モジュールに書いてしまっている(`ThisOutlookSession` 以外の場所に書くとイベントは動きません)。
2. Outlookのセキュリティ設定でマクロが無効になっている。
3. 初回実行時に「このマクロを有効にしますか?」というセキュリティバーの承認を見落としている。
- 回避策: モジュールの配置場所を再確認し、Outlookの「セキュリティセンター」からマクロの設定が「すべてのマクロを有効にする(または通知して有効にする)」になっていることを確認してください。
罠③:テンポラリファイルのゴミ問題
コード内でサイズを正確に測るために一時ファイルを作成していますが、万が一エラーで処理が中断すると、`C:\TempOutlookGuard\` の中にゴミが溜まり続けます。実運用では、エラーハンドリング(`On Error GoTo`)をしっかりと組み込み、処理の最後や定期実行でクリーンアップする配慮があると、世界最高峰のエンジニアに一歩近づけます。
—
5. まとめ
今回は、Outlook VBAを使った「添付ファイル容量チェック&自動代替案内システム」の構築方法を解説しました。
- `ThisOutlookSession` の `ItemSend` イベントで送信の瞬間を捕らえる。
- FileSystemObject (FSO) を使ってファイルのバイト数を正確に計算する。
- コレクション操作の鉄則(後ろからのループ)を守り、安全にオブジェクトを制御する。
ここをクリアしたあなたなら、もう「マクロの記録」だけの初心者ではありません。現場のセキュリティを守り、同僚の「うっかりミス」を救うヒーローになれるはずです。
明日からのOutlookライフが、よりスマートで安全なものになりますように。
それでは、次のアーキテクチャでお会いしましょう!
