RibbonXを使う(後日談)

この件、あまり誤解があってもいけないので後日談を書いておきます.このVBA路線、実はうまく行きませんでした.従来マクロを使うときには、WordMLはXMLファイルですから、レジストリを変えてXMLに対してコンテキストメニューを出すようにしていました.例えば次のようなコマンドをメニューに対して割り付けていました.
"C:\Program Files\Microsoft Office2010\Office14\WINWORD.EXE -lC:\Program Files\TestAddin\Test
Addin.dotm %1"
 
-lスイッチはアドインの指定です.マクロも指定できます.%1はコンテキストメニューを表示したXMLファイルのパスに置き換えられます.こうするとXMLファイルにだけそのマクロを適用してWordを動かすことができます.Wordのコマンドラインスイッチは以下のURLで解説されています.
 
 
で、なぜうまく行かなかったかといいますと、リボンのメニューのダイナミックな変更です.まず業務的な要求として、作成したい文書が2種類ありそれぞれ性格が違うため、表示するメニューやボタンを変えたいというものがありました.Word2003だとツールバーのON/OFFがダイナミックにできたので簡単でしたが、リボンの場合はちょっとやっかいです.例えばlimitationというボタンがあったとします.
 
<button id="btnMenuLimitation" label="Limitation"
        image="Limitation" keytip="L"
        screentip="Limitation" getSupertip="moduleRibbon.GetSuperTipLimitation"
        getVisible="moduleRibbon.GetVisibleLimitation"
        onAction="moduleRibbon.Limitation"/>
 
などと書きます.getVisibleがコールバックになっていて、
 
Public Sub GetVisibleLimitation(control As IRibbonControl, ByRef visible)
    If (条件)Then
        visible = True
    Else
        visible = False
    End If
End Sub
 
と記述してやります.で、コールバックが呼び出される契機は、リボンのインスタンスに対して
 
  moduleGlobals.irRibbonUI.Invalidate
 
という呼び出しを行います.すこしツールバーとは流儀が違って厄介なのです.
(moduleGlobals.irRibbonUIは、リボンのロード時にインスタンスを保存します.次のようなコードです.)
Sub RibbonInitialize(Ribbon As IRibbonUI)
    Set moduleGlobals.irRibbonUI = Ribbon
End Sub
 
このリボンの動的な変更は、.dotmファイルを直接操作するときにはきわめてうまく動いていました.ところが先ほど述べたコマンドラインで-lパラメータを指定する方法だと何故かまったく動いてくれません.Word2010の問題かもしれませんがこれは致命傷でした.リボンの動的変更ができないのではお客様にマクロを使ってもらうわけにはいきません.
というわけで、急遽Word2010+Visual Studio 2010のVSTO+VBに乗り換えてプロトタイプを作り直しました.せっかくなので、VS2010でやったときの注意点を少しだけ書いておきます.いったんリボンができていれば移行はそれほど難しくはありません.
ちょっと古いですが以下のURLが参考になります.
 
 
1.リボンを使うためには?
Visual Studio 2010で、Word2010のアドインを作成します.そしてソリューションエクスプローラからアドインプロジェクトを選択してコンテキストメニューで、追加(D)-新しい項目(W)を呼び出します.新しい項目の追加ダイアログが出ますので、「リボン(XML)」を選択します.これでデフォルトの名前では、Ribbon1.vbとRibbon1.xmlがプロジェクトに追加されます.
 
イメージ 1

画像は新しい項目のダイアログ、ちゃんとリボンがあります.
 
2.リボンXML
Ribbon1.xmlを開いて、従来作った.dotmのリボンXMLをそのままコピー/ペーストしてしまいます.(あとから変更が必要ですが)
 
3.コードのカスタマイズ
(1) アドインクラスへのリボン生成オーバーライドメソッドの追加
自動生成されたRibbon1.vbには次のようなコメントがあります.
'1. 次のコード ブロックを ThisAddin、ThisWorkbook、または ThisDocument の
'いずれかのクラスにコピーします。
そのままコピーします、ThisAddin.vbは次のようになります.
Public Class ThisAddIn
    Private Sub ThisAddIn_Startup() Handles Me.Startup
    End Sub
    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
    End Sub
    Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
        Return New Ribbon1()
    End Function
End Class
 
(2) リボンXMLから呼び出すコードの変更
VBAの場合とVS2010 VBの場合では、コールバックのプロトタイプが違います.例えばスーパーチップの取得はVBAだと
 
Sub GetSuperTipClear(control As IRibbonControl, ByRef supertip)
    If (Wordの言語="日本語") Then
        supertip = "文字/段落スタイルを初期化します."
    Else
        supertip = "Initialize the character/paragraph style"
    End If
End Sub
 
なのですが、VS2010 VBの場合は、
 
Function GetSuperTipClear(ByVal control As Office.IRibbonControl) As String
    If (Wordの言語="日本語") Then
        GetSuperTipClear = "文字/段落スタイルを初期化します."
    Else
        GetSuperTipClear = "Initialize the character/paragraph style"
    End If
End Function
 
です.これらのプロトタイプは以下のURLに書いてあります.
 
 
4.アイコン
.dotmの場合は、リボンエディタでアイコンファイルを放り込んでやればそれで済みましたがVS 2010だとそう簡単にはゆきません.まずプロジェクトに例えば"icon"というフォルダを作って、追加-既存の項目であらかじめ作っておいたアイコンファイルを登録します.VS2010の解説だとこのようなリソースは参照で処理するのが普通と書いてありましたが、それではうまくいきませんでしたので、プロジェクトのアイコンファイルを選択してプロパティを表示し、ビルドアクションを「埋め込まれたリソース」に変更します.そして、次のような属性をリボンXMLのルートにつけてやります.
 
(続く)