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関連

    [Office 365 Solo]テクニカル サポートってどんなもの?

    前々回の記事に引き続いて、Office 365 Soloの疑問点第三弾…

  2. Office関連

    選択範囲内で文字列検索を行うWordマクロ

    今日は選択範囲内で文字列検索を行うWordマクロについて考えてみます。…

  3. Office関連

    [Office VBA]ADOでSharePointリストに接続する方法

    先日Twitterで @blacklist_ryu さんが下記ツイート…

  4. Office アドイン

    [Office用アプリ]TechEd North America 2013のセッション資料

    アメリカ・ニューオリンズで現地時間6月3日から6日にかけて開催された開…

  5. Office関連

    ユーザー設定フォームに基づいてメールを作成するOutlookマクロ

    Outlookには「ユーザー設定フォーム」(Custom Forms)…

  6. Office関連

    GetSpellingSuggestionsメソッドで文法上の誤りの修正候補は取得できない?

    前回と前々回の記事でスペルチェック、文章校正に関するWordマクロを扱…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP