[方法] VBA を使用してリボンに独自のコマンドを追加する

適用対象: Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010

ここでは、Microsoft Project 2010 で VBA を使用して、Fluent ユーザー インターフェイス (リボン) に独自のタブとコマンドをプログラムによって追加する方法を説明します。この独自のボタンをクリックすると、プロジェクト内でマクロが呼び出され、手動でスケジュールを設定したタスクの [タスク名] セルの色が切り替わります。VBA コードは、特定のプロジェクトに使用したり、ローカル コンピューター上で作成するまたは開くすべてのプロジェクトに対するリボンを変更するようにグローバル プロジェクト テンプレートに追加したりできます。

Project 2010 では、他の Microsoft Office 2010 アプリケーションと同様に、リボンのある Fluent ユーザー インターフェイスが使用されます。[Project のオプション] ダイアログ ボックスの [リボンのユーザー設定] タブを使用して、タブ、グループ、またはボタンを手動でリボンに追加できます。[Project のオプション] ダイアログ ボックスを開くには、Backstage ビューで [オプション] をクリックします。

Project 2010 のファイルはバイナリ形式なので、リボンをプログラムによって変更するには、VBA の SetCustomUI メソッドを使用する必要があります。また、Project 2010 用のマネージ コード アドインの開発には、プライマリ相互運用機能アセンブリ (PIA) のオブジェクト モデルを使用できます。PIA のパスは、C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.MSProject.dll です。

ヒント

PIA の SetCustomUI メソッドを使用してマネージ コード アドインを開発することもできますが、Project 2010 では Microsoft Visual Studio 2010 のリボン デザイナーもサポートされているので、このデザイナーを使用して独自のタブ、グループ、またはその他のリボン コントロールを作成する方が簡単です。この記事の VBA マクロと同じジョブを実行する例については、「[方法] マネージ コードを使用してカスタム コマンドをリボンに追加する」を参照してください。

SetCustomUI メソッドの詳細については、Project 2010 で VBA ヘルプを参照してください。リボンを変更する XML コマンドの詳細については、「Office Fluent ユーザー インターフェイス デベロッパー ポータル」を参照してください。

手順 1. テスト用のプロジェクトとマクロを作成するには

  1. 独自のリボンをテストするためのプロジェクトを作成します。たとえば、"Toggle Cell Color for Manual Tasks" という名前のプロジェクトを作成します。

  2. Visual Basic Editor (VBE) を開き、[プロジェクト] ウィンドウの [VBAProject] ノードを展開してから [ThisProject] をダブルクリックしてコード ページを開きます。

  3. テストに使用するマクロを作成します。この例では、ToggleManualTasksColor という名前のマクロを使用しますが、別の名前でもかまいません。

        Option Explicit
    
        Sub ToggleManualTasksColor()
            Dim tsks As Tasks
            Dim t As Task
            Dim rgbColor As Long
    
            Set tsks = ActiveProject.Tasks
    
            For Each t In tsks
                If (Not t Is Nothing) And (Not t.Summary) Then
                    SelectTaskField Row:=t.ID, Column:="Name", rowrelative:=False
                    rgbColor = ActiveCell.CellColorEx
    
                    If t.Manual Then
                        ' Check whether the manual task color is white.
                        If rgbColor = &HFFFFFF Then
                            Font32Ex CellColor:=&HF0D9C6  ' Change the background to light blue.
                        Else
                            Font32Ex CellColor:=&HFFFFFF  ' Change the background to white.
                        End If
                    Else
                        ' The task is automatically scheduled, so change the background to white.
                        Font32Ex CellColor:=&HFFFFFF
                    End If
                End If
            Next t
        End Sub
    

    ToggleManualTasksColor マクロでは、FontEx メソッドではなく Project 2010 の新しい Font32Ex メソッドを使用するので、色を 16 進数の RGB 値で表現できます。

    注意

    Project 2010 では、16 進数の色は B-G-R の順序で表現します。たとえば、&HFF0000 は純粋な青です。値を 10 進数で表現することもできますが (たとえば 16 進数のライトブルーの値 &HF0D9C6 は 10 進数で 15784390)、16 進数値を使用する方が色を確認するのが簡単です。

  4. 自動的にスケジュールを設定したタスクと手動でスケジュールを設定したタスクをいくつかプロジェクトに追加して、マクロを実行し、機能することを確認します。

手順 2. では、このマクロを実行するためにリボンを変更します。

手順 2. リボンを変更するマクロを作成するには

  1. SetCustomUI メソッドの ribbonXml 引数に使用する XML データを作成します。複雑なリボン変更を行う XML を正しく作成するには、XML エディターを使用すると便利です。たとえば、以下の XML の作成には Microsoft Visual Studio を使用しました。

    <mso:customUI xmlns:mso="http:="//schemas.microsoft.com/office/2009/07/customui">
      <mso:ribbon>
        <mso:qat/>
        <mso:tabs>
          <mso:tab id="highlightTab" label="Highlight=" insertBeforeQ="mso:TabFormat">
            <mso:group id="testGroup" label="Test" autoScale="true=">
              <mso:button id="highlightManualTasks" label="Toggle Manual Task Color"
                          imageMso="DiagramTargetInsertClassic=" onAction="ToggleManualTasksColor="/>
            </mso:group>
          </mso:tab>
        </mso:tabs>
      </mso:ribbon>
    </mso:customUI>
    

    Project 2010 のリボンに適用すると、この XML データは以下の操作を行います。

    • mso:qat 要素は空なので、クイック アクセス ツール バーは変更されません。

    • mso:tab 要素は、[Highlight] という名前でタブを作成し、それをリボンの [Format] タブに挿入します。id 属性は任意の一意の英数字であり、空白を含むことはできません。id 属性は、特定のタブを参照する他のアクションで使用できます。

    • mso:group 要素は、[Test] という名前でグループを [Highlight] タブに作成します。

    • mso:button 要素は、Microsoft Office のアイコン コレクションにある DiagramTargetInsertClassic という名前のイメージを使用する、[Toggle Manual Task Color] ボタンを作成します。このボタンをクリックすると、OnAction 属性で指定した ToggleManualTasksColor マクロが実行されます。

      ヒント

      イメージを使用するには、以下のいずれかの方法を使用できます。

      • [Project のオプション] ダイアログ ボックスの [リボンのユーザー設定] タブで、リボン上の既存のグループの 1 つにコマンドを追加し、そのコマンドの名前を変更します。次に、アイコンを設定し、このカスタマイズを ProjectCustomizations.exportedUI という名前のファイルにエクスポートします。XML 構造をわかりやすく表示するには、ファイルの内容を Visual Studio 内で XML ファイルにコピーし、ファイル全体に書式を設定します (Ctrl+E キーを押してから、D キーを押します)。イメージ名は、追加したコマンドの imageMso 属性の値です。

      • 2007 Office System Add-In: Icons Gallery (英語) をダウンロードし、このギャラリーを Microsoft Excel で開きます。

      • Microsoft Office 2010 アプリケーションで使用できるアイコンおよびアイコン名を確認するには、Office 2010 Add-In: Icons Gallery (英語) をダウンロードしてください。

      • アイコンを作成し、そのファイル名とパスを使用します。

  2. SetCustomUI メソッドを実行するマクロを作成します。以下の AddHighlightRibbon マクロでは、各 XML 行を ribbonXml 変数の 1 行にコピーし、XML 行に含まれる引用符にもう 1 つの引用符を追加して、ribbonXml 文字列に引用符そのものが含まれるようにします。コードを読みやすくするために、XML の書式をできるだけ実用重視で維持します。

        Private Sub AddHighlightRibbon()
            Dim ribbonXml As String
    
            ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">"
            ribbonXml = ribbonXml + "  <mso:ribbon>"
            ribbonXml = ribbonXml + "    <mso:qat/>"
            ribbonXml = ribbonXml + "    <mso:tabs>"
            ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
            ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
            ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
            ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
            ribbonXml = ribbonXml + "        </mso:group>"
            ribbonXml = ribbonXml + "      </mso:tab>"
            ribbonXml = ribbonXml + "    </mso:tabs>"
            ribbonXml = ribbonXml + "  </mso:ribbon>"
            ribbonXml = ribbonXml + "</mso:customUI>"
    
            ActiveProject.SetCustomUI (ribbonXml)
        End Sub
    
  3. AddHighlightRibbon マクロを実行して、正しく動作するかどうかを確認します。

    ヒント

    リボンのカスタマイズを削除するには、パラメーターに空の mso:ribbon 要素を指定して SetCustomUI を実行する次のようなマクロを作成します。ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & "<mso:ribbon></mso:ribbon></mso:customUI>"

手順 3. では、このテスト用プロジェクトを開いたときに AddHighlightRibbon マクロを実行する方法について説明します。ローカル コンピューター上のすべてのプロジェクトに対してこのマクロを実行するには、手順 4. を参照してください。

手順 3. プロジェクトを開いたときにリボンを変更するには

  1. 以下のような Project_Open イベント ハンドラーを追加します。

        Private Sub Project_Open(ByVal pj As Project)
            AddHighlightRibbon
        End Sub
    
  2. テスト用プロジェクトを保存して閉じます。

  3. テスト用プロジェクトを再度開きます。

テスト用オブジェクトを開くと、Project_Open マクロによって AddHighlightRibbon マクロが実行されます。このマクロが [Highlight] タブをリボンに追加します。[Highlight] タブの [Toggle Manual Task Color] をクリックすると、手動でスケジュールを設定したタスクの背景色が変更されます (図 1)。

図 1. 独自のリボン コマンドを使用する

カスタム リボン コマンドの使用

手順 3. で、[Highlight] タブが追加されるのは、マクロ コードを含む特定のテスト用プロジェクトを開いたときのみです。手順 4. では、ローカル コンピューター上で作成するまたは開くすべてのプロジェクトに対するリボンを変更するようにグローバル プロジェクト テンプレートでマクロを使用する方法について説明します。

手順 4. すべてのローカル プロジェクトに対するリボンを変更するには

  1. VBE を開き、[プロジェクト] 作業ウィンドウで [ProjectGlobal] ノードを展開します。次に、[ThisProject (Global.MPT)] をダブルクリックして、グローバル プロジェクト テンプレートのコード ページを開きます。

  2. 例に示されているすべてのコードを [ThisProject (Global.MPT)] コード ページにコピーします。

  3. イベント ハンドラーを、以下のように Project_Open イベントから Project_Activate イベントに変更します。

        Private Sub Project_Activate(ByVal pj As MSProject.Project)
            AddHighlightRibbon
        End Sub
    
  4. 現在のプロジェクトを保存して、Project 2010 を終了します。

  5. Project 2010 を起動して、新しい空のプロジェクトを作成します。

新しいプロジェクトが作成されたとき、またはプロジェクトが開いたときに、Global.MPT 内の Project_Activate イベント ハンドラーによって、手順 3. のように AddHighlightRibbon マクロが実行されます。

テスト用プロジェクトに Project_Open イベント ハンドラーと関連マクロを残してある場合、そのテスト用プロジェクトを開くと、まず Project_Open イベント ハンドラーが実行され、その後で Global.MPT 内の Project_Activate イベント ハンドラーが実行されます。イベントの実行順序は、次の例のように、イベント ハンドラーにメッセージ ボックス ステートメントを追加することで簡単に把握できます。

    Private Sub Project_Open(ByVal pj As Project)
        If (Not pj Is Nothing) Then
            MsgBox "Opening project: " & pj.Name
        End If
        
        AddHighlightRibbon
    End Sub

イベント ハンドラーを特定のプロジェクトから Global.MPT にコピーする場合は、元のプロジェクトからそのイベント ハンドラーを削除することをお勧めします。

注意

イベント ハンドラーによって、SetCustomUI メソッドで別のリボン変更を行う 2 番目のマクロが呼び出されると、その 2 番目の呼び出しにより最初の呼び出しがオーバーライドされます。最初のリボン変更と 2 番目のリボン変更の両方を行うには、ribbonXml パラメーターの XML データを結合して 1 つの SetCustomUI 呼び出しにする必要があります。

以下のコードは、Project_Open イベント ハンドラーを使用している、このテスト用プロジェクトの完全な VBA コード例です。

    Option Explicit
    
    Sub ToggleManualTasksColor()
        Dim tsks As Tasks
        Dim t As Task
        Dim rgbColor As Long
        
        Set tsks = ActiveProject.Tasks
        
        For Each t In tsks
            If (Not t Is Nothing) And (Not t.Summary) Then
                SelectTaskField Row:=t.ID, Column:="Name", rowrelative:=False
                rgbColor = ActiveCell.CellColorEx
            
                If t.Manual Then
                    ' Check whether the manual task color is white.
                    If rgbColor = &HFFFFFF Then
                        Font32Ex CellColor:=&HF0D9C6  ' Change the background to light blue.
                    Else
                        Font32Ex CellColor:=&HFFFFFF  ' Change the background to white.
                    End If
                Else
                    ' The task is automatically scheduled, so change the background to white.
                    Font32Ex CellColor:=&HFFFFFF
                End If
            End If
        Next t
    End Sub
    
    Private Sub Project_Open(ByVal pj As Project)
        AddHighlightRibbon
    End Sub
    
    
    Private Sub AddHighlightRibbon()
        Dim ribbonXml As String
        
        ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">"
        ribbonXml = ribbonXml + "  <mso:ribbon>"
        ribbonXml = ribbonXml + "    <mso:qat/>"
        ribbonXml = ribbonXml + "    <mso:tabs>"
        ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
        ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
        ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
        ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
        ribbonXml = ribbonXml + "        </mso:group>"
        ribbonXml = ribbonXml + "      </mso:tab>"
        ribbonXml = ribbonXml + "    </mso:tabs>"
        ribbonXml = ribbonXml + "  </mso:ribbon>"
        ribbonXml = ribbonXml + "</mso:customUI>"
        
        ActiveProject.SetCustomUI (ribbonXml)
    End Sub

セキュリティ

マクロ セキュリティを設定するには、Backstage ビュー (リボンの [ファイル] タブ上) で [オプション] をクリックし、以下の操作を行います。

  1. [Project のオプション] ダイアログ ボックスの [セキュリティ センター] タブをクリックし、[セキュリティ センターの設定] をクリックします。

  2. [セキュリティ センター] ダイアログ ボックスの [マクロの設定] タブをクリックします。

  3. 署名されていないマクロをテストするために、[警告を表示してすべてのマクロを無効にする] をオンにし、[OK] をクリックし、さらに [OK] をクリックします。

署名されていないマクロを実行しようとすると、[Microsoft Project のセキュリティに関する通知] ダイアログ ボックスが表示されます。[マクロを有効にする] をクリックして、マクロをプロジェクトで実行します。

ヒント

マクロ プロジェクトにデジタル署名を追加すると、[Microsoft Project のセキュリティに関する通知] ダイアログ ボックスを表示せずにプロジェクトを開くことができます。「マクロ プロジェクトにデジタル署名を追加する」は、Project 2010 を含めて、VBA を使用するすべての Microsoft Office 2010 製品に適用されます。

関連項目

タスク

[方法] マネージ コードを使用してカスタム コマンドをリボンに追加する

参照

VBA オブジェクト モデルの変更点の一覧表

その他のリソース

Project.Open イベントを使用する

Office Fluent ユーザー インターフェイス デベロッパー ポータル

2007 Office System Add-In: Icons Gallery (英語)

Office 2010 Add-In: Icons Gallery (英語)

マクロ プロジェクトにデジタル署名を追加する