Outlook VBAの「禁断の扉」を開く:送信直前のセキュリティスキャンでヒューマンエラーを根絶せよ
こんにちは。業務自動化の深淵へようこそ。
これまで「マクロの記録」ボタンを頼りにツールを作ってきた方も、今日で卒業です。
Outlookには「イベント」という概念があります。これは、こちらが操作するのを待つのではなく、「メールを送ろうとした瞬間」にOutlookが自ら「ちょっと待った!」と割り込む仕組みです。
今回は、添付ファイル名を監視し、機密情報が含まれていれば送信を強制キャンセルする「守護神」のようなスクリプトを実装します。これを理解すれば、あなたはもう単なるVBAユーザーではなく、組織のITガバナンスを守るエンジニアの領域に足を踏み入れたことになります。
—
1. なぜ「イベント」を使うのか?
通常、VBAは「ボタンを押したら動く」のが基本ですが、メール送信には `ItemSend` という特別なイベントが存在します。これはOutlookの心臓部に直結しており、送信ボタンが押された瞬間に処理をフック(横取り)できます。
この「フック」の技術こそ、自動化の真髄です。
2. 実装の準備:クラスモジュールという「箱」
Outlook VBAのイベントを扱うには、標準モジュールではなく「クラスモジュール」という特殊なコンテナが必要です。
1. VBAエディタ(Alt + F11)を開く。
2. 左側のツリーで右クリック → 「挿入」 → 「クラスモジュール」。
3. 名前を `EventClass` に変更する(プロパティウィンドウで変更可能)。
3. 送信中断スクリプトの実装
以下のコードを、作成した `EventClass` に記述してください。
‘ — クラスモジュール: EventClass —
Public WithEvents AppEvents As Outlook.Application
Private Sub AppEvents_ItemSend(ByVal Item As Object, Cancel As Boolean)
‘ 送信しようとしているものがメールかどうかを確認
If TypeOf Item Is MailItem Then
Dim mail As MailItem
Set mail = Item
‘ 添付ファイルをスキャン
Dim att As Attachment
Dim prohibitedKeyword As String
prohibitedKeyword = “機密” ‘ ここに検知したいキーワードを入力
For Each att In mail.Attachments
‘ ファイル名にキーワードが含まれているかチェック
If InStr(1, att.FileName, prohibitedKeyword, vbTextCompare) > 0 Then
‘ 送信をキャンセル!
Cancel = True
‘ 警告メッセージを表示
MsgBox “【警告】機密ファイルが含まれているため、送信を中断しました。” & vbCrLf & _
“ファイル名: ” & att.FileName, vbCritical, “セキュリティエラー”
Exit Sub ‘ 処理を抜ける
End If
Next
End If
End Sub
次に、このクラスを起動時に読み込ませる必要があります。「標準モジュール」を新規作成し、以下のコードを貼り付けてください。
‘ — 標準モジュール: Module1 —
Dim myWatcher As New EventClass
Public Sub InitializeHandler()
‘ Outlookのイベントを監視対象として登録
Set myWatcher.AppEvents = Outlook.Application
End Sub
※ 重要: Outlookを起動するたびに `InitializeHandler` を実行する必要があります。面倒な場合は、`ThisOutlookSession` モジュール内に `Application_Startup` イベントを書いて自動実行させるのがプロの作法です。
—
4. 陥りやすい罠と「プロの知見」
初心者の方が必ずと言っていいほどハマるポイントを伝授します。
- 「イベントが動かない!」という時は:
ほとんどの場合、`InitializeHandler` が実行されていないか、変数が「スコープ外」で消滅しています。`myWatcher` 変数は、Outlookが起動している間ずっとメモリに生存していなければなりません。そのため、標準モジュールの一番上に記述するのです。
- 「送信キャンセル」の裏側:
`Cancel = True` を設定すると、Outlookは送信プロセスを即座に破棄します。しかし、メール作成ウィンドウは閉じません。ユーザーは「なぜ送れないんだ?」と混乱するため、必ず `MsgBox` で理由を明示するのがUI設計の優しさです。
- ファイル名の罠:
`InStr` 関数は非常に強力ですが、大文字・小文字を区別しない `vbTextCompare` を指定するのが定石です。でないと、「Confidential.xlsx」と「confidential.xlsx」を別物と見なしてしまい、セキュリティホールになります。
5. さあ、次のステップへ
このコードを実装できたあなたは、もう「手作業でメールを送る人」ではありません。「業務の門番」です。
ここからさらに、「宛先ドメインをチェックして、外部なら警告する」や「本文内の特定の文字列を検索する」といった機能を追加してみてください。Outlook VBAの可能性は無限大です。
分からないことがあれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
