【入門編】【中級者向け】添付ファイルの容量を自動計算し、制限を超える場合にファイル転送サービス用URLに置き換える警告ツール – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!マクロの記録から一歩抜け出して、「本物の業務自動化」を目指すあなたへ。
今回は、Outlook VBAの中級ステップとして避けて通れない、「メール添付ファイルの容量チェックと動的制御」をテーマにお届けします。

「大きなファイルをうっかり添付してしまい、メールサーバーからはじかれた…」
「社外秘の巨大なデータをそのまま送ってしまいそうになり、ヒヤッとした…」

そんな実務での「あるある」をスマートに解決し、さらに一歩進んでファイル転送サービスへの誘導までを自動化する仕組みを一緒に作っていきましょう。

ここをクリアすれば、単なる作業の自動化から、「システムの安全性を担保するプログラミング」へと視座がグッと上がります。優しく、そして深く解説していくので、リラックスしてついてきてくださいね!

なぜ「添付ファイルの容量チェック」でつまずくのか?

Outlook VBAでメールを送信する際、`MailItem` オブジェクトの `Attachments.Add` メソッドを使えば、簡単にファイルを添付できますよね。

‘ よくあるシンプルな添付コード
myMail.Attachments.Add “C:\Reports\Monthly_Report.pdf”

しかし、ここに大きな落とし穴があります。「添付したファイルが、そもそも何MBあるのか?」をOutlookは自動で教えてくれないのです。送信ボタンを押した瞬間に「容量オーバーです」とエラーが出るか、あるいは社内サーバーに負担をかける巨大メールが飛び立ってしまいます。

これを防ぐためには、メールが送信される直前のイベント(`ItemSend`)を捉え、FileSystemObject(FSO)を使ってファイルの物理サイズを事前に計算し、規定値を超えていたら送信を「キャンセル」するロジックが必要になります。

実装の全体像:送信イベントのフックと容量判定

今回は、ユーザーが送信ボタンを押した瞬間に割り込み、以下の処理を行うプログラムを構築します。

1. 送信しようとしているメール(`Item`)に添付ファイルがあるか走査する。
2. FSO(`Scripting.FileSystemObject`)を使って各ファイルのバイト数を取得する。
3. 合計容量が規定値(例: 10MB = 10,000,000バイト)を超えているか判定する。
4. 超過している場合:送信を強制キャンセルし、ファイル転送サービスの利用を促す警告を表示する。

実装コード:`ThisOutlookSession` に魂を宿す

Outlook VBAでメール送信を制御する場合、通常の標準モジュールではなく、`ThisOutlookSession` という特別なモジュールにコードを記述します。ここには、Outlook全体のエベルツ(起動、新規作成、送信など)をフックする強力なイベントが用意されています。

以下のコードを、あなたのOutlookの `ThisOutlookSession` にそのまま貼り付けてみてください。

Option Explicit

‘ ====================================================================
‘ 処理名: 添付ファイル容量動的制御ツール
‘ 概要 : 送信直前に添付ファイルの合計容量を計算し、制限値を超える場合に
‘ 送信を中断してユーザーに警告と代替手段を促す。
‘ ====================================================================
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

‘ 1. 処理対象がメール(MailItem)であるか厳密にチェック
If Item.Class <> olMail Then Exit Sub

Dim mail As Outlook.MailItem
Set mail = Item

‘ 2. 添付ファイルが存在しない場合はスルー(無駄な処理をしない)
If mail.Attachments.Count = 0 Then Exit Sub

‘ — 設定エリア —
Const MAX_SIZE_MB As Double = 10# ‘ 許容する最大容量(MB)
Const ALLOWED_BYTES As Long = MAX_SIZE_MB 1024 1024
Dim transferUrl As String
transferUrl = “https://example.file-transfer-service.com” ‘ 社内推奨の転送サービスURL
——————

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim totalBytes As Currency
totalBytes = 0

Dim att As Outlook.Attachment
Dim filePath As String

‘ 3. 添付ファイルをループしてサイズを合算
‘ ※注意: OutlookのAttachmentオブジェクトは「保存されたファイル」と
‘  「D&D直後で一時フォルダにあるファイル」が混在するため、Pathプロパティを監視する
For Each att In mail.Attachments
‘ オブジェクトのタイプがファイル(olByValue)であるか確認
If att.Type = olByValue Then
‘ パスが取得できる場合のみFSOでサイズを測る
On Error Resume Next
filePath = att.PathName
On Error GoTo 0

