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


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

0. 下準備

Outlook で VBA マクロを作成するにあたっては、まず「自己署名入りデジタル証明書」を作成することをお勧めします。
いきなり難しい言葉が出てきた、と思われる方もいるかもしれませんね。「自己署名入りデジタル証明書」とは、あなたが作成したマクロが改ざんされていないことを証明するために使用されるものです。
これを作成しなくてもマクロを使うことはできますが、その場合にはマクロのセキュリティ レベルを下げる必要があり、ウィルスに感染する危険が高まってしまいます。
そのため、マクロを使うためにあらかじめデジタル証明書を作っておくことをお勧めするわけです。
作り方は以下の通りです。

  1. [スタート]-[すべてのプログラム]-[Microsoft Office]-[Microsoft Office ツール] にある [VBA プロジェクトのデジタル証明書] を起動します。
  2. [デジタル証明書の作成] ダイアログの [証明書の名前] に自分の名前を入力します。
  3. [OK] をクリックします。

これでデジタル証明書の作成は終了です。名前の割りに意外と簡単だと思いませんか?

1. マクロの作成

準備が終わったところで、マクロの作成を行います。今回は簡単なサンプルとして「"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. [ツール]-[デジタル署名] をクリックします。
  8. [選択] をクリックし、[証明書の選択] で先ほど作ったデジタル証明書を選択し、[OK] をクリックします。
  9. Ctrl+S キーを押し、マクロを VbaProject.OTM として保存します。

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

2. マクロを実行する

上記で作成したマクロを実行する方法は、Outlook 2010 と Outlook 2007 では異なります。以下、それぞれのバージョンについて説明します。

Outlook 2010 の場合

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

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

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

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

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

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

Outlook 2010 ではリボンにマクロを呼び出すボタンを追加できます。

追加の手順は以下の通りです。

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

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

Outlook 2007 の場合

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

A. [ツール]-[マクロ] による実行

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

また、[実行] ではなく [ステップ イン] をクリックすると、マクロを 1 行ずつ実行するモードに入るため、作成中のマクロの動作を確認する場合などには、こちらの方法が便利でしょう。

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

動作を確認したマクロをワンクリックで呼び出すには、ツール バーにマクロを実行するボタンを追加します。

追加の手順は以下の通りです。

  1. ツールバーを右クリックし、[ユーザー設定] をクリックします。
  2. [ユーザー設定] ダイアログの [コマンド] タブの [分類] で [マクロ] を選択します。
  3. [コマンド] の上記で追加したマクロ (Project1.ThisOutlookSession.HelloWorld) をツールバーの追加したい位置にドラッグアンドドロップします。
  4. [選択したボタンの編集] をクリックし、[名前] に任意の名前を入力します。このとき、[ボタン イメージの変更] や [ボタン イメージの編集] でツールバーのアイコンを好きなものに変更することができます。

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

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

3. アイテム単位でのマクロの実行

マクロによっては、表示中のアイテムに対して実行したいという場合があり、その際にはアイテムを開いてからそのウィンドウでマクロを実行することになります。

Outlook 2003 ではこのウィンドウで [ツール]-[マクロ] によってマクロを実行できたのですが、Outlook 2007 以降には [ツール] メニューがありません。

そのため、Outlook 2007 以降でアイテム単位でのマクロを実行するには、以下のいずれかの方法を使います。

A. リボンの [開発] タブを有効にする

Outlook 2010 では、前述のリボンのカスタマイズの手順により、アイテム作成ウィンドウでの [開発] タブを有効にします。

また、Outlook 2007 では、[ツール]-[オプション]-[その他] の [詳細オプション] をクリックし、[[開発] タブをリボンに表示する] をオンにすると、アイテムの表示でリボンに [開発] タブが追加されます。

この設定をしてから、アイテムを作成し、[開発] タブの [マクロ] をクリックして、[ThisOutlookSession.HelloWorld] を実行すると、上記で作成したマクロが実行されます。

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

Office 2007 以降では、頻繁に使う機能をクイック アクセス ツール バーに追加できるようになり、独自に作成した VBA マクロも追加できます。

よく使うマクロであれば、こちらの方法がよいでしょう。

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

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

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

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

上記の手順でマクロの登録や実行はできるのですが、Outlook を再起動してマクロを実行しようとすると、「Microsoft Office Outlook のセキュリティに関する通知」という警告が表示されます。

ここで、[マクロを有効にする] をクリックすれば実行できますが、不用意に実行することはお勧めできません。

必ず、以下のような手順で実行して下さい。

  1. [Microsoft Office Outlook のセキュリティに関する通知] で [署名の詳細を表示] をクリックします。
  2. [全般] タブの [署名者の情報] の [名前] に、「自己署名入りデジタル証明書」の作成の際に入力した名前が表示されていることを確認します。もし違う名前が表示されていたら、決してマクロは実行しないでください。
  3. [OK] をクリックし、ダイアログを閉じます。
  4. 上記手順 2. で自分が作成した証明書であることを確認している場合は、[この発行者のドキュメントをすべて信頼する] をクリックすることで、次回以降このチェックを省略することができますが、より安全性を保つためには毎回上記の手順で名前を確認した後、[マクロを有効にする] をクリックします。

以上で、Outlook でマクロを作成する手順の説明は終了です。実際に Outlook でマクロを組むには、前述のとおり Outlook のオブジェクト モデルの理解が必要となりますが、それについてはまた後日説明しましょう。

広告

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

  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. 大変お世話になっております。
    >>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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中