リボン関連

[リボン・カスタマイズ]splitButton要素の内容を動的に変更する。

3年ほど前に書いた記事「menu内にあるbuttonの数を増やす」にコメントをいただきました。

増やしたのはdynamicMenuの子であって
Menuの子じゃないですよね。
splitButton内のmenuの子を増やす方法を探していたので
タイトルと違う内容だったのが残念です

たしかに取り扱っている内容はdynamicMenu要素なんですが、getContent属性のコールバックでmenu要素を動的に読み込んで、menu要素の子要素であるbutton要素を増やしていく、といったことを行っているのが上記記事です。

カスタマイズしたリボンを動的に変更する場合によく使うのがgetVisible属性getEnabled属性、そしてdynamicMenu要素の属性であるgetContent属性です。

単純に要素を表示したり非表示にしたり、有効・無効を切り替えたりする程度であればgetVisible属性やgetEnabled属性のコールバックだけで十分に処理することができますが、それ以上にカスタマイズを行いたい場合は、通常getContent属性のコールバックで処理することになります。

今回いただいたコメント、splitButton要素の子要素についても、menu要素の子要素の表示・非表示、有効・無効を切り替える程度で対応できないのであれば、下記のようにmenu要素の子要素としてdynamicMenu要素を設定することで、動的に子要素を変更することができるようになります。

[リボンXML]

<?xml version="1.0" encoding="utf-8"?>
<customUI onLoad="rbnSample_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab id="tabSample" label="Sample Tab">
        <group id="grpSample" label="Sample Group">
          <splitButton id="slbSample" size="large">
            <button id="btnSample" label="Button増加" imageMso="PlusSign" onAction="btnSample_onAction" />
            <menu id="mnuSample" itemSize="large">
              <dynamicMenu id="dmuSample" label="Sample Menu" imageMso="HappyFace" getContent="dmuSample_getContent" />
            </menu>
          </splitButton>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

[標準モジュール]

Option Explicit

Private myRibbon As Office.IRibbonUI
Private d As Object

Private Sub rbnSample_onLoad(ribbon As IRibbonUI)
  Dim elmButton As Object
  Dim elmMenu As Object
  
  Set myRibbon = ribbon
  
  'XML初期設定
  Set d = CreateObject("Msxml2.DOMDocument")
  Set elmMenu = d.createElement("menu")
  elmMenu.setAttribute "xmlns", "http://schemas.microsoft.com/office/2006/01/customui"
  elmMenu.setAttribute "itemSize", "large"
  Set elmButton = d.createElement("button")
  elmButton.setAttribute "id", "btnChild1"
  elmButton.setAttribute "label", "Child Button1"
  elmButton.setAttribute "imageMso", "MicrosoftExcel"
  elmButton.setAttribute "onAction", "btnChild_onAction"
  elmMenu.appendChild elmButton
  d.appendChild elmMenu
End Sub

Private Sub btnSample_onAction(control As IRibbonControl)
'button要素増加
  Dim num As Long
  Dim n As Object
  
  num = d.getElementsByTagName("button").Length
  Set n = d.createNode(1, "button", d.DocumentElement.NamespaceURI)
  With d.DocumentElement.appendChild(n)
    .setAttribute "id", "btnChild" & num + 1
    .setAttribute "label", "Child Button" & num + 1
    .setAttribute "imageMso", "MicrosoftExcel"
    .setAttribute "onAction", "btnChild_onAction"
  End With
  myRibbon.InvalidateControl "dmuSample"
End Sub

Private Sub btnChild_onAction(control As IRibbonControl)
  MsgBox control.ID, vbInformation + vbSystemModal
End Sub

Private Sub dmuSample_getContent(control As IRibbonControl, ByRef returnedVal)
  returnedVal = d.XML
End Sub

dynamicMenu_getContent_01

menu要素の中にdynamicMenu要素を入れるので、ワンクッション置く形にはなりますが、一応目的は達成できるのではないかと思います。

ファイルをブックに埋め込むExcelマクロ前のページ

JavaのGUIDを取得するVBAマクロ次のページ

関連記事

  1. Office関連

    Custom UI Editorの最新版がGitHubで公開されました。

    下記記事等で紹介している、リボンUIをカスタマイズするためのツール「C…

  2. Office関連

    [リボン・カスタマイズ]toggleButtonのオン・オフを動的に変更する。

    “リボン上のトグルボタンをマクロで押し下げすることはできないか?”、と…

  3. Office関連

    [リボン・カスタマイズ]グループの表示・非表示をトグルボタンで切り替える。

    数年前に書いた記事に下記コメントをいただきました。Excelに…

  4. Office関連

    Re: 【Wordマクロ】Word起動時に、前回終了時に開いていたファイルを表示

    Word MVPの新田さんがブログで面白い記事を書かれていました。…

  5. Office関連

    Office 2013のコントロールIDリストが更新されました。

    「コントロールID 一覧(Office 2013)」でも紹介しているO…

  6. Office関連

    メモ帳だけでOutlook用アドインを作ってみる。

    「SharpDevelopでExcel用COMアドインを作成する方法」…

コメント

  1. この記事へのコメントはありません。

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP