今回はリボンをカスタマイズして、ファイルを開いたユーザー名によって表示するメニューを切り替える方法を紹介します。
リボン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



















この記事へのコメントはありません。