外部からOutlookのマクロを実行するマクロ
今回は外部からOutlookのマクロを実行するマクロを紹介します。
「Ol 2000: VBScript から VBA プロシージャを呼び出す」に記載されている方法もあるのですが、2010の場合は上手く動作しなかったので別の方法を考えてみました。
Option Explicit Public Sub Sample() 'RunOutlookMacro "SampleModProc" '標準モジュール RunOutlookMacro "Project1.ThisOutlookSession.SampleTosProc" 'ThisOutlookSession End Sub Public Sub RunOutlookMacro(ByVal MacroName As String) If CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery _ ("Select * From Win32_Process Where Name = 'OUTLOOK.EXE'").Count < 1 Then Shell "OUTLOOK.EXE" End If With CreateObject("Outlook.Application") With .ActiveExplorer.CommandBars("Standard").Controls.Add(Type:=1, Temporary:=True) .OnAction = MacroName .Execute .Delete End With .Quit End With End Sub
上記コードは”Standard“ツールバーに一時的(Temporary:=True)に指定したマクロを呼び出すコントロールを追加して、外部からそのコントロールを実行(Execute)する仕組みを取っています。
そのため、Outlookのセキュリティ設定でマクロが有効になっていることが前提になってしまいますが、使い勝手はそれなりに良いだろうと思います。
(“外部からOutlookのマクロを実行する”需要があるのかどうかは別にして…)
2012/07/13 追記:
autorunスイッチがあることを知ったので、このスイッチを使ったコードも考えてみました。
Option Explicit Public Sub Sample() 'RunOutlookMacro "SampleModProc" '標準モジュール RunOutlookMacro "Project1.ThisOutlookSession.SampleTosProc" 'ThisOutlookSession End Sub Public Sub RunOutlookMacro(ByVal MacroName As String) Shell "OUTLOOK.EXE /autorun """ & MacroName & """" End Sub
2014/01/22 追記:
■ 引数付きでマクロを実行する場合
通常は「OnActionで実行するプロシージャに引数を渡す」にあるような方法でOnActionプロパティで引数を設定できるのですが、Outlookの場合は何故か上手く行きませんでした。
外部からOutlookのマクロを引数付きで呼び出す場合は、下記のようにActionControlプロパティからCommandBarControlオブジェクトを取得し、Parameterプロパティを利用して引数を渡すのが良いだろうと思います。
・Outlook側
Option Explicit Public Sub SampleModProc() Dim msg As String msg = ActiveExplorer.CommandBars.ActionControl.Parameter MsgBox msg, vbSystemModal End Sub
・呼び出し側
Option Explicit Public Sub Sample() RunOutlookMacro "SampleModProc", "Hello!!" End Sub Public Sub RunOutlookMacro(ByVal MacroName As String, Optional ByVal Arg As String = "") If CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery _ ("Select * From Win32_Process Where Name = 'OUTLOOK.EXE'").Count < 1 Then Shell "OUTLOOK.EXE" End If With CreateObject("Outlook.Application") With .ActiveExplorer.CommandBars("Standard").Controls.Add(Type:=1, Temporary:=True) .OnAction = MacroName If Len(Trim(Arg)) > 0 Then .Parameter = Arg .Execute .Delete End With .Quit End With End Sub
■ 関連Webページ
・Ol 2000: VBScript から VBA プロシージャを呼び出す
http://support.microsoft.com/kb/221827/ja
・別のプログラムから Outlook を自動化する方法
http://support.microsoft.com/kb/201096/ja
・Office Space: Microsoft Outlook が既に実行中であるかどうかに関係なくスクリプトを起動する
http://gallery.technet.microsoft.com/office/cd88e4e2-e45f-4d43-b19e-9ace3486b295
外部からOutlook 2010のマクロを「引数付きで」呼び出すことはできないでしょうか?
どうしてもExcelもしくはVBSから呼び出す必要があり、困っています。
> mm様
記事に追記しましたが、外部からOutlookのマクロを引数付きで呼び出す場合は、CommandBarControlオブジェクトのParameterプロパティを使うのが良いだろうと思います。