今回はリボンをカスタマイズして、ファイルを開いたユーザー名によって表示するメニューを切り替える方法を紹介します。
リボンXML:
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="tabSample" label="Sample Tab"> <group id="grpSample" label="Sample Group"> <menu id="mnuSampleA" label="Menu A" imageMso="A" size="large" itemSize="large" getVisible="mnuSample_getVisible" tag="GroupA"> <button id="btnSample1" label="Button 1" imageMso="Spade" /> <button id="btnSample2" label="Button 2" imageMso="Spade" /> <button id="btnSample3" label="Button 3" imageMso="Spade" /> </menu> <menu id="mnuSampleB" label="Menu B" imageMso="B" size="large" itemSize="large" getVisible="mnuSample_getVisible" tag="GroupB"> <button id="btnSample4" label="Button 4" imageMso="Heart" /> <button id="btnSample5" label="Button 5" imageMso="Heart" /> <button id="btnSample6" label="Button 6" imageMso="Heart" /> </menu> <menu id="mnuSampleC" label="Menu C" imageMso="C" size="large" itemSize="large" getVisible="mnuSample_getVisible" tag="GroupC"> <button id="btnSample7" label="Button 7" imageMso="Club" /> <button id="btnSample8" label="Button 8" imageMso="Club" /> <button id="btnSample9" label="Button 9" imageMso="Club" /> </menu> </group> </tab> </tabs> </ribbon> </customUI>
VBAコード:
Option Explicit Public Sub mnuSample_getVisible(control As IRibbonControl, ByRef returnedVal) Dim grpName As String 'ユーザー名からグループ名を取得 Select Case VBA.Environ$("USERNAME") Case "Admin": grpName = "GroupA" Case "User": grpName = "GroupB" Case Else: grpName = "GroupC" End Select 'tag属性に記載したグループ名により表示するメニューを判別 Select Case control.Tag Case grpName: returnedVal = True Case Else: returnedVal = False End Select End Sub
上記コードを設定したファイルを開くと、下図のようにユーザー名が「Admin」のときは「Menu A」が、ユーザー名が「User」のときは「Menu B」が、ユーザー名がそれ以外の時は「Menu C」が表示されます。
上記コードでは、getVisible属性で動的に表示を切り替えられるようにしておき、ユーザー名に応じて振り分けたグループ名(適当に設定)によって、表示するメニューを判別する仕組みにしています。
上記ではmenu要素にgetVisible属性を設定しましたが、menu要素に限らずtabやbutton等の要素でも同様の処理が可能です。
また、下記のように外部(テキストファイルやCSVファイル、データベース等、下記の場合はXMLファイル)からユーザーの情報を読み込むようにしておけば、制御するユーザーを追加する場合でも外部のファイルやデータベースを変更するだけで対応できるようになります。
users.xml(ドキュメントと同じ場所に保存):
<?xml version="1.0" encoding="utf-8"?> <users> <user name="Admin" group="GroupA" /> <user name="User" group="GroupB" /> <user name="Kinuasa" group="GroupC" /> </users>
VBAコード(Word):
Option Explicit Public Sub mnuSample_getVisible(control As IRibbonControl, ByRef returnedVal) Dim grpName As String Dim usrName As String Dim CfgFilePath As String Dim n As Object Const CfgFileName As String = "users.xml" grpName = "": Set n = Nothing '初期化 usrName = VBA.Environ$("USERNAME") '外部のファイルからグループ名を取得 CfgFilePath = ThisDocument.Path & Application.PathSeparator & CfgFileName On Error Resume Next If Len(Trim$(Dir$(CfgFilePath))) > 0 Then With CreateObject("Msxml2.DOMDocument") .async = False If .Load(CfgFilePath) Then Set n = .SelectSingleNode("/users/user[@name='" & usrName & "']") If Not n Is Nothing Then grpName = n.Attributes(1).NodeValue End If End If End With End If On Error GoTo 0 'tag属性に記載したグループ名により表示するメニューを判別 Select Case control.Tag Case grpName: returnedVal = True Case Else: returnedVal = False End Select End Sub
上記のようにgetVisible属性で表示・非表示を切り替えるだけでなく、動的にXMLを切り替えたい場合には、下記ページで紹介しているようにdynamicMenu要素のgetContent属性を使うことをお薦めします。
・外部のXMLファイルを読み込み、ユーザー名に応じてmenu内容を変更する
//www.ka-net.org/blog/?p=196
・menu内にあるbuttonの数を増やす
//www.ka-net.org/blog/?p=207
・リボンからプリンタを選択して簡単に印刷できるようにする(Word)
//www.ka-net.org/blog/?p=234
・メニューの内容を動的に変更する
//www.ka-net.org/ribbon/ri70.html
この記事へのコメントはありません。