この件、あまり誤解があってもいけないので後日談を書いておきます.この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"/>
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
If (条件)Then
visible = True
Else
visible = False
End If
End Sub
と記述してやります.で、コールバックが呼び出される契機は、リボンのインスタンスに対して
moduleGlobals.irRibbonUI.Invalidate
という呼び出しを行います.すこしツールバーとは流儀が違って厄介なのです.
(moduleGlobals.irRibbonUIは、リボンのロード時にインスタンスを保存します.次のようなコードです.)
このリボンの動的な変更は、.dotmファイルを直接操作するときにはきわめてうまく動いていました.ところが先ほど述べたコマンドラインで-lパラメータを指定する方法だと何故かまったく動いてくれません.Word2010の問題かもしれませんがこれは致命傷でした.リボンの動的変更ができないのではお客様にマクロを使ってもらうわけにはいきません.
というわけで、急遽Word2010+Visual Studio 2010のVSTO+VBに乗り換えてプロトタイプを作り直しました.せっかくなので、VS2010でやったときの注意点を少しだけ書いておきます.いったんリボンができていれば移行はそれほど難しくはありません.
ちょっと古いですが以下のURLが参考になります.
1.リボンを使うためには?
Visual Studio 2010で、Word2010のアドインを作成します.そしてソリューションエクスプローラからアドインプロジェクトを選択してコンテキストメニューで、追加(D)-新しい項目(W)を呼び出します.新しい項目の追加ダイアログが出ますので、「リボン(XML)」を選択します.これでデフォルトの名前では、Ribbon1.vbとRibbon1.xmlがプロジェクトに追加されます.
Visual Studio 2010で、Word2010のアドインを作成します.そしてソリューションエクスプローラからアドインプロジェクトを選択してコンテキストメニューで、追加(D)-新しい項目(W)を呼び出します.新しい項目の追加ダイアログが出ますので、「リボン(XML)」を選択します.これでデフォルトの名前では、Ribbon1.vbとRibbon1.xmlがプロジェクトに追加されます.
画像は新しい項目のダイアログ、ちゃんとリボンがあります.
'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
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
Sub GetSuperTipClear(control As IRibbonControl, ByRef supertip)
If (Wordの言語="日本語") Then
supertip = "文字/段落スタイルを初期化します."
Else
supertip = "Initialize the character/paragraph style"
End If
End Sub
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
If (Wordの言語="日本語") Then
GetSuperTipClear = "文字/段落スタイルを初期化します."
Else
GetSuperTipClear = "Initialize the character/paragraph style"
End If
End Function
です.これらのプロトタイプは以下のURLに書いてあります.
4.アイコン
.dotmの場合は、リボンエディタでアイコンファイルを放り込んでやればそれで済みましたがVS 2010だとそう簡単にはゆきません.まずプロジェクトに例えば"icon"というフォルダを作って、追加-既存の項目であらかじめ作っておいたアイコンファイルを登録します.VS2010の解説だとこのようなリソースは参照で処理するのが普通と書いてありましたが、それではうまくいきませんでしたので、プロジェクトのアイコンファイルを選択してプロパティを表示し、ビルドアクションを「埋め込まれたリソース」に変更します.そして、次のような属性をリボンXMLのルートにつけてやります.
.dotmの場合は、リボンエディタでアイコンファイルを放り込んでやればそれで済みましたがVS 2010だとそう簡単にはゆきません.まずプロジェクトに例えば"icon"というフォルダを作って、追加-既存の項目であらかじめ作っておいたアイコンファイルを登録します.VS2010の解説だとこのようなリソースは参照で処理するのが普通と書いてありましたが、それではうまくいきませんでしたので、プロジェクトのアイコンファイルを選択してプロパティを表示し、ビルドアクションを「埋め込まれたリソース」に変更します.そして、次のような属性をリボンXMLのルートにつけてやります.
(続く)