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. Excel

    ExcelとPowerPointに自動保存機能が追加されました。

    Excel 2016を使っていて、ふと気が付いたのが画面左上にある「自…

  2. Office関連

    「NetOffice」で簡単に.NETからOfficeを操作

    ネットで「NetOffice」なるツールがあることを知ったので、早速試…

  3. Office関連

    目次を更新するWordマクロ

    文書の目次を更新するにはTableOfContentsオブジェクトのU…

  4. Office関連

    Windows 10 Technical PreviewにOffice XPをインストールしてみまし…

    「最新ビルドを詳細レビュー! Windows 10 Technical…

  5. Excel

    起動中のMicrosoft EdgeからタイトルとURLを取得するVBAマクロ(UI Automat…

    当ブログでは、Microsoft Edgeを外部から操作するプログラム…

  6. Excel

    RSSの日付を変換するVBAマクロ

    RSSから取得した日付(「Wed, 20 Dec 2017 00:02…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP