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

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

この記事では、Microsoft Visual Studio 2010 の Microsoft Office 開発ツール で開発されたマネージ コードのアドインを使用することで、カスタム タブやコマンドをプログラムによって Microsoft Project 2010 の Fluent ユーザー インターフェイス (リボン) に追加する方法を説明します。ここで紹介するカスタム ボタンは、このアドイン内のメソッドを呼び出して、手動でスケジュール設定されたタスクの [タスク名] セルの色を切り替えるものです。この記事では、Project 2010 のリボンを変更する簡単なソリューションにおいて Microsoft Visual Basic コードと Microsoft Visual C# コードを比較できます。

本記事の RibbonAddIn ソリューションは、「[方法] VBA を使用してリボンに独自のコマンドを追加する」で説明するマクロと同じ処理を実行します。その記事の Microsoft Visual Basic for Applications (VBA) コードは、本記事のアドイン コードと直接比較できます。Project 2010 のマネージ コード Microsoft.Office.Interop.MSProject ライブラリでは、オブジェクトやメンバーが VBA の MSProject ライブラリ内にあるものと重複しています。VBA マクロの代わりにマネージ コード アドインを使用するメリットは多数あり、その一部の説明は「[ウォークスルー] PWA 互換性を確認するマネージ コード アドインを作成する」の導入セクションにあります。以前のバージョンと比較したときの Visual Studio 2010 の大きな利点は、Visual C# の名前付きパラメーターやオプション パラメーターを Visual Basic の場合と同じように使用できることです。

Visual Studio のリボン デザイナーは、Project 2010 リボンを変更する場合に有利です。XML を使用せずに、一般的なリボン要素をツールボックスからデザイン ビューにドラッグできるからです。また、XML を使用してリボンを変更することもできます。XML の編集は、VBA で行うよりも Visual Studio で行ったほうがずっと容易です。詳細については、「リボンの概要」を参照してください。

アドインの展開は、ClickOnce を使用してインストール ファイルを中央リポジトリに保存することで、容易に行えます。アドインがリポジトリを参照して更新の有無をチェックする頻度は、開発者が指定できます。インストールもまた、自動的に必須コンポーネントの有無をチェックしてそれらをインストールすることができます。

手順 1. リボン用のアドイン プロジェクトを作成する

  1. Visual Studio 2010 を管理者として実行し、Project 2010 アドイン プロジェクトを作成します。プロジェクト名は、たとえば「RibbonAddIn」とします。図 1 に、Visual Basic テンプレートを利用したプロジェクトの作成例を示します。Visual C# を使用することもできます。

    図 1. Visual Basic テンプレートによる Project 2010 アドインの作成

    Visual Basic の Project 2010 アドインの作成

  2. [新しいプロジェクト] ダイアログ ボックスの上部にあるドロップダウン メニューで、[.NET Framework 3.5] を選択します。[ソリューションのディレクトリを作成] チェック ボックスをオフにし、[OK] をクリックします。

Visual Studio によって、RibbonAddIn プロジェクトが ThisAddIn.vb (または ThisAddIn.cs) ファイルを利用して作成されます。このファイルには、ThisAddIn_Startup イベント ハンドラーと ThisAddIn_Shutdown イベント ハンドラーが含まれています。アプリケーション レベルやドキュメント レベルのイベントに関与しない単純なリボンの場合、スタートアップ イベント ハンドラーとシャットダウン イベント ハンドラーの変更は不要です。手順 2. では、リボンのビジュアル デザイナー コンポーネントを追加する方法を示します。

手順 2. ビジュアル デザイナーを使用してリボンを変更する

  1. ソリューション エクスプローラーで、RibbonAddIn プロジェクトを右クリックし、新しい項目を追加します。[新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアルなデザイナー)] をクリックします。このクラスに、たとえば「ManualTaskColor」という名前を付けます。

  2. [ツールボックス] で、[Office リボン コントロール] タブを展開し、[タブ] コントロールをデザイン ビューの [ManualTaskColor] リボンにドラッグします。

    注意

    デザイン ビューの [TabAddIns (組み込み)] タブを使用している場合は、追加したリボン コントロールが Project 2010 リボンの [アドイン] タブに表示されます。

    既存のタブにグループまたはコントロールを追加するには、デザイン ビューで [TabAddIns (ビルトイン)] タブをクリックし、[ControlId] プロパティを展開し、[OfficeId] プロパティをタブ名に変更します。たとえば、[View] を使用するには、[OfficeId] プロパティを [TabView] に変更します。ビルトイン コントロール用のリボン コントロール ID のリストをダウンロードするには、「Office 2010 Help Files: Office Fluent User Interface Control Identifiers (英語)」を参照してください。

  3. デザイン ビューで [tab1] コントロールを選択し、[プロパティ] ウィンドウを開きます。このタブに、たとえば「tabHighlight」という名前を付けます。この名前は [ControlId] プロパティ名にもなります。[Label] プロパティの値を「Highlight」に変更します。

  4. [ツールボックス] から [グループ] コントロールをデザイン ビューの [Highlight] タブにドラッグします。[group1] コントロールの [プロパティ] ウィンドウで、たとえば、このグループの名前を「rGroupManualTask」に、[Label] プロパティを「Highlight」に変更します。

  5. [ツールボックス] から [トグル ボタン] コントロール (または [ボタン] コントロール) をデザイン ビューの [Highlight] グループにドラッグします。

  6. デザイン ビューで [toggleButton1] コントロールを選択し、以下のプロパティを変更します。

    1. [(名前)] プロパティを「tBtnManualTaskColor」に変更します。

    2. [オン] プロパティを True に変更します。アドインを実行すると、このトグル ボタンの状態がオンになります (つまり、このボタンがリボン内で強調表示されます)。

    3. [ラベル] プロパティを「Toggle Manual Task Color」に変更します。

    4. VBA サンプルの場合と同じイメージを表示するには、[OfficeImageId] プロパティに「DiagramTargetInsertClassic」と入力します。

図 2 に、[Highlight] タブ、[Highlight] グループ、および [Toggle Manual Task Color] ボタンが完成した状態のリボンのデザイン ビューを示します。

図 2. デザイン ビューを使用した Project 2010 リボンの変更

Visual Studio のリボン デザイン ビューの使用

[OfficeImageId] プロパティを指定すると、Visual Studio によってボタンの汎用アイコンが表示されます。組み込みのアイコンを使用する代わりに、イメージを作成し、そのイメージを [イメージ] プロパティで使用することができます。2007 Office system Add-In: Icons Gallery (英語) および Office 2010 Add-In: Icons Gallery (英語) にも、多数のアイコンが用意されています。

Visual Studio 2010 を使用した Microsoft Office アプリケーションのユーザー インターフェイス変更の詳細については、「Office UI のカスタマイズ」を参照してください。

ヒント

[方法] VBA を使用してリボンに独自のコマンドを追加する」で説明しているように、[OfficeImageId] プロパティの有効な値は、[Project のオプション] ダイアログ ボックスでリボンを一時的に変更することで確認できます。

  1. Project 2010 で、[Project のオプション] ダイアログ ボックスの [リボンのユーザー設定] タブをクリックします。

  2. リボンの既存のグループの 1 つにボタンを追加し、使用可能なアイコンからコマンドのアイコンを選択して設定します。

  3. リボンの変更内容を ProjectCustomizations.exportedUI ファイルにエクスポートするには、[インポート/エクスポート]、[すべてのユーザー設定をエクスポート] の順にクリックします。アイコン名は、mso:button 要素の imageMso 属性の値です。

手順 3. では、ボタンの Click イベント ハンドラーの作成方法と、[Toggle Manual Task Color] ボタンのクリック時に実行されるコードの作成方法を示します。

