Office関連

[リボン・カスタマイズ]カスタムタブを共有する。

※ 2015/2/18 コードに一部誤りがあったので修正しました。

リボンをカスタマイズして、ホームやアドインといった既存のタブではない、カスタムタブを共有して複数のファイルで使いたい、という質問をいただきました。

そういえば、今までHPやブログでタブを共有する方法を取り上げたことが無かったので、今回改めてExcelを例に紹介することにします。

リボンのカスタムタブを共有する方法ですが、まずは基盤となるファイル(ホスト)を用意します。

・ホストファイルのリボンXML

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared">
  <ribbon>
    <tabs>
      <tab idQ="nsShared:tabShared" label="Shared Tab">
        <group idQ="nsShared:grpShared" label="Shared Group" />
      </tab>
    </tabs>
  </ribbon>
</customUI>

Custom UI Editor等でファイルをカスタマイズしたら、アドイン(xlam)として保存し、Excelで読み込みます(Excelのオプション → アドイン → Excel アドインの設定)。

SharedRibbon_01_01

この時点では上図のようにタブ(Shared Tab)とグループ(Shared Group)だけしか表示されません。

次に基盤の上に乗るファイル(ゲスト)を用意します。

・ゲストファイル1のリボンXML

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared">
  <ribbon>
    <tabs>
      <tab idQ="nsShared:tabShared">
        <group idQ="nsShared:grpShared">
          <button id="btnSample1" label="Sample Button 1" imageMso="HappyFace" size="large" onAction="btnSample1_onAction" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

・ゲストファイル1の標準モジュール

Option Explicit

Public Sub btnSample1_onAction(control As IRibbonControl)
  MsgBox control.ID, vbInformation + vbSystemModal
End Sub

用意ができたらホストファイルと同じようにアドインとして保存し、Excelで読み込むと・・・

SharedRibbon_01_02

何も表示されていなかったホストファイルのグループ(Shared Group)にゲストファイルのボタン(Sample Button 1)が表示され、クリック時のコールバック(btnSample1_onAction)も動作することが確認できました。

SharedRibbon_01_03

さらに、別のゲストファイルを追加することもできます。

・ゲストファイル2のリボンXML

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:nsShared="rbnShared">
  <ribbon>
    <tabs>
      <tab idQ="nsShared:tabShared">
        <group idQ="nsShared:grpShared">
          <button id="btnSample2" label="Sample Button 2" imageMso="SadFace" size="large" onAction="btnSample2_onAction" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

・ゲストファイル2の標準モジュール

Option Explicit

Public Sub btnSample2_onAction(control As IRibbonControl)
  MsgBox control.ID, vbCritical + vbSystemModal
End Sub

このファイルも同様にアドインとして読み込むと・・・

SharedRibbon_01_04

SharedRibbon_01_05

もう一つボタン(Sample Button 2)が追加されました。

上記のように、名前空間を設定し、idQ属性で指定することで、リボンのタブを共有することができます。
設定が若干ややこしいかもしれませんが、慣れればすぐに設定できますので、カスタムタブの共有化を考えている方は是非お試しください。

日経ソフトウエア 2014年 10月号 「VBAでExcelを業務アプリ化」前のページ

VBAで○○を禁止したい!・・・と思う前に。次のページ

関連記事

  1. Office関連

    OneNoteの指定したセクションをページごとに指定した形式で出力するマクロ

    今回はOneNoteの指定したセクションをページごとに指定した形式で出…

  2. Office関連

    受信メールに対して自動的に返信するOutlookマクロ

    「Outlook VBA 自動返信」といったキーワード検索でのアクセス…

  3. リボン関連

    続・Office Ribbon Editorがダウンロード出来ない?

    「Office Ribbon Editorがダウンロード出来ない?」で…

  4. Office関連

    [PowerPoint]Applicationオブジェクトのイベントを利用する

    PowerPointのApplicationオブジェクトには、スライド…

  5. アイコン一覧

    Office 2013 アイコン一覧(M)

    ・Office 2013 アイコン一覧 NUM…

  6. アイコン一覧

    Office 365アイコン(imageMso)一覧(C)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

コメント

    • まひと
    • 2015年 11月 27日 11:21pm

    お世話になります。

    本ブログで紹介されているコードにおいて、VBEの参照設定で、ゲストファイルがホストファイルを参照するようにすると、ゲストファイルを開くとホストファイルのカスタムタブが自動で読み込まれます。
    (ただし、ホストファイルのアドインのチェックボックスは選択されていない状態となっている。利用できるアドインで選択されているのは、ゲストファイルのみとなっている)

    ゲストファイルを閉じるとホストファイルのカスタムタブも自動的に閉じたいのですが、どのようにすればできるでしょうか?

    実際の使用用途として、
    ホストファイルは共用で使えるマクロ集を、ゲストファイルはその機能に特化したマクロをそれぞれアドイン化しており、ゲストファイルからホストファイルのマクロを呼び出せるように参照設定しています。
    ゲストファイルを閉じてもホストファイルのカスタムタブが残ったままになり、すっきりしないので、質問させて頂いた次第です。
    (Excel 2013を使用していますが、残ってしまったホストファイルのカスタムタブは、Excelの閉じる、開くを繰り返すと消えます)

    よろしくお願い致します。

    • > まひとさん

      初心者備忘録管理人のきぬあさです。
      ご質問いただきましたカスタムタブの共有の件につきまして、私の方では未確認なのですが、下記のように動的にアドインファイルを読み込むようにしてみてはいかがでしょうか。

      Private Sub Workbook_Open()
        With Application.AddIns.Add("C:\Test\BookHost.xlam")
          If .Installed = False Then .Installed = True
        End With
      End Sub
      
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
        With Application.AddIns.Add("C:\Test\BookHost.xlam")
          If .Installed = True Then .Installed = False
        End With
      End Sub

      ただ、私の経験上、カスタムタブの共有化は管理が煩雑になり、トラブルの元になることが多いです。
      可能であれば、コンテキスト タブ( https://dekiru.net/article/12810/ )等を活用してアドインファイルをまとめてしまうか、ホームタブ等の既存タブを利用した方が良いだろうと思います。

    • まひと
    • 2015年 12月 06日 10:44pm

    ご回答ありがとうございます。返信遅くなりすみません。

    ご提示されたコードだけだとうまく行きませんでした。
    ホストアドインを参照設定したゲストアドインを開くと、ホストアドインはInstalled=Falseとなっているのが原因かと思います。

    ただ、強制的にホストアドインをInstalled=Trueとし、その後Installed=Falseとすることで、Excelを閉じて再起動した際にはホストアドインのカスタムタブは表示されなくなり、目的の半分は達成できました。Excelを終了するまでは、ゲストアドインを閉じても、ホストアドインのカスタムタブは残ったままです。

    本当は、ゲストアドインを閉じた時点でホストアドインのカスタムタブも閉じたいのですが、ホストアドインを参照している複数ブックを開いていると、どの時点でInstalled=Falseにするのか、というのも難しいかと思われるため、一旦解決とさせて頂きます。

    ありがとうございました。

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP