PR

VBAでXML形式のファイルを使用してFulentリボンを設定する-その3

Excel VBA Tips
この記事は約43分で読めます。

「Excel VBA Tips」ではExcel VBAを使用していて気付いたことを取り上げて行きます。

初回から3回に渡り、XML形式のファイル”customUI14.xml”を使用したFulentリボンの機能についてご紹介いたしてきましたが、今回が最後になります。

最後はXML形式でのFulentリボンのコールバック関数について具体的にXMLファイルとVBAに設定して行きます。

※動作は32bit版Excel 2016と64bit版Excel 2021の バージョン2404(ビルド 17531.20152)を使用して検証しています。

スポンサーリンク

コールバック関数を扱うにはマクロ有効ブック等が必要

コールバック関数を使用するためには、マクロ有効ブック”.xlsm”やExcelアドイン”.xlam”どちらかのファイル形式にしなければなりません。

ただそうなるとそのような悪意のあるプログラムが含まれている可能性があるファイルをネット上からダウンロードする事はマルウェア対策として許されていない認識です。

端的にマクロ有効ブック”.xlsm”のままでサンプルファイルを作る事は出来ないので、マクロ有効ブックを展開してできる個々のフォルダー・ファイルのなかで必要になる右図赤枠で囲んだフォルダー・ファイルをZIP圧縮してダウンロードできる形にいたします。

そのためお手数ではありますが、ダウンロードしたフォルダー・ファイルを使ってつぎの1から4の加工をしていただく必要がありますのでお含み置きください。

  1. 赤枠を付けていない2つのフォルダー”docProps”と”xl”については、お手元でマクロ有効ブック”.xlsm”新規に作成・保存していただき、拡張子を”.zip”に変更してマクロ有効ブック”.xlsm”の中身を展開し、それをコピー & 貼り付けしたものをご使用ください。
  2. フォルダー・ファイルがすべてそろったら、すべてを選択してZIP圧縮しファイル名の拡張子を”.xlsm”に変更してください。
  1. 作成したマクロ有効ブック”.xlsm”を起動するのですが、起動する際に下記の注意点がありますので必ずご一読ください。

XML形式のファイル”customUI14.xml”を使用したFulentリボンで”customUI14.xml”にコールバック関数を記述すると、起動時やカスタムタブを表示しようとした時に設定されているコールバック関数を探しに行くので、VBAに当該subステートメントが設定されていないとエラーメッセージが相当数表示されることになります。

上記の理由から 、作成したマクロ有効ブック”.xlsm”を起動すると警告のポップアップウィンドウが表示されますので、表示される分だけOKボタンをクリックしてください。

①「マクロ”customUI_onLoad”を実行できません。」が3回表示
②「マクロ”comboBox_getText”を実行できません。」
③「マクロ”dropDown_getSelectedItemID”を実行できません。」
④「マクロ”tabDeveloper_getVisible”を実行できません。」
⑤「マクロ”separator_getVisible”を実行できません。」

  1. その後で、VBEを開き標準モジュールを追加していただき、後段でご紹介するコーディング事例をコピーして標準モジュールの先頭に貼り付け・保存していただければ幸いです。

※画面キャプチャーでイミディエイトウィンドウを開いているのは”debug.print”を確認するために使用します。

すべてのコールバック関数を確認できている分けではない

大変恐縮ですが、確認できていないコールバック関数がいくつかあり、それは次のよう理由からになります。

  1. 使い方がよくわからないもの
    • 設定してもパラメータが反映されないなどの理由によるもの
  2. 設定するとエラーになるもの

※個々のコントロール(タグ)のコールバック関数を押しなべてすべて確認しているわけではありませんのあらかじめお含み置きください。

実際に確認したタブとコールバック関数の組み合わせで該当したものはつぎのようになります。

タブCallBack理由説明
boxgetVisible1isibleパラメータにFalseをセットしても表示される
buttongetShowImage1showImageパラメータにFalseをセットしても表示される
getShowLabel1showLabelパラメータにFalseをセットしても表示される
checkBoxgetShowLabel2
controlonAction2
gallerygetItemScreenTip2
getItemSuperTip2
menuonAction2

属性とコールバック関数はどちらか一方しか設定できないものがある

個々のコントロール(タグ)に設定している属性と、その属性を動的に設定するためのコールバック関数は、両方XML形式のファイル”customUI14.xml”に設定して起動するとエラーメッセージが表示されるものがあります。
※一部に、属性にセットする値によってエラーになる/ならないが変化するものもあります。

また少し組み合わせの内容が異なりますが、comboBoxコントロール(タグ)やgallryコントロール(タグ)では、一連のgetItemCountコールバック関数を指定した時に、itemコントロール(タグ)は使わなくなるのですが(残した場合でも実際に使用されるのはコールバック関数)、ただしそのまま残っていてもエラーにはなりません。
※本来は削除すべきですが、コーディング事例では注釈にして残してあります。

前回ご紹介した❝cutomUI14.xml❞ファイルのコーディング事例は、この理由からかなり変更が加わっていますのであらかじめお含み置きください。

確認した属性とコールバック関数のどちらか一方を選択する組み合わせ
属性CallBack
enabledgetEnabled
imagegetImage
itemHeightgetItemHeight
itemWidthgetItemWidth
labelgetLabel
どちらか一方になる組み合わせ
属性 CallBack
screentipgetScreentip
showLabelgetShowLabel
sizegetSize
supertipgetSupertip
titlegetTitle
visiblegetVisible
どちらか一方になる組み合わせ
属性CallBack備考
showImageTruegetShowImageFalseはOK.
でもイメージ
は表示
どちらか一方になる組み合わせで値も関係するもの

checkboxのgetPressedコールバック関数には問題がある

checkboxコントロール(タグ)のgetPressedコールバック関数は「癖が強い」と言いますか、チェックボックスがチェックされているかどうかを取得するためのパラメータが存在しません。

getPressedコールバック関数が設定されているtoggleButtonの場合は、パラメータで状態が押されているかどうかを示す値を取得する事ができますが…

※なおcheckboxコントロール(タグ)の中でgetPressedとonActionコールバック関数を両方設定すると起動時にエラーが返るのでどちらかを設定します。

onActionコールバック関数にしても、getPressedコールバック関数にしても、コールされた時に事前に定義したBoolean型グローバル変数のTrue/Falseでチェックボックスがチェックしているか?/いないか?の状態を独自に保持することが必要になります。

ただしgetPressedコールバック関数ではcheckboxコントロール(タグ)を連続して変更した場合に、二度目の操作ではgetPressedコールバック関数が呼ばれないのです…
※再現性があるのでこれはバグかもしくはそのような仕様になっていると言えます。

そのためわざわざBoolean型グローバル変数に値を保存しコール時に反転するコーディングをしたとしても、変数の値を正しくキープする事ができません。

従って、checkboxコントロール(タグ)ではonActionコールバック関数を使用するのが正解です。
※getPressedコールバック関数は使えないのですが、確認の履歴としてコーディングを注釈で残していますのであらかじめお含み置きください。

getPressedコールバック関数の動きの補足説明
  • カスタムタブが有効化された時点で1度getPressedコールバック関数はシステムからコールされます。
  • なおcustomUIコントロール(タグ)のonLoadコールバック関数でBoolean型グローバル変数にTrueをセットすると、チェックボックスにチェックが入らずに起動され、Falseの場合はチェックが入った状態で起動されます。
  • カスタムタブが有効化された時にonLoadコールバック関数が一番最初にシステムからコールされて、その後にgetPressedコールバック関数がシステムからコールされるので、初期設定したBoolean型グローバル変数は一度反転される事になり、チェックボックスのチェック状態とBoolean型グローバル変数の真偽は一致します。

コーディング事例

今回使用するするコーディング事例ですが、まずは前回で使用した❝cutomUI14.xml❞ファイルに比べて、見え方はほぼほぼ同じなのですが属性とコールバック関数の組み合わせに変えたところなど色々と異なる部分がありますので、まずはそちらからご紹介いたします。

❝cutomUI14.xml❞ファイルのコーディング事例

今回の動作確認で使用した❝cutomUI14.xml❞ファイルのコーディング事例をご説明いたします。
※今回は説明のために注釈文が多く含まれていますのであらかじめお含み置きください。

実際のコーディング事例

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="customUI_onLoad" loadImage="customUI_loadImage">
 <commands>
  <command idMso="Bold" getEnabled="command_getEnabled" onAction="command_onAction"/> <!--enabledとgetEnabledはどちらか-->
 </commands>
 <ribbon startFromScratch="true"> <!--標準リボンタブを無効化-->
  <qat>
   <documentControls>
    <control idMso="HyperlinkInsert"/>
    <control idMso="CalculateNow"/>
    <separator id="separator" getVisible="separator_getVisible"/>
    <control idMso="Bold"/>
   </documentControls>
  </qat>
  <tabs>
   <tab idMso="TabHome" visible="true"/> <!--ホームリボンタブを有効化-->
   <tab idMso="TabDeveloper" getVisible="tabDeveloper_getVisible"/> <!--開発リボンタブ有効化 visibleとgetVisibleはどちらか-->
   <tab id="CustomTab" label="Custom Tab" insertAfterMso="TabHome"> <!--insertBeforeMsoといづれか-->
    <group id="CustomGroup1" label="Custom Group1" getVisible="customGroup1_getVisible">
     <button id="Buttonct0" label="Custom Button0" size="large"  screentip="リボンリセット" supertip="リボンキャッシュをリセット"
        onAction="buttonct0_onAction" getVisible="buttonct0_getVisible"
        getImage="buttonct0_getImage" getShowImage="buttonct0_getShowImage"
     /> <!--showLabelとgetshowLabelはどちらか。showImage="false"とgetShowImageはOKだがイメージは表示。showImage="true"はNG-->
     <button id="Buttonct1" image="IMG01" onAction="buttonct1_onAction"
        getLabel="buttonct1_getLabel" getShowLabel="buttonct1_getShowLabel"
        getScreentip="buttonct1_getScreentip" getSize="buttonct1_getSize" getSupertip="buttonct1_getSupertip"
     /> <!-- imageとgetImage、labelとgetLabel、screentipとgetScreentip、sizeとgetSize、supertipとgetSupertipはどちらか-->
     <box id="box1" boxStyle="vertical" getVisible="box1_getVisible">
      <button id="button" label="Button" imageMso="ViewFormulaBar" onAction="button_onAction"/>
      <checkBox id="checkBox" label="CheckBox" onAction="checkBox_onAction"/> <!--getPressed="checkBox_getPressed"-->
      <buttonGroup id="buttonGroup1" getVisible="buttonGroup1_getVisible">
       <button id="buttongp1" imageMso="Bold" onAction="buttongp1_onAction"/>
       <button id="buttongp2" imageMso="Italic" onAction="buttongp2_onAction"/>
       <button id="buttongp3" imageMso="Underline" onAction="buttongp3_onAction"/>
      </buttonGroup>
     </box>
    </group>
    <group id="CustomGroup2" label="Custom Group2">
     <box id="box2" boxStyle="vertical">
      <comboBox id="comboBox" label="Combo Box" invalidateContentOnDrop="true" maxLength="10" sizeString="WWWWWWWWWW"
         getItemCount="comboBox_getItemCount" getItemID= "comboBox_getItemID" getItemLabel="comboBox_getItemLabel"
         getText="comboBox_getText" onChange="comboBox_onChange">
       <!--下記は意味は無いが有ってもエラーにならない。
       <item id="item1" label="Item 1"/> <item id="item2" label="Item 2"/> <item id="item3" label="Item 3"/>-->
      </comboBox>
      <editBox id="editBox" label="Edit Box" maxLength="10" sizeString="WWWWWWWWWW"
         getText="editBox_getText" onChange="editBox_onChange"/>
     </box>
    </group>
    <group id="CustomGroup3" label="Custom Group3">
     <box id="box3" boxStyle="vertical">
      <dropDown id="dropDown" label="DropDown" showItemLabel="true"
         getSelectedItemID="dropDown_getSelectedItemID" onAction="dropDown_onAction">
       <item id="itemdd1" label="Item 1"/>
       <item id="itemdd2" label="Item 2"/>
       <item id="itemdd3" label="Item 3"/>
       <button id="buttondd" label="ボタン..." onAction="buttondd_onAction"/>
      </dropDown>
      <menu id="menu1" label="Menu" imageMso="ViewFormulaBar" itemSize="large" description="この機能はNG">
       <button id="buttonmn1" label="Button 1" imageMso="FileSave" description="この機能の詳細説明をする"
          onAction= "buttonmn1_onAction"/>
       <menuSeparator id="menuseparator" getTitle="menuseparator_getTitle"/> <!--titleとgetTitleはどちらか-->
       <button id="buttonmn2" label="Button 2" imageMso="Bold" onAction= "buttonmn2_onAction"/>
       <button id="buttonmn3" label="Button 3" imageMso="Undo" onAction= "buttonmn3_onAction"/>
      </menu>
      <toggleButton id="toggleButton" label="Toggle Button" onAction="toggleButton_onAction" getPressed="toggleButton_getPressed"/>
     </box>
     <dialogBoxLauncher>
      <button id="buttondb" screentip="Dialog Box Launcher" onAction="buttondb_onAction"/>
     </dialogBoxLauncher>
    </group>
    <group id="CustomGroup4" label="Custom Group4">
     <box id="box4" boxStyle="vertical">
      <gallery id="gallery" label="Gallery" size="large" image="IMG02" rows="1" columns="4"
         getItemCount="gallery_getItemCount" getItemHeight="gallery_getItemHeight" getItemWidth="gallery_getItemWidth"
         getItemID="gallery_getItemID" getItemImage="gallery_getItemImage" getItemLabel="gallery_getItemLabel"
         onAction="gallery_onAction"> <!--itemHeightとgetItemHeightはどちらか。 itemWidthとgetItemWidthはどちらか。
         showItemImageはfalseでも表示される-->
       <!--下記は意味は無いが有ってもエラーにならない。
       <item id="itemgy1" imageMso="ActiveXImage"/> <item id="itemgy2" imageMso="ActiveXComboBox"/>
       <item id="itemgy3" imageMso="ActiveXListBox"/> <item id="itemgy4" imageMso="ActiveXCheckBox"/>-->
      </gallery>
      <labelControl id="labelControl" getLabel="labelControl_getLabel"/> <!--labelとgetLabelはどちらか-->
     </box>
    </group>
    <group id="CustomGroup5" label="Custom Group5">
     <box id="box5" boxStyle="vertical">
      <splitButton id="splitButton" getSize="splitButton_getSize"> <!--sizeとgetSizeはどちらか -->
       <button id="buttonsp" image="IMG03" label="Split Button" onAction="buttonsp_onAction"/>
       <menu id="menu2">
        <button id="buttonsp1" label="Button 1" onAction="buttonsp1_onAction"/>
        <button id="buttonsp2" label="Button 2" onAction="buttonsp2_onAction"/>
       </menu>
      </splitButton>
     </box>
    </group>
   </tab>
  </tabs >
 </ribbon>
</customUI>

属性をコールバック関数に変えたところ以外での変更点はつぎのようになります。

  1. 16行目
    • 開発リボンタブを有効化するためのtabコントロール(タブ)を追加
      ※コーディングを確認するためにVisual Basic Editorを頻繁に呼び出す事になるので…
  2. 20行目~22行目
    • “CustomTab”を初期値の状態に戻すたのbuttonコントロール(タブ)を追加
    • idは”Buttonct0″に設定
  3. 23行目~ 26行目
    • buttonコントロール(タブ)の”id”を”CustomButton”から”Buttonct1″に変更
  4. 28行目
    • buttonコントロール(タブ)の”id”と”label”を”button1″から”button”に変更
  5. 73行目・88行目
    • アイコンイメージを変更しました。
      ※イメージを扱うコールバック関数の動作検証のためです。

今回と前回の”CustomTab”の画面ショットを並べて見ると違いがある事が分かります。

独自アイコンを動的にセットするには

前回、❝customUI❞フォルダーの中にイメージファイルをセットするやり方をご紹介しましたが、コールバック関数を使って動的にイメージを読み込む方法には2つのやり方があります。

❝cutomUI14.xml❞ファイルでアイコンをセットするコントロール(タブ)で次のような設定をします。
※共存する事もできます。

  1. “getImage”コールバック関数を設定する場合
    • 動的にイメージを読み込みます。
      • 今回の事例ではIMG00.jpgを”getImage”コールバック関数で動的に読み込みます。
        • この場合は”id”を介さずに読み込みます。
      • 前回の❝customUI❞フォルダーの中にイメージファイルをセットする時に使った”IMG01″のイメージファイルの拡張子は”.png”でしたが、今回は”.jpg”になります。
        • この理由はVBAで使用する”LoadPicture”関数(VBA標準ではないが…)がVBAで扱える標準画像ファイルしか使えないためです。
  2. “image”属性を設定する場合
    • 前回の❝customUI❞フォルダーの中にイメージファイルをセットするやり方と同じになるのですが、使用するイメージを”customUI”コントロール(タブ)の”loadImage”コールバック関数で動的にイメージを読み込みます。
      • 今回の事例ではIMG02.jpgとIMG03.jpgを”loadImage”コールバック関数で”id”に紐づけて読み込みます。
      • ❝cutomUI14.xml❞ファイルのコントロール(タブ)のトロール(タブ)の”image”属性には上記で使用する”id”がユニークになるように命名します。
    • “loadImage”コールバック関数は、❝cutomUI14.xml❞ファイルの中に設定されている”image”属性の”id”が❝customUI❞フォルダーにない時に呼ばれます。
      ※複数(例えば3つ)あればその分(3回)呼ばれます。

コールバック関数のコーディング事例

続きまして、前節でご紹介した❝cutomUI14.xml❞ファイルのコーディング事例から呼ばれるコールバック関数についてご説明いたします。

なお❝cutomUI14.xml❞ファイルの時と同様に使用を確認するために使った「動かないコールバック関数」についても注釈として残してありますので、お含み置きください。

なお実行する際に、グローバル変数”gb_debug”について下記の注意事項があります。

8行目の論理型グローバル変数の”gb_debug”に”True”をセットすると、該当コールバック関数が使用された時に、イミディエイトウィンドウにデバッグメッセージが出力されますのでご注意ください。
※出力が不要な場合は “False”をセットしてください。

Option Explicit
Public gr_ribbon As IRibbonUI  ' リボンの表示を更新する目的でリボンオブジェクトをセットする
Public gb_check As Boolean  'チェックボックスがチェックされているか?
Public gst_combo As String  'コンボボックスの値を保管
Public gst_edit As String  'エディットボックスの値を保管
Public gst_drop As String  'ドロップダウンの値を保管
Public gb_toggle As Boolean  'トグルボタンの値を保管
Global Const gb_debug As Boolean = True  'TrueにするとDebug.printを有効にする
'【customUI】
Sub customUI_onLoad(ribbon As IRibbonUI)
  Set gr_ribbon = ribbon ' リボンの表示を更新する目的でリボンオブジェクトをセットする'
  gb_check = False 'onActionではチェックされていない状態で起動されるので初期値はFalse
  gst_combo = "Item 2" 'ロード時に初期値を設定する場合
  gst_edit = "--ここに入力--" '〃
  gst_drop = "itemdd2" '〃
  gb_toggle = True '〃
  gr_ribbon.ActivateTab ("CustomTab") '指定したタブをアクティベイトする
End Sub
Sub customUI_loadImage(imageId As String, ByRef image)
  If gb_debug Then Debug.Print "00=" & "," & imageId & "," & "customUI"
  Select Case imageId
    Case "IMG02":      Set image = LoadPicture(ThisWorkbook.Path & "\IMG02.jpg")
    Case "IMG03":      Set image = LoadPicture(ThisWorkbook.Path & "\IMG03.jpg")
  End Select
End Sub
'【command】
Sub command_getEnabled(control As IRibbonControl, ByRef enabled)
  enabled = True  'デフォルト(セットしない時)はfalse
End Sub
Sub command_onAction(control As IRibbonControl, pressed As Boolean, ByRef cancelDefault)
  If gb_debug Then Debug.Print "0=" & "," & pressed & "," & cancelDefault & control.id
  cancelDefault = False
End Sub
'【control】
'Sub CalculateNow_onAction(control As IRibbonControl) はNG
'【separator】
Sub separator_getVisible(control As IRibbonControl, ByRef visible)
  visible = True
End Sub
'【TabDeveloper】
Sub tabDeveloper_getVisible(control As IRibbonControl, ByRef visible)
  visible = True  'デフォルト(trueをセットしない)はfalse
End Sub
'【CustomGroup1】
Sub customGroup1_getVisible(control As IRibbonControl, ByRef visible)
  visible = True  'デフォルト(trueをセットしない)はfalse
End Sub
'【Buttonct0】
Sub buttonct0_getVisible(control As IRibbonControl, ByRef visible)
  visible = True
End Sub
Sub buttonct0_onAction(control As IRibbonControl)
Dim bwk As Variant
'  checkboxのチェックは人手でしか変更できないので、初期化はできない。
'  gr_ribbon.Invalidate 'リボンキャッシュをクリアーするが、checkboxへの影響が分からないので使用しない
  gst_combo = "Item 2" '初期値に戻す
  gr_ribbon.InvalidateControl ("comboBox")  'キャッシュをクリアーする事でセットした値が反映される。
  gst_edit = "--ここに入力--" '同上
  gr_ribbon.InvalidateControl ("editBox") '同上
  gst_drop = "itemdd2"  '同上
  gr_ribbon.InvalidateControl ("dropDown")  '同上
  gb_toggle = True  '同上
  gr_ribbon.InvalidateControl ("toggleButton")  '同上
End Sub
Sub buttonct0_getImage(control As IRibbonControl, ByRef image)
  Set image = LoadPicture(ThisWorkbook.Path & "\IMG00.jpg")  'pngはNG、Setでオブジェクトとして処理
End Sub
Sub buttonct0_getShowImage(control As IRibbonControl, ByRef showImage)
  If gb_debug Then Debug.Print "1=" & showImage & "," & control.id
  'showImageはデフォルトfalseだが表示されているのでどのように使うか不明
End Sub
'【Buttonct1】
Sub buttonct1_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
Sub buttonct1_getLabel(control As IRibbonControl, ByRef label)
  label = "Custom Button1"
End Sub
Sub buttonct1_getShowLabel(control As IRibbonControl, ByRef showLabel)
  If gb_debug Then Debug.Print "2=" & showLabel & "," & control.id
  'showLabelはデフォルトfalseだが表示されているのでどのように使うか不明
End Sub
Sub buttonct1_getScreentip(control As IRibbonControl, ByRef screentip)
  screentip = "the screentip"
End Sub
Sub buttonct1_getSize(control As IRibbonControl, ByRef size)
  size = RibbonControlSize.RibbonControlSizeLarge  'sizeはlargeではなく列挙値
End Sub
Sub buttonct1_getSupertip(control As IRibbonControl, ByRef screentip)
  screentip = "the supertip string"  'パラメータはscreentipでsupertipではないが変数名でしかないので変えてもOK
End Sub
'【box1】
Sub box1_getVisible(control As IRibbonControl, ByRef visible)
  If gb_debug Then Debug.Print "3=" & visible & "," & control.id
  'visibleはデフォルトfalseだが表示されているのでどのように使うか不明
End Sub
'【Button】
Sub button_onAction(control As IRibbonControl)
  gr_ribbon.InvalidateControl ("checkBox")  'キャッシュをクリアーする事でセットした値が反映される。
  Select Case gb_check
    Case True:    MsgBox "チェック(∨)"
    Case False:    MsgBox "ノーチェック(□)"
  End Select
End Sub
'【checkBox】
'onActionとgetPressedはどちらか。getShowLabelはNG
'getPressedはチェックボックスを連続して更新した場合は2度目はコールバック が応しないのでNG
'Sub checkBox_getPressed(control As IRibbonControl, ByRef returnValue)
'  gb_check = Not (gb_check)
'  returnValue = gb_check  'returnValueに値をセットしないと不整合が起こる場合がある
'End Sub
Sub checkBox_onAction(control As IRibbonControl, pressed As Boolean)
  gb_check = Not (gb_check)
  If gb_debug Then Debug.Print "4=" & pressed & "," & gb_check & "," & control.id
End Sub
'【buttonGroup1】
Sub buttonGroup1_getVisible(control As IRibbonControl, ByRef visible)
  visible = True
End Sub
'【buttongp1】
Sub buttongp1_onAction(control As IRibbonControl)
  ActiveCell.Font.Bold = True
End Sub
'【buttongp2】
Sub buttongp2_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【buttongp3】
Sub buttongp3_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【comboBox】
Sub comboBox_getItemCount(control As IRibbonControl, ByRef count)
  count = 3 '3個のitemを設定
End Sub
Sub comboBox_getItemID(control As IRibbonControl, index As Integer, ByRef id)
  If gb_debug Then Debug.Print "5=" & index & "," & control.id
  Select Case index  'index値は0から
    Case 0:     id = "item1"
    Case 1:     id = "item2"
    Case 2:     id = "item3"
  End Select
End Sub
Sub comboBox_getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
  If gb_debug Then Debug.Print "6=" & index & "," & control.id
  Select Case index
    Case 0:     label = "Item 1"
    Case 1:     label = "Item 2"
    Case 2:     label = "Item 3"
  End Select
End Sub
Sub comboBox_getText(control As IRibbonControl, ByRef text)
  If gb_debug Then Debug.Print "7=" & text & "," & control.id
  text = gst_combo
End Sub
Sub comboBox_onChange(control As IRibbonControl, text As String)
  If gb_debug Then Debug.Print "8=" & gst_combo & "," & text & "," & control.id
  gst_combo = text
End Sub
'【editBox】
Sub editBox_getText(control As IRibbonControl, ByRef text)
  If gb_debug Then Debug.Print "9=" & text & "," & control.id
  text = gst_edit
End Sub
Sub editBox_onChange(control As IRibbonControl, text As String)
  If gb_debug Then Debug.Print "A=" & text & "," & control.id
  gst_edit = text
End Sub
'【dropDown】
'getSelectedItemIDとgetSelectedItemIndexはどちらか
'Sub dropDown_getSelectedItemIndex(control As IRibbonControl, ByRef index)
Sub dropDown_getSelectedItemID(control As IRibbonControl, ByRef index)
  If gb_debug Then Debug.Print "B=" & index & "," & control.id
  index = gst_drop
End Sub
Sub dropDown_onAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
  If gb_debug Then Debug.Print "C=" & selectedId & "," & selectedIndex & "," & control.id
  gst_drop = selectedId
End Sub
'【buttondd】
Sub buttondd_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【menu1】
'Sub menu1_onAction(control As IRibbonControl) はNG
'【buttonmn1】
Sub buttonmn1_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【menuseparator】
Sub menuseparator_getTitle(control As IRibbonControl, ByRef title)
  If gb_debug Then Debug.Print "D=" & title & "," & control.id
  title = "操作方法"
End Sub
'【buttonmn2】
Sub buttonmn2_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【buttonmn3】
Sub buttonmn3_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【toggleButton】
Sub toggleButton_onAction(control As IRibbonControl, pressed As Boolean)
  If gb_debug Then Debug.Print "E=" & pressed & "," & control.id
  gb_toggle = pressed
End Sub
Sub toggleButton_getPressed(control As IRibbonControl, ByRef returnValue)
  If gb_debug Then Debug.Print "F=" & returnValue & "," & control.id
  returnValue = gb_toggle
End Sub
'【buttondb】
Sub buttondb_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【gallery】
'getItemCount(コールバックを設定しないと以下のコールバックは機能しない
Sub gallery_getItemCount(control As IRibbonControl, ByRef count)
  count = 4 '4個のitemを設定
End Sub
Sub gallery_getItemHeight(control As IRibbonControl, ByRef height)
  height = 68
End Sub
Sub gallery_getItemWidth(control As IRibbonControl, ByRef width)
  width = 88
End Sub
Sub gallery_getItemID(control As IRibbonControl, index As Integer, ByRef id)
  Select Case index
    Case 0:     id = "itemgy1"
    Case 1:     id = "itemgy2"
    Case 2:     id = "itemgy3"
    Case 3:     id = "itemgy4"
  End Select
End Sub
Sub gallery_getItemImage(control As IRibbonControl, index As Integer, ByRef image)
  Select Case index
    Case 0:     image = "ActiveXImage"
    Case 1:     image = "ActiveXComboBox"
    Case 2:     image = "ActiveXListBox"
    Case 3:     image = "ActiveXCheckBox"
  End Select
End Sub
Sub gallery_getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
  Select Case index
    Case 0:     label = "ActiveXImage"
    Case 1:     label = "ActiveXComboBox"
    Case 2:     label = "ActiveXListBox"
    Case 3:     label = "ActiveXCheckBox"
  End Select
End Sub
'getItemScreenTipとgetItemSuperTipはNG
Sub gallery_onAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
  Select Case selectedIndex
    Case 0:      MsgBox "[1(" & selectedId & ")]"
    Case 1:      MsgBox "[2(" & selectedId & ")]"
    Case 2:      MsgBox "[3(" & selectedId & ")]"
    Case 3:      MsgBox "[4(" & selectedId & ")]"
  End Select
End Sub
'【labelControl】
Sub labelControl_getLabel(control As IRibbonControl, ByRef label)
  label = "ラベル" & vbCrLf & "コントロール"
End Sub
'【splitButton】
Sub splitButton_getSize(control As IRibbonControl, ByRef size)
  size = RibbonControlSize.RibbonControlSizeRegular  '列挙値
End Sub
'【buttonsp】
Sub buttonsp_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【buttonsp1】
Sub buttonsp1_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
'【buttonsp2】
Sub buttonsp2_onAction(control As IRibbonControl)
  MsgBox "[" & control.id & "]"
End Sub
NoラインNoコントロールid/[idMso]コールバック関数 debug目的
110~18customUIなしonLoad初期値をセットし
“CustomTab”をアクティベイトする
219~25loadImage00動的イメージを読み込む
327~29command[Bold]getEnabledボタンを有効化する
430~33onAction0クリックを受容する
537~39separatorseparatorgetVisibleセパレータを表示させる
641~43tab[TabDeveloper]getVisibleタブを表示させる
745~47groupCustomGroup1getVisibleグループを表示させる
849~51buttonButtonct0getVisibleボタンを表示させる
952~64onAction初期値に戻す機能を実装
“checkBox”は対象外
1065~67getImageイメージをロードする
1168~71getShowImage1[使い方が不明]
1272~75buttonButtonct1onActionMsgBoxを表示する
1376~78getLabelラベル名をセットする
1479~82getShowLabel2[使い方が不明]
1583~85getScreentipScreentipをセットする
1686~88getSizeSizeを列挙型でセットする
1789~91getSupertipSupertipをセットする
1893~96boxbox1getVisible3[使い方が不明]
1998~104buttonbuttononActioncheckBoxの状態を判定する
20112~115checkBoxcheckBoxonAction4値を反転保存する
21117~119buttonGroupbuttonGroup1getVisibleボタングループを表示する
22121~123buttonbuttongp1onActionActiveCellをBoldにする
23125~127buttonbuttongp2onActionNo.12参照
24129~131buttonbuttongp3onAction
25133~135comboBoxcomboBoxgetItemCountitemの数をセットする
26136~143getItemID5idに代入する値をセットする
27144~151getItemLabel6ラベルに代入する値をセットする
28152~155getText7保持された値をセットする
29156~159onChange8入力された値を保持する
30161~164editBoxeditBoxgetText9No.29参照
31165~168onChangeANo.30参照
32172~175dropDowndropDowngetSelectedItemIDB保持された値をセットする
33176~179onActionC選択された値を保持する
34181~183buttonbuttonddonActionNo.12参照
35187~189buttonbuttonmn1onAction
36191~194menuSeparatormenuSeparatorgetTitleDタイトルをセットする
37196~198buttonbuttonmn2onActionNo.12参照
38200~202buttonbuttonmn3onAction
39204~207toggleButtontoggleButtononActionE状態を保持する
40208~211getPressedF保持された状態を反映する
41213~215buttonbuttondbonActionNo.12参照
42218~220gallerygallerygetItemCount表示するアイテム個数をセットする
43221~223getItemHeightアイテムの高さをセットする
44224~226getItemWidthアイテムの幅をセットする
45227~234getItemIDアイテムのidに代入する値をセットする
46235~242getItemImageアイテムのイメージをセットする
47243~250getItemLabelアイテムのラベルに代入する値をセットする
48251~259onAction押されたアイテムのMsgBoxを表示する
49261~263labelControllabelControlgetLabelNo.14を参照
50265~267splitButtonsplitButtongetSizeNo.17を参照
51269~271buttonbuttonsponActionNo.12参照
52273~275buttonbuttonsp1onAction
53277~279buttonbuttonsp2onAction
目的が太字になっているものは、コールバック関数を使用する際に必須ではない機能を実装している事を表します。

まとめ

今回はXML形式でのFulentリボンのコールバック関数について具体的にXMLファイルとVBAのコーディング事例をご紹介しました。

中には使い方が分からないコールバック関数がありましたが、概ね必要になりそうな機能はご紹介できたのではないかと思います…

ただ、第1回の時にまとめた属性一覧とコールバック関数一覧は、今になって思うとあまり意味が無かったように思います。
その理由としては実際に動きを確認して見ると現状では使えない状態になっているものがそれなりの数存在していたためです….


最後に冒頭の章でご紹介した形に必要なフォルダー・ファイルを圧縮してダウンロードできるようにしていますので、ご利用いただければ幸いです。

※アイコンの動的イメージ画像で使用する、❝IMG00.jpg❞・❝IMG02.jpg❞・❝IMG03.jpg❞ファイルを含めています。

  • これらのイメージファイルはVBAのコーディングでは作成したマクロ有効ブック”.xlsm”と同じフォルダーに格納されている事にしています。
    ※実際には次のようにコーディングしています→❝ThisWorkbook.Path & “\IMG00.jpg”❞
圧縮ファイルのダウンロード

圧縮ファイルの内容

これまで3回に渡りXML形式でのFulentリボンの具体的な使い方をご説明をしてきましたが、今回が最後になります。

以上最後までご一読いただき誠にありがとうございました。