Outlook VBA マクロ、はじめの一歩


Outlook には Word や Excel と同様、VBA によるマクロ機能がありますが、Word や Excel とは異なり、ユーザーの操作をマクロとして記憶する機能がありません。
そのため、Outlook で VBA マクロを使うには、Outlook のオブジェクト モデルというものを理解することが必要となり、とっつきにくいものとなってしまっているように思います。
しかし、使いこなせるようになれば色々と便利です。
そこで、このページでは Outlook 2010 以降で VBA マクロを作成する手順をステップ バイ ステップで説明します。

1. マクロの作成

マクロを作成するには、Visual Basic Editor を使用します。
今回は簡単なサンプルとして「”Hello World” というダイアログ メッセージを表示する」というマクロを作ります。
手順は以下の通りです。

  1. Outlook を起動します。
  2. Alt+F11 キーを押します。すると Visual Basic Editor が起動します。
  3. [Microsoft Visual Basic – Project1] ウィンドウの左側の [Project1] の左横にある + 記号をクリックして展開します。
  4. 同様にその下に表示される [Microsoft Office Outlook Objects] を展開します。
  5. [ThisOutlookSession] をダブルクリックします。すると、右に [Project1 – ThisOutlookSession (コード)] というタイトルのウィンドウが表示されます。
  6. [Project1 – ThisOutlookSession (コード)] に以下のプログラムを入力します。
    Public Sub HelloWorld()
        MsgBox "Hello World"
    End Sub
  7. Ctrl+S キーを押し、マクロを VbaProject.OTM として保存します。

これでマクロが登録されました。

2. マクロを実行する

作成したマクロを実行するには以下の 3 通りの手段があります。

A. リボンの [マクロ] から実行

まず、以下の手順で [開発] タブをリボンに追加します。

  1. リボンを右クリックし、[リボンのユーザー設定] をクリックします。
  2. 右のボックスの [開発] のチェックボックスをオンにし、[OK] をクリックします。

これにより追加された [開発] タブの [マクロ…] をクリックすると、登録されているマクロの一覧が表示されますので、上記で追加したマクロ (Project1.ThisOutlookSession.HelloWorld) を選択することでマクロを実行することができます。

B. ツール バーに追加して実行

Outlook ではリボンにマクロを呼び出すボタンを追加できます。
追加の手順は以下の通りです。

  1. リボンを右クリックし、[リボンのユーザー設定] をクリックします。
  2. [コマンドの選択] の下のドロップダウンから [マクロ] を選択します。
  3. 下のリストボックスにマクロの一覧が表示されるので、上記で追加したマクロ (Project1.ThisOutlookSession.HelloWorld) を選択します。
  4. 右に表示されるリボンのタブのうち、マクロを追加したいタブを選択し、[新しいグループ] をクリックします。
  5. 必要に応じて [名前の変更] をクリックしてグループの名前やアイコンを変更します。
  6. 二つのリストボックスの間にある [追加 >>] をクリックし、グループにマクロを追加します。
  7. 必要に応じて [名前の変更] をクリックしてグループの名前やアイコンを変更します。
  8. [OK] をクリックします。

これで、リボンのボタンをクリックするだけでマクロが起動できるようになります。

C. クイック アクセス ツール バーに追加する

Office 2007 以降では、頻繁に使う機能をクイック アクセス ツール バーに追加できるようになり、独自に作成した VBA マクロも追加できます。
よく使うマクロであれば、こちらの方法がよいでしょう。

上記で作成したマクロを追加する手順は以下の通りです。

  1. クイック アクセス ツール バーの右端の下向きの三角形をクリックします。
  2. [その他のコマンド] をクリックします。
  3. [コマンドの選択] で [マクロ] を選択します。
  4. [Project1.ThisOutlookSession.Hello…] をクリックします。
  5. [追加] をクリックします。
  6. [変更] をクリックし、ツール バーでのアイコンや表示名を設定します。
  7. [OK] をクリックし、クイック アクセス ツール バーのカスタマイズを終了します。

これで、クイック アクセス ツール バーからマクロが実行できるようになります。

なお、マクロを登録する際、イベントなどで呼び出されるマクロは Private Sub として宣言しますが、このようなマクロは [ツール]-[マクロ]-[マクロ…] には表示されず、ツールバーにも追加できません。
その場合でも、イベントが発生することで自動的にマクロは実行されます。

3. 再起動後のマクロ実行

上記の手順でマクロの登録や実行はできるのですが、Outlook を再起動してマクロを実行しようとすると、「Microsoft Office Outlook のセキュリティに関する通知」という警告が表示されます。
ここで、[マクロを有効にする] をクリックすれば実行できますが、毎回クリックするのは煩わしいと思いますので、以下の手順でこの警告を無効にします。

  1. [開発] タブの [マクロのセキュリティ] をクリックします。
  2. [マクロの設定] の [すべてのマクロを有効にする (推奨しません。危険なコードが実行される可能性があります)] をクリックします。
  3. [OK] をクリックし、ダイアログを閉じます。

危険なコードが実行される可能性があるとなってはいますが、ファイルにマクロを設定してメールなどで送付できる Word や Excel とは異なり、Outlook のマクロはローカルに保存された特定のファイルにのみマクロが格納されるため、危険なコードが埋め込まれる可能性は極めて低いと考えられます。
仮にローカルのマクロを置き換えることができる状況であれば、直接 Outlook を操作することもできるので、わざわざマクロを書き換えることもないでしょう。

それでもやはり不安があるということであれば、マクロにデジタル署名を設定して改ざんされたらマクロが実行されなくなるようにすることも可能です。
デジタル署名を行う手順は以下の通りです。

  1. Alt+F11 キーで Visual Basic Editor を起動します。
  2. CTRL+G キーで [イミディエイト] ウィンドウを開きます。
  3. [イミディエイト] ウィンドウで以下のコマンドを入力します。shell "selfcert.exe"
  4. [デジタル証明書の作成] が起動されるので、[証明書の名前] に適切な名前を入力し、[OK] をクリックします。
  5. Visual Basic Editor に戻り、[ツール]-[デジタル署名] をクリックします。
  6. [選択] をクリックします。
  7. Windows の証明書選択画面が表示されるので、上記で作成した証明書が選択されていることを確認して [OK] をクリックします。
    作成したものと異なる証明書が表示された場合は、[その他] をクリックし、作成した証明書を選択して [OK] をクリックします。
  8. [OK] をクリックします。
  9. CTRL+S キーでマクロを保存します。

以上で、マクロを作成する手順の説明は終了です。
実際に Outlook でマクロを組むには、前述のとおり Outlook のオブジェクト モデルの理解が必要となりますが、オブジェクト モデルを一つ一つ理解するよりも、特定の処理を行うサンプルをベースにカスタマイズするほうが楽かもしれません。
このブログで公開したマクロやスクリプトのサンプルへのリンク集が以下のページにありますので、こちらを参考にしてみてください。

Outlook マクロ・スクリプト インデックス

Outlook VBA マクロ、はじめの一歩」への428件のフィードバック

  1. 突然ですみませんですが、一つ聞きたい事があります。outlook2003にてそのままの新規ボタンでマクロ起動する方法がありあすか?新たしいボタンを作らないでoutlookの外観をかわないで新規メールボタンを押して、メールを新規して、そしてこの時あるマクロを起動するのができます。今、こういう要望がありますので悩んでますので、ご存知でしたらよろしくお願いいたします。

  2. To lin pinfu さん新規ボタンでマクロなどのスクリプトを動作させる方法としては、以下の2通りが考えられます。1. Inspectors_NewInspector により、新しいメッセージ作成ウィンドウが開いた場合の処理が実装できます。2. FormSwap により、メッセージ作成のフォームをカスタマイズしたフォームに置き換え、そのフォーム内でスクリプトを実行します。ただし、新規作成だけでなく受信メッセージや予定アイテムなどを開いた場合にもイベントやフォームのスクリプトが起動されるため、開いたメッセージが新規作成かどうかをどうやって判別するかという問題があります。署名を入れないようにしておけば、本文が空で送信時間が 4501/1/1 だったら新規作成メッセージと判断できますが、署名を自動で入れる場合にはいろいろと面倒かもしれません。

  3. […] Application_NewMailEx イベントはメッセージを Outlook で受信したタイミングで発生するイベントですが、Exchange サーバー環境で利用している場合、Outlook を起動していない間にサーバーで受信されたメッセージに対してはこのイベントが発生しません。 サーバーで受信されたメッセージに対しても添付ファイルの保存を行うには、下記のようなマクロを記述し、自動仕分けのクライアント ルールで [スクリプト] アクションとして "SaveAttachments" を指定します。 ' 添付ファイルの保存を行うサブ プロシージャ Public Sub SaveAttachments(objMsg As MailItem)     Const SAVE_PATH = "C:attachments"     Dim objFSO As Object ' FileSystemObject     Dim objAttach As Attachment     Dim strFileName As String     Dim c As Integer: c = 1 '        Set objFSO = CreateObject("Scripting.FileSystemObject") ' For Each objAttach In objMsg.Attachments         With objAttach            '             strFileName = SAVE_PATH & objAttach.FileName             '             While objFSO.FileExists(strFileName)                 strFileName = SAVE_PATH & Left(.FileName, InStrRev(.FileName, ".") – 1) _                     & "-" & c & Mid(.FileName, InStrRev(.FileName, "."))                 c = c + 1             Wend             '             .SaveAsFile strFileName         End With     Next     Set objMsg = Nothing     Set objFSO = Nothing End Sub マクロの登録方法やメニューへの追加について […]

  4. ありがとうございます。

    今実行してみたところ
    「このストアではルールがサポートされていません。処理を完了出来ませんでした。」とのことでした。
    デバッグしてみると
    Public Sub CreateRuleMoveBySender()関数の
    「Set objRules = objStore.GetRules()」で問題が会ったみたいです。

    最初にいい忘れたのですが、こちらはoffice2010の環境です。
    どうか解決してくださると幸いです。

  5. Outlook2007ですが、マクロを複数登録するにはどうしたら良いでしょうか?
    説明にある通り、マクロを1つだけ登録して実行するのは出来たのですが、
    他のマクロを追加する方法が分かりません。
    Project1.ThisOutlookSession のコード全体を差し替えて保存する。までは出来ましたが、
    それだと、 ThisOutlookSession を書き換えてしまうため、常に1つのマクロしか実行できません。
    複数のマクロを登録しておく方法があれば、教えて頂けないでしょうか?

    • 複数登録するには、単に ThisOutlookSession の中に続けて別のマクロを記述するだけで構いません。
      ただ、同じ名前のマクロを複数登録することはできないので、場合によっては名前を変える必要があります。
      名前は、以下の記述の XXXX の部分です。

      Public Sub XXXX()

      上記の記事の例では HelloWorld がマクロ名になります。

      • お返事、有難うございます!出来ました。
        分割されたメールの結合マクロで、いつもお世話になっていて、
        今回、別のも試してみたかったので、大変助かりました。有難うございました!

  6. Googleで検索してこのサイトにたどり着きました。

    丁寧な解説のおかげで、署名から始めて誤って開封してしまったメールの合成まで無事たどり着くことができました。
    Outlook2003でも同様の機能を持ったプラグインを使っていましたが、こちらのプログラムの方が良い意味でシンプルにできているように思います。

    以前から個人的にマクロには興味があったものの、取り掛かれなかったのでこのサイトをきっかけにマクロのはじめの一歩を踏み出してみたいと思います。

    どうも有難うございました

  7. このページの 1.マクロの作成 の項目 2.では「Alt+F10 キーを押します。すると Visual Basic Editor が起動します。」と表示されています。
    「Alt+F10」は、「Alt+F11」の誤りではないでしょうか?
    私のPCのOL2003およびOL2007では、「Alt+F11」でVBEが起動します

  8. 当方のoutlook2007 ではツール→マクロ→マクロで登録したはずのマクロが表示されず…とても残念です。

  9. 大変お世話になっております。
    >>66のコメントと似た質問になってしまうのですが
    複数のitemsendアイテムをProject1.ThisOutlookSessionに登録する方法は御座いますでしょうか。
    そのままだと『名前が適切ではありません』のエラーが出てしまい、かと言ってタイトルを変えるとitemsendとして認識されなくなってしまいます。
    お手数では御座いますが、助言いただけますと幸いです。

    当方outlook2010 を使用しています。

    • 複数の ItemSend を登録することはできませんが、ItemSend で実行する内容をそれぞれ別の Sub として登録し、ItemSend でそれぞれを呼び出せばよいと思います。

      たとえば、以下のような形です。

      Private Sub Application_ItemSend( ByVal Item As Object, Cancel As Boolean)
      ItemSend1 Item, Cancel
      ItemSend2 Item, Cancel
      End Sub

      Private Sub ItemSend1( ByVal Item As Object, Cancel As Boolean)
      ‘ 一つ目の ItemSend で実行したい内容
      End Sub

      Private Sub ItemSend1( ByVal Item As Object, Cancel As Boolean)
      ‘ 二つ目の ItemSend で実行したい内容
      End Sub

  10. […] Outlook VBA マクロ、はじめの一歩Outlook には Word や Excel と同様、VBA によるマ… 段落内改行を一括置換するOutlookマクロ「段落内改行 置換 Outlook マクロ」といったキーワードでのアクセスがありました。 恐らくメール本文内に…www.ka-net.org 【Outlook VBA】メール本文中のハイパーリンクを一括で削除する | エク短|Extan.jp本文中のハイパーリンクを削除する場合は一つづつ右クリックして削除をしなければならず、特に複数あった場合は少々面倒ですよね。 今回は、前回の「【Outlook VBA】メール本文中の""や"file:"から始まる文字列へハイパーリンクを一括挿入する」に続いて、本文中のハイパーリンクを一括で削除できる方法をご紹介します…extan.jp Word:ワイルドカードを使った検索と置換を極める – 教えて!HELPDESKWordの検索/置換で利用されるワイルドカードの使い方についてご説明します。office-qa.com 仕事術 Outlook VBA cheeseをフォローする cheese ちぇろぐ […]

複数の PST を一括でプロファイルに追加するマクロ « Outlook 研究所 への返信 コメントをキャンセル