はじめに
同じ内容のメールを、異なる宛先へ、メール本文の送信先の会社名・担当者名を変更しながら、1件ずつ、送信したい。
これを手作業でやると、間違いも発生しやすく、何より面倒だ。
そのため、エクセルを使って、宛先、本文を差し込んだメールを作成する方法を模索した。
作成までの経緯
前提として、動作環境は以下の通りである。
・Windows11
・使用しているメーラーはWebメールの「Outlook on the web」
・ブラウザは「Microsoft Edge」
2025/9/4現在、
Microsoft Edgeのパージョン 139.0.3405.125 では、
設定画面からプロトコルハンドラーの設定ができないようです。
GooGle Chromeのバージョン 140.0.7339.81 であれば、
設定画面からプロトコルハンドラーの設定が可能でした。
当初、mailtoを使った方法を考えた。
しかし、文字数制限があるため、長い本文が入りきらず、諦めた。
次に、以下URLを参考にディープリンクを使った方法を試した。
だが、CC、BCCに対応できない、こちらも、文字数が一定以上になるとエラーになるなど、問題があった。
※2025/9/5追記
上記URLでは、CC、BCCに対応できないとあったが、たまたま知ったポリシー登録の際の値である
https://outlook.office.com/mail/deeplink/compose?mailtouri=
を使用し、このURLの後に「mailto:~」と続ければ、プロトコルハンドラーの設定は不要で、URLリンクのクリックのみでmailtoと同じようにCC、BCCにも対応したメール画面を起動できるようだ。
特に、悩んだのが、本文の長さによる文字数制限エラーだ。
どうしても本文を短くできず、最終的に、本文を差し込むのは諦めた。
結局、mailtoリンクを使って、宛先、件名、CC、BCCのみを差し込んだメールを作成し、メール本文は、クリップボードに本文を送るまでは自動化し、作成したメール画面で本文を貼り付ける作業だけ、手作業とする運用にした。
完全自動化ではないが、ほとんど自動化できたので、許容範囲としたい。
事前設定
mailtoリンクで、Outlook on the webをMicrosoft Edgeで開くには、事前設定が必要になる。
事前設定手順
1. 既定のアプリのMAILTOを設定する
①Windowsの設定画面から、「アプリ」⇒「既定のアプリ」の画面を開く
②検索欄に「mailto」と入力、MAILTOの既定を「Microsoft Edge」に変更する。
【既定のアプリ MAILTO設定画面】

2. ブラウザのプロトコルハンドラー設定
2025/9/4現在、設定画面が変更され、Microsoft Edgeのパージョン 139.0.3405.102 では、設定画面からプロトコルハンドラーの設定ができないようです。現状の代替案として、ポリシーで登録する方法を記載します。
ポリシーとは、Microsoft Edge の動作方法のルールのようなもので、Microsoft Edge のポリシーの中に「RegisteredProtocolHandlers」という、プロトコル ハンドラーを登録するポリシーがある。このポリシーを使って、プロトコルハンドラーを登録する。
設定方法には、グループポリシーから設定する方法とレジストリに登録する方法がある。
【方法その1】ローカルグループポリシー設定方法
ローカルグループポリシーから設定する方法は以下のURLが参考になる。
① Microsoft Edge 管理用テンプレートをダウンロード(詳細は上記URLを参照)
② 管理用テンプレートを個々のコンピューターに追加(詳細は上記URLを参照)
③ ローカルグループポリシーエディターを開いて、「コンピューターの構成」または「ユーザーの構成」の「管理用テンプレート」⇒「Microsoft Edge -既定の設定」⇒「コンテンツの設定」⇒「プロトコル ハンドラーを登録する」を開く
④ 「有効」にして、オプションの値に 「[{"default":true,"protocol":"mailto","url":"https://outlook.office.com/mail/deeplink/compose?mailtouri=%s"}]」 を入力してOKボタンを押す
【方法その2】レジストリ設定方法
直接レジストリに登録する。「HKEY_CURRENT_USER」、「HKEY_LOCAL_MACHINE」どちらでもよいが、今回は「HKEY_CURRENT_USER」に登録する方法を記載する。
① PowerShellを管理者権限で開く
② コマンド「New-Item 'HKCU:Software\Policies\Microsoft\Edge\Recommended' -Force」で、レジストリキーを作成
③ コマンド「New-ItemProperty -LiteralPath 'HKCU:\Software\Policies\Microsoft\Edge\Recommended' -Name 'RegisteredProtocolHandlers' -PropertyType 'String' -Value '[{"default":true,"protocol":"mailto","url":"https://outlook.office.com/mail/deeplink/compose?mailtouri=%s"}]'」で、「RegisteredProtocolHandlers」の値を設定
New-Item 'HKCU:Software\Policies\Microsoft\Edge\Recommended' -Force
New-ItemProperty -LiteralPath 'HKCU:\Software\Policies\Microsoft\Edge\Recommended' -Name 'RegisteredProtocolHandlers' -PropertyType 'String' -Value '[{"default":true,"protocol":"mailto","url":"https://outlook.office.com/mail/deeplink/compose?mailtouri=%s"}]'
Microsoft Edge ポリシー確認方法
Microsoft Edge を開き、アドレスバーに「edge://policy/」と入力する。「Microsoft Edge Policies」に「RegisteredProtocolHandlers」が表示され、状態がOKになっていれば成功で、プロトコルハンドラーが正常に登録された状態となる。

Google Chrome の場合の設定について
参考までに、Google Chromeの場合の設定方法を記載する。
1. 既定のアプリのMAILTOを設定する
MAILTOの既定を「Google Chrome」に変更する
2. ブラウザのプロトコルハンドラー設定
① Google Chrome の設定画面から、「プライバシーとセキュリティ」⇒「サイトの設定」⇒「その他の権限」⇒「プロトコルハンドラ」を開き、「サイトがプロトコルの処理を要求できるようにする」を選択する。
【Google Chrome 設定画面 プロトコルハンドラー選択画面 その1】

【Google Chrome 設定画面 プロトコルハンドラー選択画面 その2】

【Google Chrome 設定画面 プロトコルハンドラー選択画面 その3】

② Outlook on the webを開き、アドレスバーのひし形が重なったマークを押す
【Google Chrome の Outlook on the Web 画面のアドレスバー】

③ 「すべてのメールリンクをoutolook.office.comで開きますか?」を許可する
【Google Chrome の Outlook on the Web 画面の通知】

参考URL:
作成したマクロの概要
エクセルに以下のような表を作成し、宛先のメールアドレスのリンクをクリックして、メールを作成する仕様とした。

操作手順
- メールリンク作成ボタンを押し、あらかじめ宛先欄に空のハイパーリンクを設定しておく
- 宛先欄のリンクをクリックすると、FollowHyperlinkイベントが発生し、以下の処理を行う
① 宛先情報の会社名・担当者を文頭に追加した本文データをクリップボードへ送る
② 送信情報を基にmailtoリンクを作成する
③ 作成したmailtoリンクをクリックする動作を起こして、メールを作成する
④ 作成したmailtoリンクを空のハイパーリンクに戻す - 作成されたメールにクリップボードへ送った本文を手動で貼り付ける
上記を踏まえ、2つのプロシージャをシートモジュール(メール作成シート)に作成した。
- シートモジュール(メール作成シート)
①「CreateBlankLink」プロシージャ:
宛先欄に空のハイパーリンクを設定する
②「Worksheet_FollowHyperlink」イベントプロシージャ:
本文データをクリップボードに送り、mailtoリンクを作成して、メールを作成する
mailtoリンクの作成について、当初、リンク作成ボタンを押して、宛先欄に直接、mailtoリンクを作成する仕様としていた。
しかし、リストのデータを変更した場合、再度、リンク作成ボタンを押して、リンクを作成し直さなければ、変更したデータが反映されない。
そのため、リンク作成ボタンを押し忘れて、変更が反映されていないということが、度々あった。
ワークシートのHYPERLINK関数であれば、すぐに変更が反映されると思ったが、HYPERLINK関数のハイパーリンクをクリックしても、FollowHyperlinkイベントが発生せず、FollowHyperlinkイベントが発生しないと、クリップボードへ本文を送る処理が実行できないため、断念した。
試行錯誤した結果、宛先欄にmailtoリンクを作成しておくのではなく、とりあえず空のリンクを宛先欄に作成しておき、FollowHyperlinkイベントプロシージャ内で、現在のリストのデータを基にmailtoリンクを作成し、リンクをクリックする動作を起こして、メールを作成する仕様とした。
補足:
作成に当たって、本文のデータをクリップボードへ送る際、DataObjectを使ったクリップボード操作では、エラーが生じるという問題が発生した。
そのため、以下URLを参考に、DataObjectを使わず、TextBoxを経由して文字列をコピーする方法とした。
完成したマクロ
シートモジュール(メールシート)に作成
Public Sub CreateBlankLink()
Dim i As Long
Dim myHyperlink As Hyperlink
i = 4
Do
Cells(i, "E").Hyperlinks.Delete
Cells(i, "E").Borders.LineStyle = xlContinuous
Set myHyperlink = ActiveSheet.Hyperlinks.Add(Anchor:=Cells(i, "E"), Address:="", ScreenTip:="メールアドレスをクリック")
i = i + 1
Loop Until Cells(i, "E").Value = ""
End Sub
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim TitleEncode As String
Dim Body As String
Dim myHyperlink As Hyperlink
Dim TargetRow As Long
TargetRow = ActiveCell.Row
'件名に改行がある場合は削除してエンコード
TitleEncode = WorksheetFunction.Clean(WorksheetFunction.EncodeURL(Cells(TargetRow, "D").Value))
Body = Cells(TargetRow, "H").Value & vbCrLf & Replace(Cells(TargetRow, "I"), Chr(10), " 様" & Chr(10)) & " 様" & vbCrLf & vbCrLf & Range("B4") & vbCrLf
With CreateObject("Forms.TextBox.1")
.MultiLine = True
.Text = Body
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
Set myHyperlink = Hyperlinks.Add(Anchor:=Cells(TargetRow, "E"), _
Address:="mailto:" & Cells(TargetRow, "E") & _
"?cc=" & Cells(TargetRow, "F") & _
"&bcc=" & Cells(TargetRow, "G") & _
"&subject=" & TitleEncode, _
TextToDisplay:=Cells(TargetRow, "E").Value, ScreenTip:="メールアドレスをクリック")
Application.EnableEvents = False
Selection.Hyperlinks(1).Follow
Application.EnableEvents = True
Set myHyperlink = ActiveSheet.Hyperlinks.Add(Anchor:=Cells(TargetRow, "E"), Address:="", ScreenTip:="メールアドレスをクリック")
End Sub
サンプルファイル保存先:

