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

文書翻訳 文書翻訳
文書番号: 238228 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

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 サイトを参照してください。
http://msdn.microsoft.com/ie/
: この資料で説明した手順または同様の手順を使用して Visual Basic COM アドインから Office Word にメニュー アイテムを追加しても、そのメニュー アイテムは期待どおりに動作しません。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
313948 [WD2002] Word で COM オブジェクトのメニュー アイテム (CommandBarControl) への参照が失われる

プロパティ

文書番号: 238228 - 最終更新日: 2005年11月21日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com