customUI用XML


アドイン要素

ドキュメント.探すと2007年のページに飛ばされる.これがもとになってるのかも.
https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/aa338202(v=office.12)(2022年9月)

これ以降は,customUI.xmlに記載していく要素についての説明.
<!--ここにボタン等の・・・ -->のところ.

参考になりそうなサイト
トグル,チェックボックス,独自アイコンを扱ってる.
https://officeforest.org/wp/2018/05/13/excel%E3%81%A8access%E3%81%AB%E7%8B%AC%E8%87%AA%E3%81%AE%E3%83%AA%E3%83%9C%E3%83%B3%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/#i-5

どの属性を設定できるかは,各タグによる.
これがわかりやすそう.
https://bettersolutions.com/vba/ribbon/button.htm

各要素についてドキュメント.
https://learn.microsoft.com/en-us/openspecs/office_standards/ms-customui/d842006e-3187-4f66-a17d-0819a3cc94b5


例:マクロを実行するボタン

まず,どんな様子で動くのかを書いておく.
CropImgsというプロシージャ名のマクロを自作した場合,次のコードを書けばでボタンを押すとそれが実行されるようになる.

<button id="button" label="Apply Crop Size" imageMso="AppointmentColor1" onAction="CropImgs" />

アドインに関するエラーは,環境設定 -> 一般 -> アドインユーザインターフェースに関するエラーを表示する にて設定可能.
idはマクロで条件分岐に使える(だけ??他の用途はわからん).idは一意でないとエラー.
labelはボタンの横に表示される文字.
imageMsoはボタンの種類.この場合は赤い四角.
onActionにプロシージャ名を渡す.

onAction属性は必須.ないとボタンが表示されない.存在しない関数でもok.
<box>にlabel属性があるとタブが表示されない.

例2:太字切り替え

<toggleButton idMso="Bold"/>

リボンにあるものなら,そのコマンドのidMsoを指定すれば良い.



ラベル

改行させるには"&#xD".

label="aaaa&#xD;bbbb"

自動的に改行してくれるので,なくてもいいかも.
狭いところだと表示されなくなる場合もある.


アイコン

アイコンを検索しやすいサイトがあった.
https://ymrt.jp/imagemso/index.html(2022年9月)
アイコンのドキュメントはどこにあるのか.

imageMSO:(名前だけ画像なし)
https://learn.microsoft.com/ja-jp/openspecs/office_standards/ms-customui/fe2124a1-5aaa-4adf-b285-5d58da9d5e2a

imageMsoを省略した場合,labelの文字のみがボタンに表示される.labelもなかったら何も表示されない.


カーソルを当てた時に表示させるやつ

screentip="カーソルが置かれてます!"



onAction

マクロで引数を扱える.

Sub Func(control As IRibbonControl)
  control.Id
  control.tag
End Sub

Id, tagはXML要素の属性.



起動時にマクロを呼び出す

https://learn.microsoft.com/en-us/openspecs/office_standards/ms-customui/8a27e852-3f8b-424a-ac67-32c58181e9d3

customUIタグで呼び出すマクロ関数名をonLoard属性に指定する。

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






タグ

まとめる1 (縦線入る)group

groupごと分けるとgroupの間に縦線が入る.

<group id="customGroup1" label="Shapes and Pictures">
  <box id="box1">
      <button id="button1" label="Get Crop Size" imageMso="PicturePropertiesSize" onAction="GetIimgCropSize" />
  </box>
</group>
<!-- ここに縦の境界が入ります -->
<group id="customGroup1" label="Shapes and Pictures">
  <box id="box1">
      <button id="button1" label="Get Crop Size" imageMso="PicturesCompress" onAction="GetIimgCropSize" />
  </box>
</group>

<tag>は<group>しか持てない.
何をタブに追加するにせよ<group>に入れましょう.

まとめる2 box

 <box id="box" boxStyle="horizontal">
   <button id="button1" label="Button 1" imageMso="HappyFace" />
   <button id="button2" label="Button 2" imageMso="HappyFace" />
 </box>

boxStyle

"horizontal", "vertical"
vertical使えないかも?EditBoxで使ったら横に並んでしまう.
あんまり使う必要性感じられない.

group, box



ボタン1

<button id="button" label="Button" imageMso="HappyFace" />


ON/OFFトグルボタン

<toggleButton id="toggleButton" imageMso="AppointmentColor3" onAction="Action" getPressed="GetStatus" />

onActoin:

ボタンを押すたびに呼ばれる.

Sub Action(control As IRibbonControl, tgl As Boolean)
    MsgBox tgl
    ' onの状態にした場合True
    ' offの状態にした場合Falseが渡される
End Sub


getPressed:

押されている状態か.初期化した時に呼ばれる.

 Sub GetConfidential(control As IRibbonControl, tgl)
    tgl = True
 End Sub



チェックボックス

<checkBox id="checkBox" label="CheckBox" />

getImage:

GetImage(control As IRibbonControl, ByRef image)

imageに,imageMSOの文字列あるいはLoadPictureで読み込ませる

文字入力BOX

<editBox id="EditBox" getText="MyTextMacro" label="My EditBox" onChange="MyEditBoxMacro"/>

sizeString属性は,editBoxの入力部分の幅.リボンの占有する範囲はほぼ変わらない.ラベルの文字数減らした方が多分小さくなる.
sizeString="WWWWW"は5文字のWの幅です。文字により幅は変わりますので、英字の場合は文字の幅が広いWかMが良いでしょう。

getText:

入力する文字.初期値もこれで設定できる.
初期化時(タブを切り替える時,IRibbonUI.Invaliidate呼び出し時 etc.)に呼ばれるみたい.

getText(control As IRibbonControl, ByRef text)

ByRef text As Stringとすると、マクロがありませんエラーなので注意。

showLabel

これかgetShowLabelを指定しないならlabeを指定するべき.
labelなし,これも無しだと余白をかなり取られる.

onChange:

変更があった時に実行されるマクロを指定する.
テキストを受け取るやつの場合,次のように設定できる.

Public Sub MyEditBoxMacro(ByRef control As IRibbonControl, ByRef text As String)
    MsgBox text
End Sub


メニュー(ボタンのツリー構造作れる)

<menu id="menu1" label="データの&#xD;エクスポート" itemSize="large" imageMso="ExportExcel" size="large">
  <button id="button1" label="opt1" imageMso="AppointmentColor3" onAction="ho" />
  <button id="button2" label="opt2" imageMso="AppointmentColor3" onAction="ge" />
  <menuSeparator id="menuSeparator2" titl
e="〜〜横線を入ります〜〜" />
  <menu id="menu2" label="メニューinメニュー" itemSize="large" imageMso="AppintmentColor1">
      <button id="button3" label="opt3" imageMso="AppointmentColor1" onAction="hoge" />
  </menu>
</menu>



ドロップダウン 一つ選ぶやつ

<dropDown id="dropDown" label="DropDown">
  <item id="item1" label="Item 1" />
  <item id="item2" label="Item 2" />
  <item id="item3" label="Item 3" />
  <button id="button" label="Button..." />
</dropDown>


getSelectedItemIndex:

どれを選択させるか.要素インデックスで指定ver,.初期値はこれかElemID ver.でやる.

GetSelectedItemIndex(control As IRibbonControl, ByRef index)


getSelectedItemID:

どれを選択させるか.要素IDで指定ver,.初期値はこれかIndex ver.でやる.

GetDropDownScalebar(control As IRibbonControl, ByRef Elemid)


onAction:

選択時に呼び出す関数.
onAction(control As IRibbonControl, itemID As String, index As Integer)
なお,indexは0始まり.


ボタンとメニューの組み合わせ SplitButton

 <splitButton id="splitButton" size="large" >
  <button id="button" imageMso="HappyFace" label="Split Button" />
  <menu id="menu">
   <button id="button1" label="Button 1" />
   <button id="button2" label="Button 2" />
  </menu>
 </splitButton>




各種コマンドに反応する??

 <commands>
   <command idMso="Bold" enabled="false" />
   <command idMso="Paste" onAction="MyPasteFunction" />
 </commands>



属性

keytip

3文字以内?

z2連続はできない。
2回目のzを押した時点で戻る操作になる。

xzsができない。
sを押した時点で戻る操作になる。

すでにある機能 idMso

idMsoを指定すると、すでにオフィスにある機能を使用することができる。(最前に配置するとか)
idMsoに合った正しいタグを使用する必要があると思う。
idMsoはクイックアクセスツールバーの設定画面で、それぞれの項目にマウスをホバーすると表示される。(Macは無理?)
公式でリストが公開されているけど、古いものでこれがすべてではない。



アイコン

アイコン非表示

showImage="false"


アイコン設定

アイコンは以下のいずれかの属性で設定する。
getImage, image, imageMso
getImageの詳細は不明。
iamgeは自作アイコンを設定できる。設定方法の詳細後述。
imageMsoはオフィスで用意しているアイコンを設定できる。idMsoと同じ値を指定すれば、そのidMsoのアイコンが表示される。

自作アイコンの設定方法

自作アイコンを設定するのは以下のように行う。

1. customUI/_relsディレクトリを作成する。
ディレクトリに"customUI.xml.rels"ファイルを作成する。
中身は次のように記述する。

<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="images/SmartArtSmallerShape.bmp" Id="SmartArtSmallerShape"/>
</Relationships>


2. customUI/iamgesディレクトリを作成する。
ここに自作アイコンを配置する。サイズは64x64で十分な気がする。

3. customUI/customUI.xmlの該当場所にimage属性を追記する。
image="アイコン名(拡張子なし)"を設定する。