MENU
  • Soft/App

Category カテゴリカテゴリ

PC/Gadget パソコン・ガジェット
Soft/App ソフト・アプリ
Entertainment エンタメ・イベント
Shopping お買い物
D.I.Y. セルフリフォーム
Download ダウンロード

パソコン関連のお得情報

マイクロソフトオフィス
マッキントッシュ
ウインドウズ
Adobe イラストレーター
ワードプレス
Apple iPhone
iPad & Apple Pencil
アプリ

©Goblog ごぶろぐ
created by N/A | powerd by SWELL

ソフトやガジェットのPR記事依頼はお気軽にお問い合わせください
  • D.I.Y.

<Outlook VBA>Outlookで同姓宛先間違いを防ぐ!メール送信前に同じ苗字の人の一覧を確認できるマクロ

Outlookで同姓同名の方へのメール誤送信を防ぎ、情報漏洩リスクを軽減するために、Outlookマクロ設定を紹介します。
この設定をすることで、メール送信前に宛先の一覧を確認できるようになり、誤送信を未然に防げます。

 悩む人

Outlookで同姓同名の宛先間違いで、困った経験があるけど、どうしたら良いのかわからない…

ごん

宛先間違いを防ぐマクロ設定は、メール送信における安全性を高める有効な手段です

この記事で解決する悩みごとはこちら

この記事で解決する
悩みごとはこちら

この記事で解決する悩みごとはこちら
  • Outlookマクロ設定に必要な準備
  • Outlookマクロでできること
  • Outlookマクロの設定方法
  • マクロ使用時の注意点
目次

Outlookで同姓宛先間違いを防ぐためのマクロ設定

Microsoft Outlookでメールを送信する際、同姓同名の方への誤送信を防ぎ、情報漏洩リスクを軽減する、それがこのマクロ設定の目的です。

宛先間違いをなくすための準備

Outlookでメールを作成する前に、同姓の宛先を間違えないための準備は重要です。
同姓の方が複数いる場合、宛名を手入力すると間違いが起こりやすいため、Outlookの連絡先機能を活用して宛先を選択するのがおすすめです。

Outlookの連絡先を最新の状態に保ち、メール作成時の確認を徹底することで、宛先間違いのリスクを減らせます。

Outlookマクロでできること

Outlookマクロは、Outlookの機能を拡張し、作業効率を上げるためのツールです。
今回ご紹介するマクロを使用することで、メール送信前に宛先の一覧を表示し、確認を促すことができます。

このマクロは、宛先間違いという、Outlook利用における潜在的なリスクを軽減するために役立ちます。

Outlookマクロの設定方法

Outlookマクロを設定するには、まずOutlookの開発タブを表示させ、マクロの作成に進みます。
以下に、具体的な設定手順を解説します。

これらの手順を踏むことで、マクロの記述と実行の準備が整います。

ごん

マクロの登録は画像付きで詳しく紹介している記事があるので、そちらを参考にしてください

マクロコードの設定方法

VBAエディタが開いたら、マクロのコードを記述します。

ごん

まず、挿入から標準モジュールを作成し、下記のコードを貼り付けてください

Option Explicit

'========================================
' 同姓候補チェック(高速版・総当たり禁止)
'  - 連絡先は Items.Restrict で姓前方一致のみ
'  - GAL は AddressEntries.Find/FindNext で姓前方一致のみ
'  - 宛先と同じSMTPは除外
'  - 実行中キャッシュで同じ姓の再検索を回避
'
' 使い方:
'   1) 既存の旧版エントリーポイント名を「CheckSurnamesForRecipients_Legacy」に変更
'   2) 本モジュールを追加
'   3) 新エントリーポイント「CheckSurnamesForRecipients_Fast」を実行
'
' 必要に応じて下記フラグを調整
'========================================

' GAL検索を行うか(Falseにするとさらに高速)
Private Const ENABLE_GAL As Boolean = True
' 会社名や氏名の表記ゆれ対策として姓の前方一致検索を使用
' NormalizeKey(全半・かな種変換・大文字化)後のキーを用いる

' 実行中キャッシュ:surnameKey → Collection("姓|名|会社|smtp")
Private mSurnameCache As Object   ' Scripting.Dictionary(実行中のみ生存)

'===============================
' エントリーポイント(高速版)
'   ・宛先/CC/BCC に同姓が複数いる場合に警告を出す
'   ・OK / キャンセル付きのMsgBoxを表示
'   ・キャンセル選択時は送信中止(Application_ItemSendでCancel=True)
'===============================
Public Function CheckSurnamesForRecipients_Fast() As Boolean
    Dim insp As Outlook.Inspector
    Dim mi As Outlook.MailItem
    Dim r As Outlook.Recipient
    Dim i As Long, key As String
    Dim reported As Object                 ' 同じ姓は1回だけ
    Dim recipientSmtps As Object           ' 宛先に入っているSMTP(候補から自分を除外)
    Dim coll As Collection, j As Long
    Dim report As String, anyFound As Boolean
    Dim readableSurname As String
    Dim response As VbMsgBoxResult         ' OK/キャンセルの結果用

    ' === メール作成ウィンドウを取得 ===
    On Error Resume Next
    Set insp = Application.ActiveInspector
    If insp Is Nothing Or Not TypeOf insp.CurrentItem Is Outlook.MailItem Then
        MsgBox "作成中のメールが見つかりません。", vbExclamation
        Exit Function
    End If
    Set mi = insp.CurrentItem
    On Error GoTo 0

    ' === 宛先全員のSMTPを収集 ===
    Set recipientSmtps = CreateObject("Scripting.Dictionary"): recipientSmtps.CompareMode = vbTextCompare
    For i = 1 To mi.Recipients.Count
        Set r = mi.Recipients(i)
        recipientSmtps(LCase$(GetSmtpAddress(r))) = True
    Next

    ' === キャッシュ初期化 ===
    If mSurnameCache Is Nothing Then
        Set mSurnameCache = CreateObject("Scripting.Dictionary")
        mSurnameCache.CompareMode = vbTextCompare
    End If

    ' === 各宛先の姓でアドレス帳を検索 ===
    Set reported = CreateObject("Scripting.Dictionary"): reported.CompareMode = vbTextCompare
    report = "": anyFound = False

    For i = 1 To mi.Recipients.Count
        Set r = mi.Recipients(i)
        key = NormalizedSurnameFromRecipient_Fast(r)              ' 正規化済み姓
        If key <> "" And Not reported.exists(key) Then
            reported(key) = True

            ' 見栄え用の姓(表示名から推測)
            readableSurname = ExtractSurname(IIf(Not r.AddressEntry Is Nothing, r.AddressEntry.Name, r.Name))
            If Trim$(readableSurname) = "" Then readableSurname = key

            ' 同姓候補を取得
            Set coll = FindPeopleBySurname_Fast(key, recipientSmtps)
            ' 2件以上ある場合のみ警告対象
                Dim altCount As Long, smtp As String, mark As String
                altCount = 0
                ' まず別候補の件数を数える(宛先に含まれないもの)
                For j = 1 To coll.Count
                    smtp = LCase$(Part_Fast(coll(j), 3))
                    If Not recipientSmtps.exists(smtp) Then altCount = altCount + 1
                Next
                
                If altCount > 1 Then
                    anyFound = True
                    ' 件数は「別候補」の数を表示
                    report = report & "■ 同じ姓の候補:" & readableSurname & "  (" & altCount & "件)" & vbCrLf
                
                    For j = 1 To coll.Count
                        smtp = LCase$(Part_Fast(coll(j), 3))
                        ' 宛先/CC/BCCに入っているなら →、それ以外は ・
                        If recipientSmtps.exists(smtp) Then
                            mark = "・"
                        Else
                            mark = "×"
                        End If
                        report = report & "  " & mark & " " & FormatLine_SurnameGivenCompany_Fast(coll(j)) & vbCrLf
                    Next
                    report = report & String(40, "-") & vbCrLf
                End If
        End If
    Next

    ' === 同姓候補が見つかった場合は確認ダイアログ ===
    If anyFound Then
        response = MsgBox(report & vbCrLf & "送信を続けますか?", vbExclamation + vbOKCancel, "同姓(アドレス帳)チェック結果")
        If response = vbCancel Then
            ' Trueを返すことで送信イベント側でCancel=Trueにできる
            CheckSurnamesForRecipients_Fast = True
        End If
    End If
End Function


'===============================
' 表示用:「姓 名(会社名)」に整形
' packed = "姓|名|会社|smtp"
'===============================
Private Function FormatLine_SurnameGivenCompany_Fast(ByVal packed As String) As String
    Dim p() As String, s As String
    p = Split(packed, "|")
    s = NzStrArr_Fast(p, 0)
    If NzStrArr_Fast(p, 1) <> "" Then s = s & " " & NzStrArr_Fast(p, 1)
    If NzStrArr_Fast(p, 2) <> "" Then s = s & "(" & NzStrArr_Fast(p, 2) & ")"
    FormatLine_SurnameGivenCompany_Fast = Trim$(s)
End Function

Private Function NzStrArr_Fast(ByRef arr() As String, ByVal idx As Long) As String
    On Error Resume Next
    NzStrArr_Fast = Trim$(arr(idx))
    On Error GoTo 0
End Function

'===============================
' 正規化・姓の取得(フィールド優先)
'===============================
Private Function NormalizeKey_Fast(ByVal s As String) As String
    Dim t As String
    t = Trim$(s)
    t = Replace$(t, " ", " ")
    On Error Resume Next
    t = StrConv(t, vbNarrow)    ' 全角→半角
    t = StrConv(t, vbKatakana)  ' ひらがな→カタカナ
    On Error GoTo 0
    NormalizeKey_Fast = UCase$(t)
End Function

Private Function RemoveParenPart_Fast(ByVal s As String) As String
    Dim t As String: t = s
    t = Replace$(t, "(", "("): t = Replace$(t, ")", ")")
    t = Replace$(t, "【", "["): t = Replace$(t, "】", "]")
    t = Replace$(t, "〔", "["): t = Replace$(t, "〕", "]")
    If InStr(t, "(") > 0 Then t = Left$(t, InStr(t, "(") - 1)
    If InStr(t, "[") > 0 Then t = Left$(t, InStr(t, "[") - 1)
    RemoveParenPart_Fast = Trim$(t)
End Function

' 表示名からの姓推測(最終手段)
Private Function ExtractSurname(ByVal fullDispName As String) As String
    Dim s As String
    s = Trim$(fullDispName)
    If s = "" Then Exit Function
    s = RemoveParenPart_Fast(s)
    If InStr(s, ",") > 0 Then ExtractSurname = Trim$(Split(s, ",")(0)): Exit Function
    If InStr(s, " ") > 0 Then ExtractSurname = Trim$(Split(s, " ")(0)): Exit Function
    If InStr(s, " ") > 0 Then ExtractSurname = Trim$(Split(s, " ")(0)): Exit Function
    ExtractSurname = s
End Function

' Recipient → 姓(LastName優先、無ければ推測)を正規化キー化
Private Function NormalizedSurnameFromRecipient_Fast(ByVal r As Outlook.Recipient) As String
    On Error Resume Next
    Dim ae As Outlook.AddressEntry, exu As Outlook.ExchangeUser, c As Outlook.ContactItem
    Dim ln As String, guess As String

    If r Is Nothing Then Exit Function
    Set ae = r.AddressEntry
    If Not ae Is Nothing Then
        Set exu = ae.GetExchangeUser
        If Not exu Is Nothing Then ln = Trim$(exu.lastName)
        If ln = "" Then
            Set c = ae.GetContact
            If Not c Is Nothing Then ln = Trim$(c.lastName)
        End If
    End If
    If ln = "" Then
        guess = IIf(Not ae Is Nothing, ae.Name, r.Name)
        ln = ExtractSurname(guess)
    End If
    NormalizedSurnameFromRecipient_Fast = NormalizeKey_Fast(ln)
End Function

' AddressEntry → 姓の正規化キー
Private Function NormalizedSurnameFromAE_Fast(ByVal ae As Outlook.AddressEntry) As String
    On Error Resume Next
    Dim exu As Outlook.ExchangeUser, c As Outlook.ContactItem
    Dim ln As String
    If ae Is Nothing Then Exit Function
    Set exu = ae.GetExchangeUser
    If Not exu Is Nothing Then ln = Trim$(exu.lastName)
    If ln = "" Then
        Set c = ae.GetContact
        If Not c Is Nothing Then ln = Trim$(c.lastName)
    End If
    If ln = "" Then ln = ExtractSurname(Trim$(ae.Name))
    NormalizedSurnameFromAE_Fast = NormalizeKey_Fast(ln)
End Function

'===============================
' 宛先のSMTP取得(Exchangeでも安定)
'===============================
Private Function GetSmtpAddress(ByVal r As Outlook.Recipient) As String
    On Error Resume Next
    Const PR_SMTP As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
    Dim s As String
    s = Trim$(r.PropertyAccessor.GetProperty(PR_SMTP))
    If s = "" Then s = Trim$(r.address)
    GetSmtpAddress = LCase$(s)
End Function

'===============================
' 高速検索:連絡先+GAL(必要時)
'   返却: Collection of "姓|名|会社|smtp"(重複除外済)
'===============================
Private Function FindPeopleBySurname_Fast(ByVal surnameKey As String, ByVal recipientSmtps As Object) As Collection
    ' 実行中キャッシュ
    If Not mSurnameCache Is Nothing Then
        If mSurnameCache.exists(surnameKey) Then
            Set FindPeopleBySurname_Fast = mSurnameCache(surnameKey)
            Exit Function
        End If
    End If

    Dim res As New Collection
    Dim seen As Object: Set seen = CreateObject("Scripting.Dictionary")
    seen.CompareMode = vbTextCompare

    ' 1) 連絡先(サブフォルダ含む):Restrictで前方一致
    On Error Resume Next
    Dim root As Outlook.Folder
    Set root = Application.Session.GetDefaultFolder(olFolderContacts)
    If Not root Is Nothing Then
        CollectContactsBySurname_Fast root, surnameKey, res, seen
    End If
    On Error GoTo 0

    ' 2) GAL 等:Find/FindNextで前方一致
    If ENABLE_GAL Then
        On Error Resume Next
        Dim lst As Outlook.AddressList, ae As Outlook.AddressEntry
        Dim f As String
        f = BuildAddressEntryFindFilterFromSurname(surnameKey)
        For Each lst In Application.Session.AddressLists
            Set ae = Nothing
            Set ae = lst.AddressEntries.Find(f)
            Do While Not ae Is Nothing
                Dim line As String, smtp As String
                line = BuildInfoFromAE_Fast(ae)     ' "姓|名|会社|smtp"
                smtp = Part_Fast(line, 3)
If smtp <> "" Then
    If Not seen.exists(LCase$(smtp)) Then
        res.Add line
        seen(LCase$(smtp)) = True
    End If
End If
                Set ae = lst.AddressEntries.FindNext
            Loop
        Next
        On Error GoTo 0
    End If

    ' 置き換え後:
    If mSurnameCache Is Nothing Then
        Set mSurnameCache = CreateObject("Scripting.Dictionary")
        mSurnameCache.CompareMode = vbTextCompare
    End If
    Set mSurnameCache(surnameKey) = res  ' ← Collection を入れるので Set が必要
    Set FindPeopleBySurname_Fast = res
End Function

' 連絡先:Restrictで姓前方一致ヒットのみ収集(Email1~3、重複除外)
Private Sub CollectContactsBySurname_Fast(ByVal f As Outlook.Folder, ByVal keyQuery As String, _
                                          ByRef res As Collection, ByVal seen As Object)
    On Error Resume Next

    Dim dasl As String
    dasl = BuildContactsRestrictFilterFromSurname(keyQuery)

    Dim its As Outlook.Items, hits As Outlook.Items, it As Object
    Set its = f.Items
    Set hits = its.Restrict(dasl)

    If Not hits Is Nothing Then
        For Each it In hits
            If TypeOf it Is Outlook.ContactItem Then
                Dim c As Outlook.ContactItem
                Set c = it
                AddContactEmailIfAny_Fast res, seen, c, 1
                AddContactEmailIfAny_Fast res, seen, c, 2
                AddContactEmailIfAny_Fast res, seen, c, 3
            End If
        Next
    End If

    ' サブフォルダも処理
    Dim sf As Outlook.Folder
    For Each sf In f.Folders
        CollectContactsBySurname_Fast sf, keyQuery, res, seen
    Next
End Sub

Private Sub AddContactEmailIfAny_Fast(ByRef res As Collection, ByVal seen As Object, _
                                      ByVal c As Outlook.ContactItem, ByVal idx As Integer)
    Dim smtp As String, ln As String, fn As String, comp As String
    Select Case idx
        Case 1: smtp = Trim$(c.Email1Address)
        Case 2: smtp = Trim$(c.Email2Address)
        Case 3: smtp = Trim$(c.Email3Address)
    End Select
    If smtp = "" Then Exit Sub

    ln = Trim$(c.lastName): fn = Trim$(c.firstName): comp = Trim$(c.companyName)
    If ln = "" Then ln = ExtractSurname(Trim$(c.fullName))
    smtp = LCase$(smtp)

    If Not seen.exists(smtp) Then
        res.Add ln & "|" & fn & "|" & comp & "|" & smtp
        seen(smtp) = True
    End If
End Sub

' AddressEntry → "姓|名|会社|smtp"
Private Function BuildInfoFromAE_Fast(ByVal ae As Outlook.AddressEntry) As String
    On Error Resume Next
    Dim ln As String, fn As String, comp As String, smtp As String
    Dim exu As Outlook.ExchangeUser, c As Outlook.ContactItem

    Set exu = ae.GetExchangeUser
    If Not exu Is Nothing Then
        ln = Trim$(exu.lastName)
        fn = Trim$(exu.firstName)
        comp = Trim$(exu.companyName)
        smtp = Trim$(exu.PrimarySmtpAddress)
    End If

    If smtp = "" Then
        Set c = ae.GetContact
        If Not c Is Nothing Then
            If Trim$(c.Email1Address) <> "" Then
                smtp = Trim$(c.Email1Address)
            ElseIf Trim$(c.Email2Address) <> "" Then
                smtp = Trim$(c.Email2Address)
            ElseIf Trim$(c.Email3Address) <> "" Then
                smtp = Trim$(c.Email3Address)
            End If
            If ln = "" Then ln = Trim$(c.lastName)
            If fn = "" Then fn = Trim$(c.firstName)
            If comp = "" Then comp = Trim$(c.companyName)
        End If
    End If

    If ln = "" And fn = "" Then ln = ExtractSurname(Trim$(ae.Name)) ' 最後の手段
    If smtp = "" Then smtp = Trim$(ae.address)

    BuildInfoFromAE_Fast = ln & "|" & fn & "|" & comp & "|" & LCase$(smtp)
End Function

' packed から要素取得(0=姓,1=名,2=会社,3=SMTP)
Private Function Part_Fast(ByVal packed As String, ByVal idx As Long) As String
    Dim p() As String
    p = Split(packed, "|")
    On Error Resume Next
    Part_Fast = Trim$(p(idx))
    On Error GoTo 0
End Function

'===============================
' Restrict / Find 用フィルタ
'===============================
' 連絡先用 Restrict(DASL)
'  LastName または DisplayName が key で始まる
Private Function BuildContactsRestrictFilterFromSurname(ByVal keyQuery As String) As String
    ' NormalizeKey_Fast済みのキーを想定。Restrictは大文字小文字をあまり気にしないが安全に前方一致。
    ' DASL: urn:schemas:contacts:sn = LastName
    '       http://schemas.microsoft.com/mapi/proptag/0x3001001E = PR_DISPLAY_NAME (FullNameに相当)
    Dim k As String: k = Replace$(keyQuery, "'", "''") ' クオートエスケープ
    Dim lastNameDASL As String, dispNameDASL As String
    lastNameDASL = "urn:schemas:contacts:sn"
    dispNameDASL = "http://schemas.microsoft.com/mapi/proptag/0x3001001E"

    BuildContactsRestrictFilterFromSurname = _
        "@SQL=" & _
        Chr$(34) & lastNameDASL & Chr$(34) & " LIKE '" & k & "%' OR " & _
        Chr$(34) & dispNameDASL & Chr$(34) & " LIKE '" & k & "%'"
End Function

' GAL用 Find フィルタ
'  [LastName] または [Name] が key で始まる
Private Function BuildAddressEntryFindFilterFromSurname(ByVal keyQuery As String) As String
    Dim k As String: k = Replace$(keyQuery, "'", "''")
    BuildAddressEntryFindFilterFromSurname = _
        "[LastName] Like '" & k & "*' OR [Name] Like '" & k & "*'"
End Function

'========================================
' 手動確認用:送信は一切しない/止めない版
'   - ボタンから実行して重複姓候補を確認するだけ
'   - 同姓候補が2件以上ある姓だけを一覧表示
'   - OK=何もしない、キャンセル=何もしない(マクロ終了)
'========================================
Public Sub CheckSurnamesForRecipients_Preview()
    Dim insp As Outlook.Inspector
    Dim mi As Outlook.MailItem
    Dim r As Outlook.Recipient
    Dim i As Long, key As String
    Dim reported As Object                 ' 同じ姓は1回だけ
    Dim recipientSmtps As Object           ' 宛先に入っているSMTP(候補から自分を除外)
    Dim coll As Collection, j As Long
    Dim report As String, anyFound As Boolean
    Dim readableSurname As String
    Dim response As VbMsgBoxResult

    ' === メール作成ウィンドウを取得 ===
    On Error Resume Next
    Set insp = Application.ActiveInspector
    If insp Is Nothing Or Not TypeOf insp.CurrentItem Is Outlook.MailItem Then
        MsgBox "作成中のメールが見つかりません。", vbExclamation
        Exit Sub
    End If
    Set mi = insp.CurrentItem
    On Error GoTo 0

    ' === 宛先全員のSMTPを収集 ===
    Set recipientSmtps = CreateObject("Scripting.Dictionary"): recipientSmtps.CompareMode = vbTextCompare
    For i = 1 To mi.Recipients.Count
        Set r = mi.Recipients(i)
        recipientSmtps(LCase$(GetSmtpAddress(r))) = True
    Next

    ' === キャッシュ初期化(必要なら)===
    If mSurnameCache Is Nothing Then
        Set mSurnameCache = CreateObject("Scripting.Dictionary")
        mSurnameCache.CompareMode = vbTextCompare
    End If

    ' === 各宛先の姓でアドレス帳を検索 ===
    Set reported = CreateObject("Scripting.Dictionary"): reported.CompareMode = vbTextCompare
    report = "": anyFound = False

    For i = 1 To mi.Recipients.Count
        Set r = mi.Recipients(i)
        key = NormalizedSurnameFromRecipient_Fast(r)  ' 正規化済み姓
        If key <> "" And Not reported.exists(key) Then
            reported(key) = True

            ' 見栄え用の姓(表示名から推測)
            readableSurname = ExtractSurname(IIf(Not r.AddressEntry Is Nothing, r.AddressEntry.Name, r.Name))
            If Trim$(readableSurname) = "" Then readableSurname = key

            ' 同姓候補を取得(宛先自身は除外)
            Set coll = FindPeopleBySurname_Fast(key, recipientSmtps)

            ' 2件以上ある場合のみ警告対象(1件=重複なし扱い)
                Dim altCount As Long, smtp As String, mark As String
                altCount = 0
                ' まず別候補の件数を数える(宛先に含まれないもの)
                For j = 1 To coll.Count
                    smtp = LCase$(Part_Fast(coll(j), 3))
                    If Not recipientSmtps.exists(smtp) Then altCount = altCount + 1
                Next
                
                If altCount > 1 Then
                    anyFound = True
                    ' 件数は「別候補」の数を表示
                    report = report & "■ 同じ姓の候補:" & readableSurname & "  (" & altCount & "件)" & vbCrLf
                
                    For j = 1 To coll.Count
                        smtp = LCase$(Part_Fast(coll(j), 3))
                        ' 宛先/CC/BCCに入っているなら →、それ以外は ・
                        If recipientSmtps.exists(smtp) Then
                            mark = "・"
                        Else
                            mark = "×"
                        End If
                        report = report & "  " & mark & " " & FormatLine_SurnameGivenCompany_Fast(coll(j)) & vbCrLf
                    Next
                    report = report & String(40, "-") & vbCrLf
                End If
        End If
    Next

    ' === 結果表示(送信の可否は一切操作しない)===
    If anyFound Then
        response = MsgBox(report & vbCrLf & "OKで閉じます。", vbExclamation + vbOKCancel, "同姓(アドレス帳)チェック結果(プレビュー)")
        ' キャンセルを押しても送信は止めない(このマクロは確認のみ)
        ' 何もせず終了
    Else
        MsgBox "重複し得る同姓候補は見つかりませんでした。", vbInformation
    End If
End Sub

ごん

次に、ThisOutlookSessionに下記のコードを貼り付けます

'=========================================
' メール送信時イベント
' 送信ボタン押下時に自動チェックを実行
'=========================================
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    On Error Resume Next
    If TypeOf Item Is Outlook.MailItem Then
        ' 関数がTrueを返した場合はキャンセル
        If CheckSurnamesForRecipients_Fast() Then
            Cancel = True
            Exit Sub
        End If
    End If
End Sub

すると、Outlookの送信ボタンを押したときに、自動でマクロが実行され、宛先に追加されているアドレスのアドレス帳に登録されている苗字と、アドレス帳に登録されている同一苗字の方の一覧が表示されます。

ごん

一覧の中ので表示されている人が現在宛先に入っている人で、×で表示されている人は、同じ苗字の別の会社・別の名前の方です

Outlookマクロ使用時の注意点

今回の宛先間違い確認メールのOutlookマクロを使用する際には、注意点があります。

  1. アドレス帳に登録されている人の「姓」から検索するため、登録されていることが前提
  2. 宛先、CCに追加するアドレスも、アドレス帳に「姓」が登録されていることが全体
ごん

宛先間違いを防ぐマクロ設定は、メール送信における安全性を高めるための有効な手段です。アドレス帳に登録するのが面倒な方は、アドレス帳登録支援のマクロも参考にしてください

よくある質問(FAQ)

会社でOutlookを使用しています。同姓同名の人がいて、メールの宛先を間違えてしまうことが心配です。何か対策はありますか?

Outlookでメールを送信する際、同姓同名の方への宛先間違いを防ぐために、私が作成したマクロ設定をおすすめします。
連絡先機能で宛先を選択し、メール送信前に宛先の一覧を確認するマクロを設定することで、情報漏洩のリスクを減らせます。

マクロを設定するのは難しそうですが、初心者でもできますか?

はい、大丈夫です。
この記事で紹介している手順通りに進めれば、初心者の方でも簡単に設定できます。
具体的には、Outlookの開発タブを表示させ、マクロを作成し、コードを記述するだけです。
コードは私が提供しますので、コピーして貼り付けてください。

マクロを設定する際に、注意する点はありますか?

はい、いくつかの注意点があります。
まず、マクロの実行を許可するセキュリティ設定になっているかを確認してください。
次に、コードを誤って変更すると正しく動作しない可能性があるため、注意が必要です。
最後に、万が一に備えて、マクロ設定のバックアップを取っておくことを推奨します。

マクロを設定すると、具体的にどのようなことができるようになりますか?

マクロを設定すると、メール送信前に宛先の一覧が表示され、確認を促すメッセージが表示されます。
宛先を確認後、メール送信を継続するか中止するかを選択できます。
これにより、宛先間違いという、Outlook利用における潜在的なリスクを軽減できます。

Outlookのマクロって、セキュリティ的に問題はないのでしょうか?

マクロの使用に際しては、セキュリティ設定を確認することが重要です。
マクロの実行を許可する設定になっているかを確認し、信頼できるコードのみを使用するようにしてください。
私が提供するコードは安全なものですが、念のため、設定前に内容を確認することをおすすめします。

マクロの設定以外に、Outlookでメールを安全に送信するための対策はありますか?

はい、マクロ設定に加えて、普段からの心がけも大切です。
メール送信前に必ず宛先をダブルチェックすること、誤送信防止のためのプラグインやサービスの利用も検討してみましょう。
また、定期的な情報セキュリティに関する教育を受けることも、有効な対策の一つです。

まとめ

Outlookで同姓同名の方へのメール誤送信を防ぎ、情報漏洩のリスクを軽減するマクロ設定を紹介しました。

Outlookマクロを設定し、安全なメール送信を実現するために、まずこの記事で紹介した手順でマクロを設定しましょう。

もっと「Outlookの時短技について学びたい」という方に朗報です

Kindle読み放題の無料体験をを利用して、Outlookの時短技や便利技を無料で学べるチャンスです。

Outlookを使っているビジネスパーソン必見!
メール整理やスマホ連携で仕事を加速する使い方を凝縮!

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

仕事を効率化するワザが満載!
Outlookを徹底的に活用する1冊!!

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

ビジネスに役立つ
情報共有の基本が身に付く本

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

「ピボットテーブル」はマウス操作で
高度な集計を行える便利な機能です

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

すぐに役立つノウハウが満載!
ビジネスの基幹となるOutlookの
テクニックを凝縮した解説書

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

できる 仕事がはかどるWindows効率化
全部入り。

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

Kindle Unlimitedtってなに?

Amazonが提供する電子書籍の読み放題サービスのことです。

Kindle=電子書籍
Unlimited=読み放題

ごん

Kindle Unlimitedは無料で何回も体験できるって知っていますか?私は実際に4回無料体験済みです。一度利用していても無料のチャンスは大いにありますよ(無料体験につてのまとめ記事

もし無料キャンペーンが使えなくても、2ヶ月99円のキャンペーンも何度もやっています

Kindle Unlimitedの99円キャンペーンを何度も利用するためには?

下のボタンからAmazonを開いて「無料体験」の表示が出るか確認してみましょう

\ Amazonで確認 /

Outlookを使っているビジネスパーソン必見!
メール整理やスマホ連携で仕事を加速する使い方を凝縮!

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

仕事を効率化するワザが満載!
Outlookを徹底的に活用する1冊!!

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

ビジネスに役立つ
情報共有の基本が身に付く本

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

「ピボットテーブル」はマウス操作で
高度な集計を行える便利な機能です

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

すぐに役立つノウハウが満載!
ビジネスの基幹となるOutlookの
テクニックを凝縮した解説書

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

できる 仕事がはかどるWindows効率化
全部入り。

無料で読めるOutlook時短技の本(KindleUnlimited)

\2回目3回目も無料で体験できる/

管理人:ごん(デザイナー)

管理人:ごん(デザイナー)

「時短・楽したい」がモットー!Twitterでも情報公開しています
記事のライティング依頼やPR記事依頼・広告掲載のご依頼も受付中

よかったらシェアしてね!
  • URLをコピーしました!
目次