リボン関連

[リボン・カスタマイズ]ユーザー名により表示するメニューを切り替える。

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

リボン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」が表示されます。

mnu_getVisible_01

上記コードでは、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

コメント

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

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP