Office関連

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

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

リボン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. Office関連

    [Word VBA]引数の型がVariantになっているのはなぜ?

    インストラクターのネタ帳でお馴染みの伊藤さんが先日下記の記事をアップさ…

  2. Office アドイン

    Office 2016で進化したOffice アドイン

    今日OfficeDevを眺めていて気が付いたのが「OfficeJS S…

  3. Excel

    Excelを別インスタンスで起動する方法

    「Excel 別インスタンス 起動」といったキーワード検索でのアクセス…

  4. Office関連

    YouTube動画挿入アドイン for PowerPoint

    前回の記事でPowerPoint 2013でYouTubeの動画が挿入…

  5. アイコン一覧

    Office 2013 アイコン一覧(G)

    ・Office 2013 アイコン一覧 NUM…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP