更新日: 2010 年 7 月 23 日

C# の内容はこちらに掲載しています。10 行でズバリ!! [C#] Office - リボンのカスタマイズ

このコンテンツのポイント

  • Office アプリケーションのアプリケーション レベル拡張機能開発の手順を学習する
  • リボンの拡張開発方法を学習する

今回紹介するコード

<ThisAddIn.vb>

Visual Basic
Imports Microsoft.Office.Tools
...
Public MyControl As UserControl1 = New UserControl1()
Public MyRibbon As Ribbon1 = New Ribbon1()
Public MyPane As CustomTaskPane

Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
  Return MyRibbon
End Function

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
  MyPane = CustomTaskPanes.Add(MyControl, "My Control")
  MyPane.Visible = True
End Sub
...
 

<Ribbon1.xml>

XML
<?xml version="1.0" encoding="UTF-8"?> 
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load" loadImage="LoadImage"... 
<group id="MyGroup" 
               label="My Group"  <button id="MyButton1" size="large" label="Show Button" onAction="Ribbon_Clicked" image="Icon1.ico" /> 
  <button id="MyButton2" size="large" label="Hide Button" onAction="Ribbon_Clicked" imageMso="MicrosoftExcel"/> 
</group> 
... 
 
 

<Ribbon1.vb>

Visual Basic
Imports System.Reflection
Imports System.Drawing
...
Public Sub Ribbon_Clicked(ByVal control As Office.IRibbonControl)
  If control.Id = "MyButton1" Then
    Globals.ThisAddIn.MyPane.Visible = True
  ElseIf control.Id = "MyButton2" Then
    Globals.ThisAddIn.MyPane.Visible = False
  End If
End Sub

Public Function LoadImage(ByVal imageName As String) As Bitmap
  Dim executingAssembly = Assembly.GetExecutingAssembly()
  Dim stream = executingAssembly.GetManifestResourceStream("ExcelAddIn1." + imageName)

  Return New Bitmap(stream)
End Function
...
 

目次

  1. はじめに
  2. プロジェクトを作成する
  3. カスタム作業ウィンドウを生成する
  4. アドイン独自のリボンを生成する
  5. 処理を作成する
  6. 動作を確認する

1. はじめに

Word、Excel、PowerPoint などの Office 製品を活用したアプリケーション開発には、アプリケーション レベル (アドイン)、ドキュメント レベルの 2 通りの方法があります。

アプリケーション レベル (アドイン) 開発した機能は Word、Excel などの Office クライアント アプリケーションに組み込まれ、Word、Excel などを起動した際に、機能がロードされます。
ドキュメント レベル 特定のブック (.xlsx)、ドキュメント (.docx)、テンプレート (.xltx、dotx) などに組み込まれ、該当のファイル (ブック、ドキュメント、テンプレート、など) を開いた際に、機能がロードされます。

ここでは、サンプル アプリケーションを例に、Excel を使ったアプリケーション レベルのリボンの機能開発を解説していきます。

ページのトップへ


2. プロジェクトを作成する

今回は、リボンにボタンを追加し、ボタンを押すことでカスタム作業ウィンドウの表示/非表示を変更する簡単な Excel アプリケーションを構築します。

なお、カスタム作業ウィンドウの開発手法および Excel のシートの操作に関しては、「10 行でズバリ!! [VB] Office - アプリケーション レベルの機能開発 (アドイン開発)」で解説しておりますのでそちらをご参照ください。

まず、Visual Studio を起動します。

[ファイル] メニューの [新規作成] を選択して、[プロジェクト] をクリックします。表示される [新しいプロジェクト] ダイアログ ボックスの左のペインで [Visual Basic] - [Office] - [2007] ノードを展開し、図 1 の通り、テンプレートとして [Excel ブック] をクリックして [OK] ボタンを押します。

図 1. プロジェクト テンプレートを選択してプロジェクトを作成

ページのトップへ


3. カスタム作業ウィンドウを生成する

Office アプリケーション (Office 2007 以降) でボタンなどのコントロールを配置して作業を行えるようにするために、作業ウィンドウ (タスク ペイン) や、操作ウィンドウ (アクション ペイン)、リボンを使用することができます。

詳細については「10 行でズバリ!! [VB] Office - アプリケーション レベルの機能開発 (アドイン開発)」で解説しておりますので、今回はカスタム作業ウィンドウのカスタマイズ方法については詳しく触れません。

まず、プロジェクトをマウスで右クリックして、[追加] - [新しい項目] を選択します。表示される下記の画面で、[ユーザー コントロール] を選択して [追加] ボタンを押します。

図 2. ユーザー コントロールの追加

ページのトップへ


4. アドイン独自のリボンを生成する

それではリボンを作成していきましょう。プロジェクトをマウスで右クリックして、[追加] - [新しい項目] を選択します。図 3 に示すように [Office] カテゴリから [リボン (XML)] を選択し [追加] ボタンを押します。

図 3. リボンの追加

次に、リボンに表示するアイコンを追加します。同様にプロジェクトをマウスで右クリックして、[追加] - [新しい項目] を選択し、図 4 のように [共通項目] カテゴリの [アイコン ファイル] を選択し [追加] ボタンを押します。

図 4. アイコンの追加

追加したアイコンはリソースとして表示に使うので、追加した Icon1.ico ファイルのプロパティを選択し、図 5 のようにビルド アクションを「埋め込まれたリソース」に変更します。

図 5. アイコンを埋め込まれたリソースとして利用

このアイコン ファイルと、Excel に定義されているアイコンを利用してリボンに 2 つのボタンを追加します。Ribbon1.xml を開き、先頭の <customUI> タグに loadImage 属性を記述し、<group> タグの中に下記の通りにコードを記述します。


<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load" loadImage="LoadImage">
 <ribbon>
   <tabs>
     <tab idMso="TabAddIns">
       <group id="MyGroup"
              label="My Group">
         <button id="MyButton1" size="large" label="Show Button" onAction="Ribbon_Clicked" image="Icon1.ico" />
         <button id="MyButton2" size="large" label="Hide Button" onAction="Ribbon_Clicked" imageMso="MicrosoftExcel"/>
       </group>

...

MyButton1 には先ほど追加した Icon1.ico を、MyButton2 には Excel のアプリケーション アイコンを指定しています。

ページのトップへ


5. 処理を作成する

次に、リボンに追加したボタンが押された際の処理を作成します。今回は、Show Button (MyButton1) が押されるとカスタム作業ウィンドウが表示され、Hide Button (MyButton2) が押された場合にはカスタム作業ウィンドウが非表示になる処理を記述します。

Ribbon1.vb を開き、以下の通りに処理を記述します。

Imports System.Reflection
Imports System.Drawing

...
Public Sub Ribbon_Clicked(ByVal control As Office.IRibbonControl)
 If control.Id = "MyButton1" Then
   Globals.ThisAddIn.MyPane.Visible = True

 ElseIf control.Id = "MyButton2" Then
   Globals.ThisAddIn.MyPane.Visible = False

 End If
End Sub
 
Public Function LoadImage(ByVal imageName As String) As Bitmap
 
Dim executingAssembly = Assembly.GetExecutingAssembly()
 Dim stream = executingAssembly.GetManifestResourceStream("ExcelAddIn1." + imageName)
 
 
Return New Bitmap(stream)
End Function

...

また、ThisAddIn.vb を開き、以下の通りに処理を記述します。

Imports Microsoft.Office.Tools
...
Public MyControl As UserControl1 = New UserControl1()
Public MyRibbon As Ribbon1 = New Ribbon1()
Public MyPane As CustomTaskPane
 
Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
 
Return MyRibbon
End Function
 

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
 MyPane = CustomTaskPanes.Add(MyControl, "My Control")
 MyPane.Visible = True
End Sub
...

ページのトップへ


6. 動作を確認する

では、実行してみましょう。プロジェクトのデバッグを開始すると図 6 のように操作ウィンドウにボタンが表示された状態で Excel が起動します。ここで、リボンのアドイン タブを選択し、[Hide Button] をクリックすると、画面右のカスタム作業ウィンドウ [My Control] が非表示になり、[Show Button] をクリックすると再び表示できることが確認できます。

図 6. リボンのアドイン タブに独自のボタンを配置した様子

Note: 状況に応じてリボンのタブなどの表示/非表示を切り替えることが可能です。例として、操作ウィンドウ内のボタンを押すとアドイン タブの表示/非表示を切り替える例を紹介します。

まず、UserControl1 にボタンを配置し、クリック時のイベント ハンドラーを追加します。UserControl1.vb を開き、以下の通りに処理を記述します。

...
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) cHandles Button1.Click
   Globals.ThisAddIn.MyRibbon.FlipShowHide()
End Sub...

次に、Ribbon1.vb を開き以下の通りに処理を記述します。

...
Private _isVisible As Boolean = True
 
Public Sub FlipShowHide()
   _isVisible = Not _isVisible
  ribbon.Invalidate()
End Sub
 
Public Function GetVisible(ByVal control As Office.IRibbonControl) As Boolean
   Return _isVisible
End Function

...

最後に、Ribbon1.xml を開き、以下のように表示状態を GetVisible() メソッドを参照するように下記の要素を追記します。

...
   <tabs>
     <tab idMso="TabAddIns" getVisible="GetVisible">
       <group id="MyGroup"
              label="My Group">
...

Note: Office 2007 では大量のボタンを配置した際に画面の幅が足りなくなった場合には、図 7 のようにスクロールさせて隠れたボタンを表示させることになります。

図 7. ボタンが収まりきらなくなった場合の表示

Office 2010 のリボンでは、<group> タグに autoScale="true" 属性を追加することで自動的にアイコンを小さく表示させることが可能になっています。

autoScale 属性を利用する際にはリボン定義ファイルのスキーマを Office 2010 用に書き換える必要があることに注意してください。

Office 2007 のスキーマ

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" ...>


Office 2010 のスキーマと属性の指定

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" ...>
...
       <group id="MyGroup"
              label="My Group" autoScale="true">
...

 

図 8. Office 2010 での autoScale 機能


Code Recipe .NET Framework デベロッパー センター

ページのトップへ