現在オフラインです。再接続するためにインターネットの接続を待っています

Visual Basic で Office 2000 COM アドインを作成する方法

概要
Microsoft Office 2000 以降では、Office アプリケーションの拡張や制御に使用するアプリケーション アドインを作成するための、統一された新しいデザイン アーキテクチャがサポートされています。このようなアドインは COM アドインと呼ばれます。この資料では、Visual Basic を使用して COM アドインを作成する方法について説明します。
詳細
COM アドインは、IDTExtensibility2 インターフェイスを実装するインプロセス COM サーバー (ActiveX DLL) です。IDTExtensibility2 インターフェイスは、Microsoft アドイン デザイナ タイプ ライブラリ (Msaddndr.dll) に記述されています。すべての COM アドインは、このインターフェイスを継承します。アドインには、このインターフェイスの 5 つのメソッドをそれぞれ実装する必要があります。

OnConnection

OnConnection イベントは、COM アドインの接続中常に発生します。アドインの接続は、起動時に行われるか、エンド ユーザーによって行われるか、またはオートメーションを介して行われます。OnConnection が正常に実行された場合、アドインは読み込まれたと見なされます。エラーが返された場合、ホスト アプリケーションはすぐにアドインへの参照を解放し、オブジェクトは破棄されます。

OnConnection には、次の 4 つのパラメータが渡されます。
  • Application - ホスト アプリケーション オブジェクトへの参照
  • ConnectMode - アドインの接続方法を示す以下の定数
    • ext_cm_AfterStartup - エンド ユーザーによって [COM アドイン] ダイアログ ボックスからアドインが起動された場合
    • ext_cm_CommandLine - コマンド ラインからアドインが接続された場合 (これは Office アプリケーションの COM アドインの作成では使用しません)
    • ext_cm_External - 外部アプリケーションによってオートメーションを介してアドインが接続された場合 (これは Office アプリケーションの COM アドインの作成では使用しません)
    • ext_cm_Startup - アドインが、アプリケーションの起動時にホストによって読み込まれた場合 (この動作はレジストリの設定によって制御されます)
  • AddInInst - ホスト アプリケーションの COMAddIns コレクション内にある、このアドインを参照する COMAddIn オブジェクトへの参照
  • Custom - ユーザー定義のデータを保持する Variant 型の配列

OnDisconnection

OnDisconnection イベントは、COM アドインの接続が切断され、メモリからアンロードされる直前に発生します。アドインは、このイベントに応答してリソースのクリーンアップを実行し、ホスト アプリケーションに加えられた変更を復元する必要があります。

OnDisconnection には、次の 2 つのパラメータが渡されます。
  • RemoveMode - アドインの接続の切断方法を示す以下の定数
    • ext_dm_HostShutdown - ホスト アプリケーションの終了時にアドインが切断された場合
    • ext_dm_UserClosed - エンド ユーザーまたはオートメーション コントローラによってアドインが切断された場合
  • Custom - ユーザー定義のデータを保持する Variant 型の配列

OnAddInsUpdate

OnAddInsUpdate イベントは、登録済みの COM アドインのセットが変更されたときに発生します。つまり、COM アドインがホスト アプリケーションにインストールされたり、ホスト アプリケーションから削除されたりするたびに、このイベントが発生します。

OnStartupComplete および OnBeginShutdown

ホスト アプリケーションがメモリにロードまたはアンロードされるとビジー状態になります。このため、OnStartupComplete および OnBeginShutdown メソッドは、ユーザーの操作を無効にする必要のある、ホスト アプリケーションがビジー状態からの復帰完了後またはビジー状態への移行直前に発生します。OnStartupComplete は、アドインへの接続が起動時に行われた場合にのみ呼び出されます。OnBeginShutdown は、アドインへの接続の切断がホストの終了時に行われる場合にのみ呼び出されます。

これらのイベントの発生時には、ホスト アプリケーションのユーザー インターフェイスは完全に機能しています。アクションによっては OnConnection や OnDisconnection からは利用できないことがあり、これらのイベントで実行する以外に方法がない場合があります。

COM アドインの登録

COM アドインでは、通常の COM の登録手順に加え、対象となる各 Office アプリケーションにアドイン自身を登録する必要があります。特定のアプリケーションにアドインを登録するには、次の場所にサブキーを作成する必要があります。このとき、アドインの ProgID をキーの名前として使用します。
HKEY_CURRENT_USER\Software\Microsoft\Office\<OfficeApp>\Addins\<ProgID>
このキーに値を追加して、アドインのわかりやすい表示名と詳しい説明を設定できます。また、"LoadBehavior" という DWORD 値を使用して、アドインのロード方法を指定する必要があります。この値はホスト アプリケーションによるアドインのロード方法を決定するもので、次の値の組み合わせです。
  • 0 = Disconnect - ロードしません。
  • 1 = Connected - ロードします。
  • 2 = Bootload - アプリケーションの起動時にロードします。
  • 8 = DemandLoad - ユーザーの要求があったときにだけロードします。
  • 16 = ConnectFirstTime - 1 回だけ (次回の起動時に) ロードします。
通常は 0x03 (Connected | Bootload) を指定します。

また、IDTExtensibility2 を実装するアドインでは、ユーザー インターフェイスをサポートしない操作に対応しているかどうかを示すために、"CommandLineSafe" という DWORD 値を指定する必要もあります。値が 0x00 の場合は False、0x01 の場合は True を表します。

COM アドインの作成

以下に示す 3 つのいずれかの方法で COM アドインを作成できます。

COM アドイン テンプレートを使用して COM アドインを作成する

Microsoft Office 2000 Developer または Microsoft Office XP Developer、および Visual Basic 6.0 を所有している場合、COM アドインを作成する最も簡単な方法は、COM Add-in.vbp テンプレートを使用することです。このプロジェクトは、Office 2000 Developer CD の ODETools\V9\Samples\OPG\Samples\CH11\VB_COM_AddIn サブフォルダにあります。このフォルダにあるファイルを Visual Basic 6.0 Template\Projects フォルダにコピーします。このフォルダは、通常、C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects にあります。テンプレート プロジェクトをこの場所にコピーすると、Visual Basic 6.0 の [新しいプロジェクト] ダイアログ ボックスにそのテンプレートが表示されるようになります。このテンプレートと COM アドインの作成方法の詳細については、『Microsoft Office 2000 / Visual Basic プログラマーズガイド』の第 11 章を参照してください。

Visual Basic 6 のアドイン デザイナを使用して COM アドインを作成する

Microsoft Visual Basic 6.0 をインストールした直後、IDTExtensibility2 を直接実装せずに実行するためにラッパーを使用する場合は、VB6 アドインの作成に使用するアドイン デザイナと同じものを使用できます。Microsoft Excel 2000 または 2002 のアドインを作成するには、以下の手順を実行します。
  1. Microsoft Visual Basic 6.0 を起動し、プロジェクトの種類として [アドイン] を選択します。これで、デザイナ クラスがデザイナ (Connect) とフォーム (frmAddin) に追加されます。
  2. Connect の [デザイナ] ウィンドウを開き、[アプリケーション] ボックスの一覧の [Microsoft Excel] をクリックします。
  3. [既定のロード方法] ボックスの一覧の [Startup] をクリックします。
  4. プロジェクトから [frmAddin] を削除します。
  5. [プロジェクト] ウィンドウで、[Connect] アイテムを右クリックし、[コードの表示] をクリックします。
  6. デザイナのコード ウィンドウ内のすべてのコードを削除します。このコードは、VB アドインでは機能しますが、Office アドインでは機能しません。
  7. デザイナに以下のコードを追加します。
       Option Explicit   Dim oXL As Object   Dim WithEvents MyButton As Office.CommandBarButton   Private Sub AddinInstance_OnConnection(ByVal Application As Object, _    ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _    ByVal AddInInst As Object, custom() As Variant)      On Error Resume Next      MsgBox "My Addin started in " & Application.Name         Set oXL = Application         Set MyButton = oXL.CommandBars("Standard").Controls.Add(1)         With MyButton            .Caption = "My Custom Button"            .Style = msoButtonCaption          ' The following items are optional, but recommended.           ' The Tag property lets you quickly find the control           ' and helps MSO keep track of it when there is more than          ' one application window visible. The property is required          ' by some Office applications and should be provided.            .Tag = "My Custom Button"           ' 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,          ' MSO loads the add-in automatically and then raises          ' the Click event for the add-in to handle.             .OnAction = "!<" & AddInInst.ProgId & ">"            .Visible = True         End With      End Sub   Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As _      AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)      On Error Resume Next      MsgBox "My Addin was disconnected by " & _         IIf(RemoveMode = ext_dm_HostShutdown, _         "Excel shutdown.", "end user.")            MyButton.Delete      Set MyButton = Nothing      Set oXL = Nothing    End Sub   Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton, _     CancelDefault As Boolean)      MsgBox "Our CommandBar button was pressed!"   End Sub
  8. プロジェクトを保存し、MyAddin.dll を作成します。デザイナによりアドインが登録されます。
  9. Microsoft Excel を開くと、アドインのロード時とアンロード時にメッセージ ボックスが表示されます。[標準] ツール バーには、"My Custom Button" というラベルが付いた新しいボタンが表示されます。このボタンをクリックすると、アドインの処理が実行されます。

Implements を使用して COM アドインを作成する

簡単ではありませんが、Microsoft Visual Basic 5.0 と "Implements" キーワードを使用して、IDTExtensibility2 インターフェイスを直接実装することにより、COM アドインを作成することができます。このアプローチの唯一の欠点は登録です。Microsoft Visual Basic からは、Office でのアドインの登録に必要なキーの追加ができないため、別途この作業を行う必要があります (カスタム セットアップ ユーティリティまたは REG スクリプトを使用します)。

逆に、Implements を使用する利点は、デザイナを使用するより直接的で効率的なことです。使用するアプリケーションごとに別々の Connect オブジェクトを作成する代わりに、複数の Office アプリケーションで機能する 1 つの COM オブジェクトを作成することもできます。

以下に、Implements を使用してアドインを作成する手順を示します。
  1. Visual Basic を開き、新しい ActiveX DLL プロジェクトを作成します。プロジェクトに MyCOMAddin という名前を付け、パブリック クラスには Connect という名前を付けます。
  2. [参照設定] ダイアログ ボックス (プロジェクト | 参照設定) から、Microsoft Office 9.0 (Office XP の場合は、10.0) オブジェクト ライブラリと Microsoft アドイン デザイナ タイプ ライブラリへの参照を追加します。[参照設定] ボックスの一覧にアドイン デザイナが表示されない場合は、[参照] をクリックして Msaddndr.dll または Msaddndr.tlb を見つける必要があります。これらのファイルは、通常、"C:\Program Files\Common Files\Designer" フォルダにあります。
  3. Connect の [コード] ウィンドウに、以下のコードを追加します。
       Option Explicit   Implements IDTExtensibility2   Dim oHostApp As Object   Dim WithEvents MyButton As Office.CommandBarButton  Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _     ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _     ByVal AddInInst As Object, custom() As Variant)        On Error Resume Next    ' Set a reference to the host application...      Set oHostApp = Application       ' If you aren't in startup, then manually call OnStartupComplete...      If (ConnectMode <> ext_cm_Startup) Then _         Call IDTExtensibility2_OnStartupComplete(custom)         End Sub   Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)      Dim oCommandBars As Office.CommandBars      Dim oStandardBar As Office.CommandBar         On Error Resume Next    ' Set up a custom button on the "Standard" commandbar...      Set oCommandBars = oHostApp.CommandBars      If oCommandBars Is Nothing Then       ' Outlook has the CommandBars collection on the Explorer object         Set oCommandBars = oHostApp.ActiveExplorer.CommandBars      End If         Set oStandardBar = oCommandBars.Item("Standard")      If oStandardBar Is Nothing Then       ' Access names it's main toolbar Database         Set oStandardBar = oCommandBars.Item("Database")      End If       ' In case the button was not deleted, use the exiting one...      Set MyButton = oStandardBar.Controls.Item("My Custom Button")         If MyButton Is Nothing Then            Set MyButton = oStandardBar.Controls.Add(1)            With MyButton               .Caption = "My Custom Button"               .Style = msoButtonCaption           ' The following items are optional, but recommended.           ' The Tag property lets you quickly find the control           ' and helps MSO keep track of it when there is more than          ' one application window visible. The property is required          ' by some Office applications and should be provided.            .Tag = "My Custom Button"           ' 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,          ' MSO loads the add-in automatically and then raises          ' the Click event for the add-in to handle.                .OnAction = "!<MyCOMAddin.Connect>"               .Visible = True            End With         End If     ' Display a simple message to know which application you started in...      MsgBox "Started in " & oHostApp.Name & "."      Set oStandardBar = Nothing      Set oCommandBars = Nothing   End Sub   Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As _     AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)      On Error Resume Next      If RemoveMode <> ext_dm_HostShutdown Then _         Call IDTExtensibility2_OnBeginShutdown(custom)            Set oHostApp = Nothing   End Sub   Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)      On Error Resume Next    ' Notify the user you are shutting down, and delete the button...      MsgBox "Our custom Add-In is unloading."      MyButton.Delete      Set MyButton = Nothing   End Sub   Private Sub MyButton_Click(ByVal Ctrl As Office.CommandBarButton,    CancelDefault As Boolean)      MsgBox "Our CommandBar button was pressed!"   End Sub   Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)      'You do nothing if this is called, but you need to      'add a comment so Visual Basic properly implements the function...   End Sub
  4. プロジェクトを保存し、MyCOMAddin.dll を作成します。ただし、アドインが機能するには、アドインを、実行する各 Office アプリケーションに関連付ける必要があります。実際には、DLL のインストール時に、セットアップ ユーティリティがこの作業を行います。この例では、Visual Basic IDE から登録関数を直接呼び出しています。
  5. 新しいモジュールをプロジェクトに追加します。モジュール 1 のコードには、以下のコードを追加します。
       Option Explicit   Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _   Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _   ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As _   Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, _   phkResult As Long, lpdwDisposition As Long) As Long      Private Declare Function RegSetValueEx Lib "advapi32.dll" _   Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As _   String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, _   ByVal cbData As Long) As Long      Private Declare Function RegDeleteKey Lib "advapi32.dll" _   Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) _   As Long      Private Declare Function RegCloseKey Lib "advapi32.dll" _   (ByVal hKey As Long) As Long   Private Const HKEY_CURRENT_USER = &H80000001   Private Const KEY_ALL_ACCESS = &H1F0037   Private Const REG_CREATED_NEW_KEY = &H1   Private Const REG_SZ = 1   Private Const REG_DWORD = 4   'These are the settings for your Add-in...   Private Const PROGID As String = "MyCOMAddin.Connect"   Private Const DESCRIPTION As String = "My VB5/6 COM Add-In Sample"   Private Const LOADBEHAVIOR As Long = 3   Private Const SAFEFORCOMMANDLINE As Long = 0   Public Sub RegisterAll()      RegisterOfficeAddin "Access"      RegisterOfficeAddin "Excel"      RegisterOfficeAddin "FrontPage"      RegisterOfficeAddin "Outlook"      RegisterOfficeAddin "PowerPoint"      RegisterOfficeAddin "Word"   End Sub   Public Sub UnregisterAll()      UnRegisterOfficeAddin "Access"      UnRegisterOfficeAddin "Excel"      UnRegisterOfficeAddin "FrontPage"      UnRegisterOfficeAddin "Outlook"      UnRegisterOfficeAddin "PowerPoint"      UnRegisterOfficeAddin "Word"   End Sub   Public Sub RegisterOfficeAddin(sTargetApp As String)      Dim sRegKey As String      Dim nRet As Long, dwTmp As Long      Dim hKey As Long         sRegKey = "Software\Microsoft\Office\" & sTargetApp _         & "\Addins\" & PROGID         nRet = RegCreateKeyEx(HKEY_CURRENT_USER, sRegKey, 0, _         vbNullString, 0, KEY_ALL_ACCESS, 0, hKey, dwTmp)            If nRet = 0 Then         If dwTmp = REG_CREATED_NEW_KEY Then            Call RegSetValueEx(hKey, "FriendlyName", 0, _               REG_SZ, ByVal PROGID, Len(PROGID))            Call RegSetValueEx(hKey, "Description", 0, _               REG_SZ, ByVal DESCRIPTION, Len(DESCRIPTION))            Call RegSetValueEx(hKey, "LoadBehavior", 0, _               REG_DWORD, LOADBEHAVIOR, 4)            Call RegSetValueEx(hKey, "CommandLineSafe", 0, _               REG_DWORD, SAFEFORCOMMANDLINE, 4)         End If         Call RegCloseKey(hKey)      End If      End Sub   Public Sub UnRegisterOfficeAddin(sTargetApp As String)      Dim sRegKey As String      sRegKey = "Software\Microsoft\Office\" & sTargetApp _         & "\Addins\" & PROGID          Call RegDeleteKey(HKEY_CURRENT_USER, sRegKey)      End Sub
  6. イミディエイト ウィンドウ ([表示] メニューの [イミディエイト ウィンドウ] をクリックします) に RegisterAll と入力し、Enter キーを押します。これで、サポート対象のすべての Office アプリケーション (Access、Excel、FrontPage、Outlook、PowerPoint、および Word) にアドインが登録されます。
  7. 前述のいずれかの Office アプリケーションを開きます。起動時とシャットダウン時のメッセージ ボックスが表示され、[標準] ツール バーにカスタム ボタンが追加されます。
  8. アドインの登録を解除するには、Visual Basic のイミディエイト ウィンドウに UnregisterAll と入力し、Enter キーを押します。
関連情報
『Microsoft Office 2000/Visual Basic プログラマーズガイド』の「第 11 章 アドイン、テンプレート、ウィザードおよびライブラリ」を参照してください。

COM アドイン作成の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
230689 [SAMPLE] Visual C++ で作成した Office 2000 COM アドインのサンプル Comaddin.exe
190253 VB5 で VB6 デザイナが機能しない
Microsoft Internet Explorer 用の Web ベース ソリューションの開発の詳細については、以下のマイクロソフト Web サイトを参照してください。 : この資料で説明した手順または同様の手順を使用して Visual Basic COM アドインから Office Word にメニュー アイテムを追加しても、そのメニュー アイテムは期待どおりに動作しません。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
313948 [WD2002] Word で COM オブジェクトのメニュー アイテム (CommandBarControl) への参照が失われる
addin
プロパティ

文書番号:238228 - 最終更新日: 11/21/2005 08:12:01 - リビジョン: 6.1

  • Microsoft Excel 2000 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft FrontPage 2002 Standard Edition
  • Microsoft FrontPage 2000 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Outlook 2000 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • kbautomation kbhowto KB238228
フィードバック