手順 3. ボタンの Click イベントに関するコードを作成する

  1. リボンのデザイン ビューで、[Toggle Manual Task Color] ボタンをクリックして選択します。[プロパティ] ウィンドウで、[イベント] アイコンをクリックして、そのリボン コントロールで使用できるイベントを確認します ([トグル ボタン] コントロールの場合は Click イベントのみです)。

  2. [プロパティ] ウィンドウで、Click イベントをダブルクリックして、tBtnManualTaskColor_Click イベント ハンドラーを作成します。Visual Studio によって ManualTaskColor.vb ファイル (または ManualTaskColor.cs ファイル) が開かれ、該当するイベント ハンドラー コードが表示されます。

  3. 名前空間の参照とオプションを、以下のように ManualTaskColor コード ファイルに追加します。

    Option Explicit On
    
    Imports Microsoft.Office.Tools.Ribbon
    Imports MSProject = Microsoft.Office.Interop.MSProject
    
    using System;
    using Microsoft.Office.Tools.Ribbon;
    using MSProject = Microsoft.Office.Interop.MSProject;
    
  4. ManualTaskColor クラスの定数と変数を追加します。app オブジェクトは ManualTaskColor_Load イベント ハンドラー内でインスタンス化でき、そのインスタンスは Project の実行開始時に呼び出されます。Globals クラスは、アドインの Application オブジェクトへのアクセスを可能にします。

    Public Class ManualTaskColor
    
        Private Const WHITE As Integer = &HFFFFFF
        Private Const LIGHT_BLUE As Integer = &HF0D9C6
    
        Dim app As MSProject.Application
        Dim project As MSProject.Project
    
        Private Sub ManualTaskColor_Load(ByVal sender As System.Object,
                        ByVal e As RibbonUIEventArgs) _
                        Handles MyBase.Load
            app = Globals.ThisAddIn.Application
        End Sub
        ' . . .
    
    namespace RibbonAddIn
    {
        public partial class ManualTaskColor
        {
            private const int WHITE = 0xFFFFFF;
            private const int LIGHT_BLUE = 0xF0D9C6;
    
            MSProject.Application app;
            MSProject.Project project;
    
            private void ManualTaskColor_Load(object sender, 
                RibbonUIEventArgs e)
            {
                app = Globals.ThisAddIn.Application;
            }
            // . . .
    

    定数は、16 進数の値で指定できる 24 ビット色です。Project 2010 には、色を RGB 値で指定する Font32Ex のようなメソッドが含まれています。

    注意

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

  5. ToggleManualTasksColor メソッドを作成し、ボタンの Click イベント ハンドラーから呼び出します。project オブジェクトの初期化は、プロジェクトが開かれ、アクティブ化された後でしか行えません。プロジェクトはアドインの読み込み後にアクティブになります。ManualTaskColor_Load イベント ハンドラー内で project の初期化を試みると、アクティブなプロジェクトがまだ存在しないため、アドインで例外が発生します。

    Private Sub tBtnManualTaskColor_Click(ByVal sender As System.Object, _
                    ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
                    Handles tBtnManualTaskColor.Click
        ToggleManualTasksColor()
    End Sub
    
    Sub ToggleManualTasksColor()
        Dim column As String = "Name"
        Dim rowRelative As Boolean = False
        Dim rgbColor As Integer
    
        project = app.ActiveProject
    
        For Each t As MSProject.Task In project.Tasks
            If (Not t Is Nothing) And (Not t.Summary) Then
                app.SelectTaskField(t.ID, column, rowRelative)
                rgbColor = app.ActiveCell.CellColorEx
    
                If (t.Manual) Then
                    ' Check whether the manual task color is white.
                    If (rgbColor = WHITE) Then
                        ' Change the background to light blue.
                        app.Font32Ex(CellColor:=LIGHT_BLUE)
                    Else
                        ' Change the background to white.
                        app.Font32Ex(CellColor:=WHITE)
                    End If
                Else
                    ' The task is automatically scheduled, 
                    ' so change the background to white.
                    app.Font32Ex(CellColor:=WHITE)
                End If
            End If
        Next
    End Sub
    
    private void tBtnManualTaskColor_Click(object sender, 
        RibbonControlEventArgs e)
    {
        ToggleManualTasksColor();
    }
    
    private void ToggleManualTasksColor()
    {
        string column = "Name";
        bool rowRelative = false;
        int rgbColor;
    
        project = app.ActiveProject;
    
        foreach (MSProject.Task t in project.Tasks)
        {
            if ((t != null) && !(bool)t.Summary)
            {
                app.SelectTaskField(t.ID, column, rowRelative);
                rgbColor = app.ActiveCell.CellColorEx;
    
                if ((bool)t.Manual)
                {
                    // Check whether the manual task color is white.
                    if (rgbColor == WHITE)
                    {
                        // Change the background to light blue.
                        app.Font32Ex(CellColor:LIGHT_BLUE); 
                    }
                    else
                    {
                        // Change the background to white.
                        app.Font32Ex(CellColor:WHITE); 
                    }
                }
                else
                {
                    // The task is automatically scheduled, 
                    // so change the background to white.
                    app.Font32Ex(CellColor:WHITE); 
                }
            }
        }
    }
    
  6. Visual Studio 内でアドインをテストしてデバッグするには、F5 キーを押します。たとえば、何らかのタスクをプロジェクトに追加し、リボンの [Highlight] タブを選択して、[Toggle Manual Task Color] を 2 回クリックします (図 3)。rgbColor を設定するステートメントにブレークポイントを設定している場合、背景色が白のタスクについては app.ActiveCell.CellColorEx = 16777215 であることがデバッガーによって表示されます。

    注意

    Project アプリケーションを開いている場合は、これを閉じてから Visual Studio 内でアドインを実行します。Visual Studio によって、アセンブリに署名するための厳密な名前の一時的なキー ファイルが作成され、このアドイン付きの Project アプリケーションが起動されます。

    Global.mpt ファイルや開いている .mpp ファイルに Project_Open イベント ハンドラーまたは Project_Activate イベント ハンドラー (「[方法] VBA を使用してリボンに独自のコマンドを追加する」を参照) が記述されている場合は、その VBA イベント ハンドラーをコメント アウトまたは削除してから ManualTaskColor アドインを実行します。

rgbColor 変数は、Integer 型 (Microsoft .NET Framework では、32 ビット値まで対応可能) として宣言されています。VBA では、rgbColor を Long 型として宣言する必要があります。VBA と .NET Framework での型の比較については、「VBA オブジェクト モデルの変更点の一覧表」を参照してください。

Task の Summary プロパティ、Manual プロパティなど、一部のプロパティは Microsoft.Office.Interop.MSProject ライブラリの Object 型として宣言されています。Visual C# では、これらのプロパティを具体的な型にキャストする必要があります。Visual Basic の場合、このキャストは必要ありません。たとえば、Visual Basic の If (t.Manual) ステートメントは、Visual C# では if ((bool)t.Manual) とする必要があります。Microsoft Intellisense、または Visual Studio のオブジェクト ブラウザーを使用すると、どのプロパティが Object 型であるかを確認できます。

Visual Studio 2010 では、オプション パラメーターや名前付きパラメーターを Visual Basic の場合と同じように Visual C# で使用できます。たとえば、SelectTaskField メソッドにオプション パラメーターが 6 つあっても、Visual Basic のステートメント app.SelectTaskField(t.ID, column, rowRelative) を Visual C# の場合と同じように表現できます (ステートメントの末尾にはセミコロンを付けます) 。Font32Ex メソッドには、パラメーターが 10 個あります。たとえば、8 番目のパラメーターを指定するには、Visual Basic で app.Font32Ex(CellColor:=LIGHT_BLUE) というステートメントを使用できます。Visual C# では、app.Font32Ex(CellColor:LIGHT_BLUE); というステートメントが使用できます。

図 3 は、ManualTaskColor アドインが「[方法] VBA を使用してリボンに独自のコマンドを追加する」で説明した VBA マクロ ToggleManualTasksColor と同じように動作することを示しています。

図 3. ManualTaskColor アドインの使用

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

アドインが正常に動作した場合は、他の利用者が容易にインストールできるように 手順 4. に従ってアドインを発行します。

手順 4. ManualTaskColor アドインを発行する

  1. ソリューション エクスプローラーで、RibbonAddIn プロジェクトを右クリックし、[プロパティ] をクリックします。

  2. [RibbonAddIn] タブで、[署名] タブをクリックし、[アセンブリの署名] チェック ボックスがオンになっていることを確認します。

  3. [厳密な名前のキー ファイルを選択してください] ドロップダウン リストを使用して、新しいキー ファイルを作成します。たとえば、「RibbonAddIn.snk」という名前で作成します。このキー ファイルは、パスワードで保護するかどうかを選択できます。テストの際に Visual Studio によって作成された厳密な名前の一時的なキー ファイルは、削除してもかまいません。

  4. [発行] タブをクリックし、[発行場所] オプションと [インストール設定] オプションを確認します。既定では、アドインの発行先が Visual Studio プロジェクト ディレクトリの publish\ サブディレクトリになっています。たとえば、プロジェクトが C:\VSTO_Projects\RibbonAddIn にある場合、発行ディレクトリは C:\VSTO_Projects\RibbonAddIn\publish です。また、発行先は、ファイル共有、SharePoint ドキュメント リストの URL、または別の Web サイトや ftp サーバーにすることもできます。

    [前提条件] をクリックして、 セットアップ プログラムによって存在のチェックとインストールが行われる必須コンポーネントを確認します。既定では、セットアップ プログラムによって .NET Framework 3.5 SP1 と Windows Installer 3.1 の有無がチェックされ、必要に応じてそれらが Microsoft ダウンロード センターからダウンロードされます。

    [更新] をクリックして、アドインがいつ更新をチェックするかを指定します。既定では、アドインによる発行場所のチェックが 7 日ごとに行われます。より新しいバージョンが存在する場合、アドインはユーザーに更新を行うように通知します。

  5. [今すぐ発行] をクリックします。Project 2010 がインストールされている別のコンピューター上で setup.exe を実行して、発行されたアドインをテストします。

Project 2010 カスタマイズを展開する場合は、ClickOnce を使用してアドインを発行するほうが、他のコンピューター上にある Global.mpt ファイルに VBA マクロをコピーするよりもずっと優れた方法です。す。

以下に、Visual Basic ソリューションの ManualTaskColor.vb ファイルと Visual C# ソリューションの ManualTaskColor.cs ファイルのコード全体を示します。

Option Explicit On

Imports Microsoft.Office.Tools.Ribbon
Imports MSProject = Microsoft.Office.Interop.MSProject

' Toggle the background color of the Name cell of manually scheduled tasks.
' If a manually scheduled task is changed to automatically 
' scheduled, change the Name cell background color to white.
Public Class ManualTaskColor

    Private Const WHITE As Integer = &HFFFFFF
    Private Const LIGHT_BLUE As Integer = &HF0D9C6

    Dim app As MSProject.Application
    Dim project As MSProject.Project

    Private Sub ManualTaskColor_Load(ByVal sender As System.Object,
                    ByVal e As RibbonUIEventArgs) _
                    Handles MyBase.Load
        app = Globals.ThisAddIn.Application
    End Sub

    Private Sub tBtnManualTaskColor_Click(ByVal sender As System.Object, _
                    ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
                    Handles tBtnManualTaskColor.Click
        ToggleManualTasksColor()
    End Sub

    Sub ToggleManualTasksColor()
        Dim column As String = "Name"
        Dim rowRelative As Boolean = False
        Dim rgbColor As Integer

        project = app.ActiveProject

        For Each t As MSProject.Task In project.Tasks
            If (Not t Is Nothing) And (Not t.Summary) Then
                app.SelectTaskField(t.ID, column, rowRelative)
                rgbColor = app.ActiveCell.CellColorEx

                If (t.Manual) Then
                    ' Check whether the manual task color is white.
                    If (rgbColor = WHITE) Then
                        ' Change the background to light blue.
                        app.Font32Ex(CellColor:=LIGHT_BLUE)
                    Else
                        ' Change the background to white.
                        app.Font32Ex(CellColor:=WHITE)
                    End If
                Else
                    ' The task is automatically scheduled, 
                    ' so change the background to white.
                    app.Font32Ex(CellColor:=WHITE)
                End If
            End If
        Next
    End Sub
End Class
using System;
using Microsoft.Office.Tools.Ribbon;
using MSProject = Microsoft.Office.Interop.MSProject;

namespace RibbonAddIn
{
    // Toggle the background color of the Name cell of manually scheduled tasks.
    // If a manually scheduled task is changed to automatically 
    // scheduled, change the Name cell background color to white.
    public partial class ManualTaskColor
    {
        private const int WHITE = 0xFFFFFF;
        private const int LIGHT_BLUE = 0xF0D9C6;

        MSProject.Application app;
        MSProject.Project project;

        private void ManualTaskColor_Load(object sender, 
            RibbonUIEventArgs e)
        {
            app = Globals.ThisAddIn.Application;
        }

        private void tBtnManualTaskColor_Click(object sender, 
            RibbonControlEventArgs e)
        {
            ToggleManualTasksColor();
        }

        private void ToggleManualTasksColor()
        {
            project = app.ActiveProject;
            string column = "Name";
            bool rowRelative = false;
            int rgbColor;
            
            foreach (MSProject.Task t in project.Tasks)
            {
                if ((t != null) && !(bool)t.Summary)
                {
                    app.SelectTaskField(t.ID, column, rowRelative);
                    rgbColor = app.ActiveCell.CellColorEx;

                    if ((bool)t.Manual)
                    {
                        // Check whether the manual task color is white.
                        if (rgbColor == WHITE)
                        {
                            // Change the background to light blue.
                            app.Font32Ex(CellColor:LIGHT_BLUE); 
                        }
                        else
                        {
                            // Change the background to white.
                            app.Font32Ex(CellColor:WHITE); 
                        }
                    }
                    else
                    {
                        // The task is automatically scheduled, 
                        // so change the background to white.
                        app.Font32Ex(CellColor:WHITE); 
                    }
                }
            }
        }
    }
}

関連項目

タスク

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

[ウォークスルー] PWA 互換性を確認するマネージ コード アドインを作成する

参照

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

その他のリソース

Office UI Customization

Project Solutions

Ribbon Overview

Office 2010 Help Files: Office Fluent User Interface Control Identifiers (英語)

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

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