2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

« ▼ダイエット大作戦(近頃だいぶメタボ) | トップページ | ◆Outlook VBA(タイトルバーの動的変更) »

2007年4月 4日 (水)

◆Outlook VBA(Outlookのカスタマイズと配布方法)

今回はOutlook VBAのカスタマイズと配布方法について書いてみたいと思います。

前回は「Visual Basic Editor」のVbaProject.OTMに標準モジュールを追加して処理を記述して、マクロから実行したところまででしたね。それでは、Outlook VBAの処理を実行する方法として、2通りご紹介します。まずは標準ツールバーにアイコンを追加してマクロを割り当てて見ましょう。

ツールバーにアイコン追加画像

Outlookのツールバー上で右クリックし、「ユーザ設定」画面→「コマンド」タブのマクロを選択すると、前回作成した選択メールの情報をExcel一覧化が表示されているので、左ボタンでぐっとつかみツールバー上にドラッグ&ドロップすればOKです。

この方法は自分だけでマクロを使う場合は良いですが、不特定多数の人に使用してもらうにはちょっとやっかいです。VBAマクロを配布するには、標準モジュールを「エクスポート」して.basファイルを作成し、他人に配布してから、配布した人間に上記のアイコン設定をしてもらわなければなりません。次に紹介するのはカスタムメニューの追加方法です。

Outlookメニューにカスタムメニュー追加画像

これを実現するには処理を書かなければなりません。私の記念すべき第1回目に書いたSub Application_Startup()に以下の処理を記述します。

    Const cMenu As String = "menu bar"
    Const cCtl1 As String = "Toolsメニュー(&M)"
    Const cCtl2 As String = "選択メールの添付ファイルを指定フォルダに一括保存"
    Const cCtl3 As String = "下書きメールに添付ファイルを添付して送信トレイに一括格納"
    Const cCtl4 As String = "選択メールを一括送信"
    Const cCtl5 As String = "選択メールの情報をExcel一覧化"
    Const cCtl99 As String = "バージョン情報"
   
    Dim oExp As Outlook.Explorer
    Dim oBar As Office.CommandBar
   
    Set oExp = Outlook.ActiveExplorer
    Set oBar = oExp.CommandBars.Item(cMenu)
   
    For Each myControl In oBar.Controls
        If cCtl1 Like myControl.Caption & "*" Then
            myControl.Delete
        End If
    Next
    Set myControl = oBar.Controls.Add(msoControlPopup, , , 7, True)
               
    With myControl
        .Caption = cCtl1
       
        Set mySubControl = .Controls.Add(msoControlButton, , , , True)
        With mySubControl
           .Caption = cCtl2 & "(&H)"
           .FaceId = 721
           .Style = msoButtonIconAndCaption
           .Tag = cCtl2
           .Visible = True
           .OnAction = cCtl2
        End With
       
        Set mySubControl = .Controls.Add(msoControlButton, , , , True)
        With mySubControl
           .Caption = cCtl3 & "(&K)"
           .BeginGroup = True
           .FaceId = 3739
           .Style = msoButtonIconAndCaption
           .Tag = cCtl3
           .Visible = True
           .OnAction = cCtl3
        End With
       
        Set mySubControl = .Controls.Add(msoControlButton, , , , True)
        With mySubControl
           .Caption = cCtl4 & "(&S)"
           .FaceId = 2617
           .Style = msoButtonIconAndCaption
           .Tag = cCtl4
           .Visible = True
           .OnAction = cCtl4
        End With
       
        Set mySubControl = .Controls.Add(msoControlButton, , , , True)
        With mySubControl
           .Caption = cCtl5 & "(&E)"
           .BeginGroup = True
           .FaceId = 366
           .Style = msoButtonIconAndCaption
           .Tag = cCtl5
           .Visible = True
           .OnAction = cCtl5
       End With
      
        Set mySubControl = .Controls.Add(msoControlButton, , , , True)
        With mySubControl
           .Caption = cCtl99 & "(&A)"
           .BeginGroup = True
           .FaceId = 3998
           .Style = msoButtonIconAndCaption
           .Tag = cCtl99
           .Visible = True
           .OnAction = cCtl99
       End With
    End With

    Set oExp = Nothing
    Set oBar = Nothing
    Set myControl = Nothing
    Set mySubControl = Nothing
End Sub

ま、ちょっと余計な処理が含まれていますが気にしないでください。解説すると、Set oExp = Outlook.ActiveExplorerでOutlookオブジェクトを生成し、Set oBar = oExp.CommandBars.Item(cMenu)でメニューオブジェクトを生成します。以降はoBarに対してメニュー項目を追加していくというわけです。コマンド自体はExcelとほぼ同じですね。以上を実装すると、Outlookを起動すると画像のようなメニュー項目が追加されるようになり、そのメニューからマクロを実行することができます。で、配布方法ですが、C:\Documents and Settings\@@@@\Application Data\Microsoft\Outlook配下に存在するVbaProject.OTMファイルを配布し、配布先の上記フォルダに格納してもらえばよいわけです。ただし、少し注意が必要ですが、既に配布先PCでVBAマクロを作成したりしているとVbaProject.OTMファイルが存在していることになります。その場合は導入まえに退避してもらうなどの対処が必要になります。

このほかにも、メニューではなくカスタムツールバーを作成する方法などもありますが、ネットで探索してみてください。便利ツールもいくつか存在するみたいですので。

今回はここまでとします。次回はOutlookのタイトルバーをカスタマイズしてみます。

※私が作成したVBAツールです。よかったら使ってみてください。

« ▼ダイエット大作戦(近頃だいぶメタボ) | トップページ | ◆Outlook VBA(タイトルバーの動的変更) »

パソコン・インターネット」カテゴリの記事

コメント

勤務先でOutlook2000を使用しており、メールサーバーとしてExchange2003?が使用されています。
Exchangeサーバー上に割り当てられたフォルダ容量が制限されており、ついつい越えてしまってメールが送信できなかったり、受信できなかったりします。
VBAにてOutlookのツールバーにExchangeサーバー上に割り当てられたフォルダ容量を表示することはできないでしょうか?

O2003toolsを利用させて頂きました。このマクロ登録すると、他のマクロの登録がパスワード入力が必要となりできません。解決方法はありますか?

添付ファイルの保存ができるのですが、削除が出来ません。ここを他のマクロを使って補完しようと思いました。

おはようございます、吉田 幸二さん。
ネットで検索しら同じ質問がありました。
ご参考にどうぞ
http://www.moug.net/faq/viewtopic.php?t=32941&sid=9460966c29999a6319ae35ffba9c6fcc

おはようございます、macさん。
O2003toolsはパスワード保護しているので、他のマクロを追加することはできません。当ブログで機能毎のソースを公開しているので自分でOTMファイルに一から追加すれば可能です。

Outlook2000のオプションCDO1.2の追加と参照設定と下記のマクロで解決しました。

Sub ShowMailboxSize()
Const PR_MESSAGE_SIZE = &HE080003
Dim objCtrl As CommandBarControl
Dim bNotFound As Boolean
Dim mapiSession 'As New MAPI.Session
Dim mbxStore 'As MAPI.InfoStore
Dim lSize As Long
Dim strSize As String

bNotFound = True
For Each objCtrl In ActiveExplorer.CommandBars("Standard").Controls
If objCtrl.Caption Like "サイズ:*" Then
bNotFound = False
Exit For
End If
Next

If bNotFound Then
Set objCtrl = ActiveExplorer.CommandBars("Standard").Controls.Add()
End If

Set mapiSession = CreateObject("MAPI.Session")
mapiSession.Logon "", "", False, False
Set mbxStore = mapiSession.GetInfoStore(mapiSession.Inbox.StoreID)
lSize = mbxStore.Fields(PR_MESSAGE_SIZE).Value
strSize = Format(Int(lSize / 1024), "###,###")

objCtrl.Caption = "サイズ:" & strSize & "K"
objCtrl.OnAction = "Project1.ThisOutlookSession.ShowMailboxSize"
End Sub

Private Sub Application_NewMail
ShowMailboxSize
End Sub

大変参考になりました。ありがとうございます。
さて、メニューは追加されたのですが、
メニューを選択しても処理が実行されません。
なにか他にもおまじないはあるのでしょうか?
メインメニュー→ツール→マクロ→マクロ
からは動きます。
他のマクロは動きます。
原因にここらあたりあればご教授願います。
======コード======
Private Sub Application_Startup()
Const cMenu As String = "menu bar"
Const cCtl1 As String = "Test"
Const cCtl2 As String = "Test1"
Dim oExp As Outlook.Explorer
Dim oBar As Office.CommandBar

Set oExp = Outlook.ActiveExplorer
Set oBar = oExp.CommandBars.item(cMenu)

For Each myControl In oBar.Controls
If cCtl1 Like myControl.Caption & "*" Then
myControl.Delete
End If
Next

Set myControl = oBar.Controls.Add(msoControlPopup, , , 7, True)

myControl.Caption = cCtl1

Set mySubControl = myControl.Controls.Add(msoControlButton, , , , True)
mySubControl.Caption = cCtl2 & "(&H)"
mySubControl.OnAction = cCtl2

Set oExp = Nothing
Set oBar = Nothing
Set myControl = Nothing
Set mySubControl = Nothing

End Sub

Sub Test1()

MsgBox "Hit"

End Sub
================

こんばんは、KKさん。
返信が遅くなりすみません。

心当たりといえば、Sub Test1()を
Application_Startupと同じ
ThisOutlookSessionに記述して
しまっているのではないでしょうか?
標準モジュールを作成し、そこに
記述すると私のOutlookでは正常に
動作しました。

できましたーーー。
ご教授ありがとうございました!!!!!
感激しましたであります。
これにすっごいてこずってました。
すばらしいーーー。
m(_。_)m

お久しぶりです。いつぞやのK.Kです。
その節は大変ありがとうございました。
マスターと呼ばせてくださいm(_。_)m
さて、Outlookにて、新規作成→メッセージであたらしくメールを書くためのウインドウが表示されますが、ここのメニューに項目を追加したいのですが、どうしたらよろしいのでしょうか?
マスター、フォースならぬソースを与えたまえ(^^;
ちなみに、OutlookのVBAについての書籍(入門から中級程度まで)ってありますか?マスターはどのようにして覚えましたか?

こんにちはKKさん、平です。
新規メッセージのメニューに追加したいとのことですが、どんな機能を追加したいのでしょうか。
ま、それはともかくとして、以下の要領で追加できるようです。本体のメニュー追加ロジックを応用しています。新規メッセージオブジェクトのGetInspectorに対してメニューを追加するということです。お試しあれ。

~抜粋~

'新規メッセージ作成
Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.CreateItem(olMailItem)
'メニュー作成
Set oExp = myItem.GetInspector
Set oBar = oExp.CommandBars.Item(cMenu)
myItem.Display



Outlook VBAについては私も正直よく分っていません。ヘルプの使用例のソースや実際に実行してオブジェクトのプロパティなどから探っているだけです。
だた、Excel VBAの知識が効いているのかもしれません。開発のヒントとして私が重要と考えている点はWordもOutlookもExcelとオブジェクト構造が異なるので、やりたい事がどのオブジェクトに対して操作すればよいのかヘルプを足掛かりにしています。

こんばんは。
いつもありがとうございます。マスター様。
まず、VBAでやりたいことですが、
メールの宛先を解析し、指定ドメイン以外の宛先を消去する機能を作りたいのです。すでに送信ボタンを押下時のイベントをひろって実現はしているのですが、これではある意味怖いので、送信ボタンではなく、メッセージ作成のウインドウにあるメニューに項目を追加して、そのメニューが選択されたときに消去したいのです。ゆくゆくは、宛先からアドレス帳の所属をチェックして、対象所属以外の宛先を消去したいとも考えています。
で、本題ですが、上記のソースコードをどのあたり?に入れればよいのでしょうか?新規作成→メッセージを選択して、はじめてウインドウが現れるわけですから、そのメッセージに対応する関数になるでしょうか?
ではでは。

コメントを書く

(ウェブ上には掲載しません)

« ▼ダイエット大作戦(近頃だいぶメタボ) | トップページ | ◆Outlook VBA(タイトルバーの動的変更) »