【入門編】【中級者向け】添付ファイルが大きすぎる場合に自動で圧縮・リンク化を促す警告ツール – Outlook VBA解析バイブル

スポンサーリンク

【Outlook VBA】巨大添付ファイルは「送信前」に撃墜せよ!自動検知・警告システムの極意

こんにちは。現場の最前線で自動化を突き詰めているエンジニアです。

Outlookでメールを送る際、「あ、添付ファイルが大きすぎて送れない……」と送信ボタンを押した後にエラーが出て冷や汗をかいた経験はありませんか?あるいは、相手のサーバー容量を圧迫してしまう配慮の欠けたメールを送ってしまったことは?

今回は、そんな失敗を物理的に防ぐ「添付ファイル自動検知・警告システム」を構築します。単にコードを写すだけでなく、Outlookのライフサイクルを理解し、「なぜそう書くのか」という本質まで踏み込みます。ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。

1. なぜ「送信時」にフックをかけるのか?

Outlook VBAには、ユーザーが「送信」ボタンを押した瞬間に介入できる `ItemSend` という強力なイベントが存在します。

このイベントを制する者はOutlookを制します。なぜなら、「メールが送信される直前の、最も情報が確定した瞬間」に処理を挟み込めるからです。

今回のロジックの骨子

1. `Application_ItemSend` イベントを監視する。
2. 添付ファイルの合計サイズを算出し、規定値(例:5MB)を超えていないか判定する。
3. 超過していた場合、送信を中止し、警告を表示する。

2. 実装コード:安全装置を組み込む

Outlook VBAのプロジェクト構成において、このコードは必ず `ThisOutlookSession` モジュールに記述してください。標準モジュールではイベントが発火しません。

‘ ThisOutlookSession モジュールに記述
Option Explicit

‘ 添付ファイルの上限サイズ(バイト単位:5MB = 5 1024 1024)
Private Const MAX_ATTACHMENT_SIZE As Long = 5242880

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim mail As MailItem
Dim attach As Attachment
Dim totalSize As Long

‘ 送信しようとしているのがメールアイテムか確認
If TypeOf Item Is MailItem Then
Set mail = Item
totalSize = 0

‘ 添付ファイルの合計サイズを計算
For Each attach In mail.Attachments
‘ FileSizeプロパティでバイト単位のサイズを取得
totalSize = totalSize + attach.Size
Next attach

‘ サイズ超過チェック
If totalSize > MAX_ATTACHMENT_SIZE Then
MsgBox “【警告】添付ファイルの合計サイズが上限を超えています!” & vbCrLf & _
“現在: ” & Format(totalSize / 1024 / 1024, “0.00”) & ” MB” & vbCrLf & _
“送信を中止します。ファイルを圧縮するか、クラウドストレージのリンクを利用してください。”, _
vbCritical, “送信安全装置”

‘ 送信をキャンセル
Cancel = True
End If
End If
End Sub

3. コードの読み解き:ここがエンジニアの分かれ道

`Item As Object` の正体

なぜ `MailItem` ではなく `Object` なのか?それは、予定表の招待やタスクの送信など、メール以外のアイテムもこのイベントを通る可能性があるからです。`TypeOf Item Is MailItem` で型を絞り込むのが、堅牢なシステムを作るための「作法」です。

`Cancel = True` の重要性

この一行が、あなたのメールを守る「ブレーキ」です。`Cancel` 引数に `True` を代入することで、Outlookの内部プロセスに「この送信処理を中断せよ」という命令を直接伝えます。

陥りやすい罠:ファイルサイズの計算

`attach.Size` プロパティは非常に優秀ですが、暗号化やエンコードによるオーバーヘッドは考慮されません。実務では「規定値の8割程度」を閾値に設定しておくと、より安全に運用できます。

4. さらなる高みを目指すために

このシステムを導入すると、次はこんな要望が出てくるはずです。

  • 「自動的に添付ファイルを削除して、代わりにリンクを貼り付けたい」
  • 「特定のドメイン(社外)への送信時だけチェックを厳しくしたい」

これらは `mail.Body` や `mail.HTMLBody` を操作することで実現可能です。特に `HTMLBody` を解析して「リンク化」する処理を組み込めば、社内でも一目置かれる「自動化のプロ」になれるでしょう。

今後の学習ステップ

1. オブジェクトモデルの把握: `Inspector` や `Explorer` オブジェクトを学び、UI操作との連動を極める。
2. エラーハンドリング: `On Error Resume Next` を多用せず、`Err.Number` を活用したスマートな例外処理を覚える。
3. プロセスの非同期化: 巨大なファイルを扱う際は、処理がフリーズしないよう工夫する。

最後に

VBAは古臭い言語と言われることもありますが、「Outlookという巨人の肩に乗って仕事をする」という点において、これほど強力なツールはありません。

今回作成した「安全装置」は、あなた自身だけでなく、あなたのメールを受け取る相手への「優しさ」でもあります。ぜひ、あなたの手でこのコードをカスタマイズし、さらに洗練させていってください。

何か分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの挑戦を応援しています!

タイトルとURLをコピーしました