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

[Office用アプリ]開発ツール「Napa」のインストール方法前のページ

[Office用アプリ]日本語版Office ストアからアプリを追加できるようになりました。次のページ

関連記事

  1. Office関連

    Visio Onlineの機能をJavaScriptで拡張する方法

    @mokudaiさんからのバトンを引き継ぎまして、「Office 36…

  2. Excel

    RESAS-APIをVBAから呼び出す方法

    下記記事の通り「地域経済分析システム RESAS」のAPIが公開された…

  3. アイコン一覧

    Office 2013 アイコン一覧(A)

    ・Office 2013 アイコン一覧 NUM…

  4. Office アドイン

    Office 365でVisio JavaScript APIsを試してみました。

    昨年末にVisio Onlineの機能をJavaScriptで拡張する…

  5. Office関連

    類似した書式の文字列を選択するWordマクロ三種

    Wordには、選択中の文字列と似た書式の文字列を一括選択する「類似した…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP