Office では、各 Office アプリケーションのメニューやツール バーは CommandBars オブジェクト
モデルによって表されます。CommandBars は Office の共有コンポーネントで、オブジェクト モデルは Microsoft Office 10.0
Object Library で提供されます。CommandBars オブジェクト モデルは Outlook オブジェクト
モデルに含まれていません。代わりに、Outlook オブジェクトは Microsoft Office 10.0 Object Library
からこの機能を利用します。
Outlook CommandBar アーキテクチャ
Outlook 以外の Office アプリケーションは 1 セットの CommandBars をサポートしますが、Outlook
は 2 セットの CommandBars をサポートします。メイン アプリケーション ウィンドウで 1 セットと、各個別のアイテムで 1 セットです。
開発者は、Outlook のメイン ウィンドウ (アプリケーション ウィンドウ) を "エクスプローラ" と呼んでいます。
重要 : これらのウィンドウは、フォルダを右クリックして [新しいウィンドウで開く]
をクリックすることで、別のウィンドウを開いて、別のフォルダで作業できます。そのため、これらのウィンドウはフォルダ レベルのウィンドウとも見なされます。
これらのエクスプローラ ウィンドウに以外に、各 Outlook アイテムは "インスペクタ" と呼ばれるフォーム
ウィンドウを所持しています。これらのアイテムにはメニューおよびツール バーがあるため、これらのインスペクタ ウィンドウも 1 セットの CommandBars
を持っています。
以下のようにオブジェクトを使い分けます。
- Outlook のメイン アプリケーション ウィンドウを参照するには、エクスプローラ オブジェクト
(ActiveExplorer/GetExplorer) を使用します。
- Outlook アイテムのウィンドウを参照するには、インスペクタ オブジェクト
(ActiveInspector/GetInspector) を使用します。
| "アクティブ" なウィンドウ | フォルダまたはアイテムの
ウィンドウの種類 | を参照する方法 | ウィンドウを参照する方法
---------------------------------------------------------------------------------
アプリケーション | ActiveExplorer メソッドを使用。 | GetExplorer メソッドを使用。
| |
アイテムまたはフォーム | ActiveInspector メソッドを使用。 | GetInspector メソッドを使用。
Microsoft Word を電子メール エディタとして使用する際の考慮事項
メール アイテムの Outlook CommandBar ソリューションを設計する場合、Microsoft Word を電子メール
エディタとして設定すると異なる CommandBars が使用されることを理解しておく必要があります。Word を電子メール
エディタとして使用するときに考慮すべきいくつかの主要な点は以下のとおりです。
- CommandBars は Word の一部であり、Outlook の一部ではない。
- 使用できる CommandBar は、メッセージのエディタと形式によって異なる。
- メッセージ エディタまたは書式を変更すると、ユーザー設定ボタンが非表示になる場合がある。
- Envelope CommandBar は設計上の扱いが特殊であり、ユーザー設定できない。
- Word を電子メール エディタとして設定している場合、Office 2000 では HTML
形式とテキスト形式のインスペクタ オブジェクトが存在しない。
利用できる CommandBars は、エディタ (Outlook と Word) とメッセージ形式 (リッチ
テキスト形式、HTML、およびテキスト形式)
の組み合わせによって異なることがあります。そのため、各構成についてソリューション全体をテストすることが重要です。構成によって利用できる CommandBars
が異なるため、ある構成で追加したボタンが、別の構成に変更した後で表示されなくなることがよくあります。Word を電子メール
エディタとして設定した状態では、Word アプリケーションがアイテム レベル (インスペクタ) の CommandBars を提供します。Microsoft
Office 2002 を使用する場合は、インスペクタ オブジェクトを使用してこれらの Word CommandBars
の一部にアクセスできますが、Microsoft Office 2000 を使用している場合はアクセスできません。Office 2000 で Word
を電子メール エディタとして使用する場合、HTML メッセージおよびテキスト形式のメッセージにはインスペクタ オブジェクトが含まれないため、Word
オブジェクト モデルを使用して CommandBars にアクセスする必要があります。また、CommandBar
のユーザー設定情報の格納場所も、CommandBars を提供するアプリケーションによって異なります。標準の Outlook CommandBars
に対するユーザー設定情報は Outcmd.dat ファイルに格納されますが、Word CommandBar に対するユーザー設定情報は Word の
Normal.dot グローバル テンプレートに格納されます。
また、Word
のバージョンと電子メール メッセージ形式によって、異なる 2 種類の CommandBar
テクノロジ セットが提供されています。Office 2002 では、すべてのメッセージ形式がデフォルトで特殊な Envelope CommandBar
を使用しますが、Office 2000 では、HTML メッセージとテキスト形式のメッセージのみがデフォルトで Envelope CommandBar
を使用します。Envelope CommandBar には、[送信] ボタンやメッセージ フィールド ("宛先"、"CC"、"件名")
など、電子メール固有の機能が含まれています。Envelope CommandBar は Word のツール
バーの一覧に表示されず、ユーザー設定できるように設計されていないため、他の CommandBars にもすべて変更を加える必要があります。Office
2000 はリッチ テキスト形式のメッセージを個別に処理し、メッセージの作成と読み取りに [Outlook メールの送信] と [Outlook
メールの開封] CommandBars を使用します。Office 2002 のメッセージ形式はデフォルトでは [Outlook メールの送信] と
[Outlook メールの開封] CommandBars を使用しませんが、これらの CommandBars を使用するユーザー設定の Outlook
フォームを設計できます。Word を電子メール エディタとして使用するようにユーザー設定のフォームを構成するには、フォーム デザイン モードでフォームの
[(プロパティ)] タブをクリックし、[Microsoft Word を電子メール エディタとして使用する] をオンにします。
Outlook におけるユーザー設定可能なメニューとツール バーのサポートの変遷
CommandBars は本来 Word や Microsoft Excel
などのドキュメント中心のアプリケーション用に設計されました。ドキュメント中心のアプリケーションは、1 セットのアプリケーション レベルの
CommandBars をサポートします。他のアプリケーションについては、CommandBars
デザインのすべての機能が完全にサポートされており、Microsoft Office 97 以降では、CommandBars
のユーザー設定機能はさまざまな方法で完全にサポートされています。ただし、Outlook の CommandBar
については、以下のようなさまざまな方法でサポートを継続しています。
- Microsoft Outlook 97 では、Outlook ユーザー インターフェイスを使用してツール
バーとメニューをユーザー設定できません。Outlook 97 は CommandBars への変更を保存するように設計されていません。CommandBars
オブジェクト モデルは Outlook オブジェクト モデルに公開されますが、メニューやツール バーが "読み取り専用" 状態であるため、メニューやツール
バーの変更に CommandBars オブジェクト モデルを使用できません。ただし、Excecute メソッドを使用して組み込みの Outlook
コマンドをプログラム上で実行できます。Outlook 97 で追加のツール バー ボタンやメニュー コマンドを作成する唯一の方法は、C または C++ で
Microsoft Exchange クライアント拡張機能を作成することです。
- Microsoft Outlook 98 では、CommandBars オブジェクト
モデルへの変更をプログラム上で行わないことをお勧めします。ツール バーとメニューは Outlook ユーザー
インターフェイスでユーザー設定でき、ユーザー設定情報は、Outcmd.dat と呼ばれるファイルに保存されます。ただし、CommandBars オブジェクト
モデルは Outlook オブジェクト モデルに公開されており、プログラムを使用して新しいツール バー ボタンやメニュー
コマンドを追加できますが、この機能は実際の作業用に設計またはテストされませんでした。このため、Outlook 98 で CommandBars オブジェクト
モデルを使用すると問題が発生することがあります。Outlook 98 は Microsoft Visual Basic for Applications
(VBA) もアプリケーション レベルのコードもサポートしません。そのため、アプリケーション
レベルのウィンドウまたはエクスプローラにユーザー設定コマンドをプログラムを使用して追加する場合、ボタンにユーザー設定コードを添付する方法がありません。プログラムを使用してユーザー設定ボタンをアイテム
レベルのウィンドウまたはインスペクタに追加する場合、ユーザー設定の Microsoft Visual Basic Scripting Edition
(VBScript)
スクリプトを実行するボタンをフォーム内に追加できます。しかし、他の種類のアイテム上にボタンが表示されるという問題が発生し、新しいアイテムと既存のアイテムを開く動作が異なる場合があります。
- Outlook 2000 は、プログラム上でユーザー設定できるツール
バーとメニューをサポートするように設計されている Outlook の最初のバージョンです。Outlook 2000 では、VBA と COM
(Component Object Model) アドインのサポートが同時に追加されています。
CommandBars および Outlook オブジェクト モデル
他の Office アプリケーションのオブジェクト モデルでは、アプリケーション レベルの CommandBars を 1
セットのみサポートするため、CommandBars コレクションはアプリケーション オブジェクトの外にあります。ただし、Outlook オブジェクト モデルは
Outlook がサポートする 2 セットの CommandBars (インスペクタとエクスプローラ) をサポートするように設計されています。
Outlook オブジェクト モデルでは、CommandBars コレクションが Outlook アプリケーション
オブジェクトの外ではなく、エクスプローラ オブジェクトとインスペクト オブジェクトの外にあります。プログラムを使用して CommandBars
への変更を行う方法を例示するためのコード例は多数あります。ただし、それらの例の大部分は他の Office アプリケーション用に設計されています。Outlook
でそれらの例を使用するには、コードを適切に変更して、Outlook オブジェクト モデルの相違点を反映する必要があります。
ユーザー設定フォームのソリューション
VBScript を使用するユーザー設定フォーム ソリューションでは、通常は次のようなコードを使用してフォーム レベルの
CommandBars にアクセスします。
Set objCBs = Item.GetInspector.CommandBars
Outlook コマンドを実行する VBScript サンプル
連絡先フォーム上のコマンド ボタン コントロールで次のサンプル
コードを使用することにより、連絡先の新しいレターを簡単に作成できます。
Sub CommandButton1_Click()
Set MyCB = Item.GetInspector.CommandBars.Item("Menu Bar")
Set MyMenu = MyCB.Controls("Actions")
Set MyMenuItem = MyMenu.Controls("New Letter to Contact")
MyMenuItem.Execute()
End Sub
FindControl メソッドを使用する VBScript サンプル
Outlook が各コマンドに割り当てている内部の値を知っている場合、FindControl メソッドを使用して Outlook
コマンド (または CommandBars オブジェクト モデルに関連するコントロール) を参照できます。内部 ID を使用すると、CommandBar
コマンドの実行時に、より正確な構文を使用でき、メニューやツール バーに表示されていないコマンドにアクセスできます。
たとえば、ユーザー設定のコマンド ボタンを使用してフォームを印刷するユーザー設定 Outlook フォームを例にとります。コマンド ボタンが cmdPrint
という名前であると仮定すると、以下の 2 つの VBScript コード例のいずれかを使用することにより [印刷] ダイアログ ボックスを表示します。
Sub cmdPrint_Click()
Item.GetInspector.CommandBars.FindControl(,4).Execute
End Sub
Sub cmdPrint_Click()
Item.GetInspector.CommandBars.Item("Menu Bar").Controls("File") _
.Controls("Print...").Execute
End Sub
Outlook CommandBar コントロール ID の一覧を生成する方法の例については、この資料の「
Excel ユーティリティを使用して Outlook CommandBar ID
の一覧を生成する」で Excel の例を参照してください。
アプリケーション レベルのソリューション
Outlook VBA や COM アドインなど、アプリケーション
レベルのソリューションの場合、通常次のようなコードを使用してアプリケーション レベルの CommandBars にアクセスします。
Set objCBs = Application.ActiveExplorer.CommandBars
Visual Basic for Applications
Outlook VBA
は、個人用開発ツールとして設計されています。このような種類のソリューションを展開するように設計されていません。そのため、通常は Outlook VBA
からプログラムを使用して CommandBar をユーザー設定を行わず、代わりに、以下のようにユーザー設定の CommandBar ボタンを手動で作成します。
- [ツール] メニューの [ユーザー設定] をクリックします。
- [コマンド] タブをクリックし、[分類] の一覧で [マクロ] をクリックします。
- マクロをメニューまたはツール バーにドラッグします。
- ツール バーまたはメニュー コマンドの外観を変更するには、[ユーザー設定] ウィンドウで [選択したボタンの編集]
をクリックし、ユーザー設定のツール バーまたはメニュー コマンドを変更します。
- [閉じる] をクリックします。
CommandBar コントロールを追加する VBA サンプル
CommandBar コントロールを追加するには、次の手順を実行します。
- サンプルのユーザー設定 Outlook 投稿フォームを作成し、それを受信トレイに発行します。そのフォームに
TestFormPost という名前を付けます。
- [ツール] メニューの [マクロ] をポイントし、[Visual Basic Editor] をクリックします。
- [プロジェクト - Project1] の下の [Project1]、[Microsoft Outlook
Objects] を順に展開し、[ThisOutlookSession]
をダブルクリックします。
- コード ウィンドウで、以下のコードを入力します。
Dim WithEvents myControl As CommandBarButton
Private Sub Application_Startup()
Dim oExp As Outlook.Explorer
Dim oBar As Office.CommandBar
Set oExp = Outlook.ActiveExplorer
Set oBar = oExp.CommandBars.Item("Standard")
' See if button already exists based on Tag value
Set myControl = oBar.FindControl(, , "OpenForm")
' If not found then create button
If myControl Is Nothing Then
Set myControl = oBar.Controls.Add(, , , 2, True)
With myControl
.Caption = "Open Form"
.FaceId = 59
.Style = msoButtonIconAndCaption
.Tag = "OpenForm"
.Visible = True
End With
End If
End Sub
Private Sub myControl_Click(ByVal Ctrl As _
Office.CommandBarButton, CancelDefault As Boolean)
Dim myFolder As MAPIFolder
Set myFolder = Session.GetDefaultFolder(olFolderInbox)
Set MyItem = myFolder.Items.Add("IPM.Post.TestForm")
MyItem.Display
Set MyItem = Nothing
Set myFolder = Nothing
End Sub
- Visual Basic Editor を閉じます。
- Outlook を閉じます。VBA プロジェクトへの変更を保存するかどうかを確認するダイアログ
ボックスが表示されたら、[はい] をクリックします。
- Outlook を起動します。
CommandBar コントロールを追加するための COM アドイン サンプル
COM アドインを作成することによってアプリケーション レベルのコードを Outlook
ユーザーに配布する方法がサポートされています。以下の COM アドイン コード サンプルは、新しいボタンを標準の Outlook CommandBar
の最初の場所に追加する方法を例示しています (COM アドインがまだ読み込まれていない場合は、ボタンの OnAction プロパティを設定して COM
アドインを読み込むこともできます)。
Dim OL As Outlook.Application
Dim WithEvents objButton As Office.CommandBarButton
Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
Dim objBar As Office.CommandBar
Set OL = Application
Set objBar = OL.ActiveExplorer.CommandBars.Item("Standard")
Set objButton = objBar.Controls.Add(, , , 1, True)
With objButton
.FaceId = 59
.Caption = "My Button"
.Style = msoButtonIconAndCaption
' The OnAction property is optional but recommended.
' It should be set to the ProgID of the add-in, such that if
' the add-in is not loaded when a user presses the button,
' Outlook loads the add-in automatically and then raises
' the Click event for the add-in to handle.
.OnAction = "!<" & AddInInst.ProgId & ">"
End With
End Sub
Private Sub objButton_Click(ByVal Ctrl As Office.CommandBarButton, _
CancelDefault As Boolean)
MsgBox "Hello World"
End Sub
Outlook で使用する COM
アドインの作成方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
230225?
(http://support.microsoft.com/kb/230225/EN-US/
)
OL2000: How to Create a COM Add-in for Outlook
230225
?
(http://support.microsoft.com/kb/230225/JA/
)
[OL2000] Outlook の COM アドインを作成する方法
Excel ユーティリティを使用して Outlook CommandBar ID の一覧を生成する
以下のような Microsoft Excel VBA サンプル コードを使用して、Outlook
コマンドとそれらのコマンドに対応する CommandBar コントロール ID の一覧を含むスプレッドシートを生成できます。このコードを実行することにより
Excel AutoFilter がスプレッドシートに追加され、検索中の ID を簡単に検出できるようになります。
このユーティリティを設定するには、次の手順を実行します。
- Excel を起動します。新しい Excel ブックが表示されていることを確認します。
- [ツール] メニューの [マクロ] をポイントし、[Visual Basic Editor] をクリックします。
- エディタのプロジェクト エクスプローラ ウィンドウで、[ThisWorkbook] をダブルクリックして、コード
ウィンドウを開きます。
- コード ウィンドウで、以下のコードを入力します。
Option Explicit
Dim oOutApp As Outlook.Application
Dim I As Long
Dim iRowCount As Long
Dim oItm As Object ' so it'll handle varying item types
Dim oSheet As Excel.Worksheet
Dim oNS As Outlook.NameSpace
Dim oFld As Outlook.MAPIFolder
Sub GetOutlookCommandBarIDs()
If MsgBox("This will clear the current worksheet, OK to continue?", vbOKCancel) = 1 Then
Cells.Select
Selection.ClearContents
iRowCount = 0
Set oSheet = ActiveSheet
Set oOutApp = New Outlook.Application
Set oNS = oOutApp.Session
Set oItm = oOutApp.CreateItem(olMailItem)
GetInspectorIDs oItm, "Mail Message"
Set oItm = oOutApp.CreateItem(olPostItem)
GetInspectorIDs oItm, "Post"
Set oItm = oOutApp.CreateItem(olContactItem)
GetInspectorIDs oItm, "Contact"
Set oItm = oOutApp.CreateItem(olDistributionListItem)
GetInspectorIDs oItm, "Distribution List"
Set oItm = oOutApp.CreateItem(olAppointmentItem)
GetInspectorIDs oItm, "Appointment"
Set oItm = oOutApp.CreateItem(olTaskItem)
GetInspectorIDs oItm, "Task"
Set oItm = oOutApp.CreateItem(olJournalItem)
GetInspectorIDs oItm, "Journal Entry"
Set oFld = oNS.GetDefaultFolder(olFolderInbox)
GetExplorerIDs oFld, "Mail Folder"
Set oFld = oNS.GetDefaultFolder(olFolderContacts)
GetExplorerIDs oFld, "Contact Folder"
Set oFld = oNS.GetDefaultFolder(olFolderCalendar)
GetExplorerIDs oFld, "Calendar Folder"
Set oFld = oNS.GetDefaultFolder(olFolderTasks)
GetExplorerIDs oFld, "Task Folder"
Set oFld = oNS.GetDefaultFolder(olFolderJournal)
GetExplorerIDs oFld, "Journal Folder"
Set oFld = oNS.GetDefaultFolder(olFolderNotes)
GetExplorerIDs oFld, "Notes Folder"
Selection.AutoFilter
Cells.Select
Cells.EntireColumn.AutoFit
Range("A1").Select
MsgBox "The spreadsheet is complete."
End If
End Sub
Sub GetInspectorIDs(oItm, sType As String)
Dim oCBs As Office.CommandBars
Dim oCtl As Office.CommandBarControl
Set oCBs = oItm.GetInspector.CommandBars
For I = 1 To 35000
Set oCtl = oCBs.FindControl(, I)
If Not (oCtl Is Nothing) Then
iRowCount = iRowCount + 1
oSheet.Cells(iRowCount, 1) = "Inspector"
oSheet.Cells(iRowCount, 2) = sType
oSheet.Cells(iRowCount, 3) = oCtl.Parent.Name
oSheet.Cells(iRowCount, 4) = oCtl.Caption
oSheet.Cells(iRowCount, 5) = CStr(I)
End If
Next
End Sub
Sub GetExplorerIDs(oFld As Outlook.MAPIFolder, sType As String)
Dim oCBs As Office.CommandBars
Dim sFilter As String
Dim oCtl As Office.CommandBarControl
Set oCBs = oFld.GetExplorer.CommandBars
For I = 1 To 35000
Set oCtl = oCBs.FindControl(, I)
If Not (oCtl Is Nothing) Then
iRowCount = iRowCount + 1
oSheet.Cells(iRowCount, 1) = "Explorer"
oSheet.Cells(iRowCount, 2) = sType
oSheet.Cells(iRowCount, 3) = oCtl.Parent.Name
oSheet.Cells(iRowCount, 4) = oCtl.Caption
oSheet.Cells(iRowCount, 5) = CStr(I)
End If
Next
End Sub
- [ツール] メニューの [参照設定] をクリックします。参照可能なライブラリ ファイルの一覧で、[Microsoft
Outlook 10.0 Object Library] をオンにし、[OK] をクリックします。
- Visual Basic Editor を閉じます。
- Excel ブックを保存して、後で使用できるようにします。
ID の一覧を生成するには、次の手順を実行します。
- Excel のセキュリティ設定がマクロの実行を許可していることを確認します。[ツール] メニューの
[マクロ] をポイントして
[セキュリティ] をクリックします。設定が [中] または [低] になっていることを確認します。そのように設定されていない場合は、少なくとも一時的に [中]
または [低] に設定します。[高] から設定を変更する場合、Excel を再起動する必要があります。
- Excel ユーティリティを設定するときに作成したブックを開きます。
- [ツール] メニューの [マクロ] をポイントし、[マクロ]
をクリックします。[GetOutlookCommandBarIDs] マクロをクリックし、[実行] をクリックします。
-
スプレッドシートが生成されるまで待機します。この処理には、少なくとも数分かかります。マクロが実行を完了した後で、"The spreadsheet is
complete." というメッセージが表示されます。
- スプレッドシートの生成後にブックを保存し、マクロを再実行する必要がないようにします。
スプレッドシートを使用するには、最上部でオート フィルタ機能を使用して検索中の CommandBar ID
を検出します。たとえば、セル A1 では、エクスプローラ オブジェクトまたはインスペクタ オブジェクトでコマンドを選択できます。セル B1
では、コマンドを含むアイテムまたはフォルダの種類を選択できます。
Microsoft Outlook
のソリューションに関する利用可能なリソース、および一般的な質問に対する回答を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge
Base) をクリックしてください。
146636?
(http://support.microsoft.com/kb/146636/EN-US/
)
OL2000: Questions About Custom Forms and Outlook Solutions
287530?
(http://support.microsoft.com/kb/287530/EN-US/
)
OL2002: Questions About Custom Forms and Outlook Solutions
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の
Article ID
201095?
(http://support.microsoft.com/kb/201095/EN-US/
)
(最終更新日 2002-05-13) を基に作成したものです。
この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。