If filePath <> “” And fso.FileExists(filePath) Then
totalBytes = totalBytes + fso.GetFile(filePath).Size
End If
End If
Next att

Set fso = Nothing

‘ 4. 制限値オーバーの判定とアクション
If totalBytes > ALLOWED_BYTES Then
Dim currentSizeMB As Double
currentSizeMB = totalBytes / (1024 1024)

Dim msg As String
msg = “【送信中断】添付ファイルの容量が大きすぎます!” & vbCrLf & vbCrLf & _
“・現在の合計容量: ” & Format(currentSizeMB, “0.00”) & ” MB” & vbCrLf & _
“・社内規定の上限 : ” & MAX_SIZE_MB & ” MB” & vbCrLf & vbCrLf & _
“大容量ファイルを送信する場合は、以下のファイル転送サービスを利用し、” & vbCrLf & _
“本文にダウンロード用URLを記載してください。” & vbCrLf & vbCrLf & _
“【推奨URL】 ” & transferUrl & vbCrLf & vbCrLf & _
“メールの送信をキャンセルしました。”

‘ ユーザーに警告を表示
MsgBox msg, vbCritical + vbOKOnly, “セキュリティ&容量チェッカー”

‘ 送信をキャンセル(これがキモ!)
Cancel = True
End If

End Sub

ジックの核心を深掘り解説

1. `Application_ItemSend` イベントの正体

標準モジュールの `Sub Main()` とは異なり、これはOutlookが裏側で「送信」というトリガーを引いた瞬間に自動で呼び出されるイベントプロシージャです。
引数として渡される `ByVal Item As Object` を通じて、今まさに飛び立とうとしているメールの全権を握ることができます。

2. `Cancel = ByRef` の魔法

このイベントの引数にある `Cancel As Boolean` が非常に重要です。
もし条件分岐の中で `Cancel = True` を代入すると、Outlookは「送信処理をここで無かったことにする(中断する)」という挙動を示します。メール画面は開いたまま保持されるため、ユーザーは添付ファイルを削ったり、URLに差し替えたりして再挑戦することができます。

3. FSO(FileSystemObject)による堅牢なサイズ取得

VBA標準の `FileLen` 関数を使うこともできますが、Outlookの添付ファイルはドラッグ&ドロップされた瞬間に一時フォルダ(Temporary Internet Filesなど)へバラバラに配置されるため、パスの解決が不安定になることがあります。
そこで、`Scripting.FileSystemObject` の `GetFile().Size` を用いることで、確実かつ安全にバイト単位でのファイルサイズを取得しています。

陥りやすい罠とエンジニアの知見

実務でこのコードを運用する際、中級者がハマりがちなポイントをいくつか共有しておきます。

  • 罠1: 画像のインライン添付(署名内のロゴなど)もカウントされてしまう
  • 対策: HTMLメールの署名に含まれる会社ロゴなどの画像も `Attachments` コレクションに含まれる場合があります。厳密に制御したい場合は、`att.PropertyAccessor.GetProperty(“http://schemas.microsoft.com/mapi/proptag/0x3712001E”)` (Content-Idプロパティ)などを確認し、本文中のインライン画像を除外するフィルターをかけると、より洗練されたツールになります。
  • 罠2: マクロのセキュリティ設定でイベントが動かない
  • 対策: Outlookのマクロセキュリティが「すべてのマクロを警告なしで無効化」になっていると、このイベントは一切発火しません。「デジタル署名」を利用するか、社内ニッチツールとして信頼できる場所(信頼できる場所の設定)にVBAプロジェクトを配置してください。

まとめ:ここをクリアすれば、Outlook VBAはあなたの武器になる

いかがでしたでしょうか?
今回は、単にメールを自動で作るだけでなく、「システム側の安全を守るためのガードレール」としてのVBAの活用法を解説しました。

FSOの扱い方、イベントドリブンなプログラミング、そして `Cancel` 引数による制御。これらをマスターしたあなたは、もはや「マクロの記録の卒業生」ではありません立派な業務自動化エンジニアです。

現場の同僚や上司から「おっ、このマクロ、エラーでちゃんと止まって親切だね!」と言われる瞬間を、ぜひ楽しんでください。あなたのVBAライフが、より一層深まることを応援しています!

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