1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBA mailtoリンクを使ってOutlook on the webで新規メールを作成

Last updated at Posted at 2025-03-27

はじめに

同じ内容のメールを、異なる宛先へ、メール本文の送信先の会社名・担当者名を変更しながら、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の設定画面から、「アプリ」⇒「既定のアプリ」の画面を開く

【Windows設定の既定のアプリ選択画面】
スクリーンショット 2025-03-22 135147.png

 

 ②検索欄に「mailto」と入力、MAILTOの既定を「Microsoft Edge」に変更する。
 
【既定のアプリ MAILTO設定画面】
スクリーンショット 2025-03-22 135450.png

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になっていれば成功で、プロトコルハンドラーが正常に登録された状態となる。
スクリーンショット 2025-09-04 115322.jpg

Google Chrome の場合の設定について

参考までに、Google Chromeの場合の設定方法を記載する。

1. 既定のアプリのMAILTOを設定する
 MAILTOの既定を「Google Chrome」に変更する

【既定のアプリ MAILTO設定画面】
スクリーンショット 2025-09-04 102644.jpg

2. ブラウザのプロトコルハンドラー設定
 ① Google Chrome の設定画面から、「プライバシーとセキュリティ」⇒「サイトの設定」⇒「その他の権限」⇒「プロトコルハンドラ」を開き、「サイトがプロトコルの処理を要求できるようにする」を選択する。

【Google Chrome 設定画面 プロトコルハンドラー選択画面 その1】
スクリーンショット 2025-09-04 103656.jpg

【Google Chrome 設定画面 プロトコルハンドラー選択画面 その2】
スクリーンショット 2025-09-04 103921.jpg

【Google Chrome 設定画面 プロトコルハンドラー選択画面 その3】
スクリーンショット 2025-09-04 104334.jpg

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

【Google Chrome の Outlook on the Web 画面のアドレスバー】
スクリーンショット 2025-09-04 105605.jpg

 ③ 「すべてのメールリンクをoutolook.office.comで開きますか?」を許可する

【Google Chrome の Outlook on the Web 画面の通知】
スクリーンショット 2025-09-04 110010.jpg

参考URL:

作成したマクロの概要

エクセルに以下のような表を作成し、宛先のメールアドレスのリンクをクリックして、メールを作成する仕様とした。
メール作成ツール.jpg

操作手順

  1. メールリンク作成ボタンを押し、あらかじめ宛先欄に空のハイパーリンクを設定しておく
  2. 宛先欄のリンクをクリックすると、FollowHyperlinkイベントが発生し、以下の処理を行う
    ① 宛先情報の会社名・担当者を文頭に追加した本文データをクリップボードへ送る
    ② 送信情報を基にmailtoリンクを作成する
    ③ 作成したmailtoリンクをクリックする動作を起こして、メールを作成する
    ④ 作成したmailtoリンクを空のハイパーリンクに戻す
  3. 作成されたメールにクリップボードへ送った本文を手動で貼り付ける

上記を踏まえ、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

サンプルファイル保存先:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?