Office関連

[リボン・カスタマイズ]グループの表示・非表示をユーザーフォームのチェックボックスで切り替える。

先日書いた記事に下記コメントをいただきました。

複数の「グループ」の表示/非表示をリボンからではなく、アドインのユーザフォームのコントロール(チェックボックス等)から行う方法をご教示下さい。これによりExcelクローズ時の状態をファイル等に保存しておいて次回のExcel起動時のデフォルトにしたいと思っています。

シートに設定値を保存するのは現在のアプリに実装ずみなのでOKです。
問題はユーザフォーム上のチェックボックスによってトグルで特定のグループの表示/非表示を動的に切り替えたいです。そのときのInvalidateControl周りの記述方法が分かりません。

UIのonLoadでPublic変数のリボンをセットしたあとに、チェックボックスの記述はどうなるのでしょうか?お手数ですがご教示頂けますと幸いです

グループの表示・非表示をユーザーフォーム上のチェックボックスで切り替え、その表示状態をどこかに記録しておきたい、というものです。

この場合、使用するのはもちろん、group要素のgetVisible属性です。

問題なのは、表示・非表示を設定するコールバック関数の第二引数をどうやって設定するかですが、今回はシートに設定値を保存するということなので、下記のように設定保存用のシートから読み取ることにします。

下準備

設定保存用のシート(シート名:設定)を作成し、下図のようにセルB1~B3(3つのグループの表示状態を制御するとして)にグループの表示状態の初期値を入力します。

リボンXML

<?xml version="1.0" encoding="utf-8"?>
<customUI onLoad="rbnSample_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab id="tabSample" label="Sample Tab">
        <group id="grpSample1" label="Group 1" getVisible="grpSample_getVisible">
          <button id="btnDummy1" label="Button 1" imageMso="HappyFace" size="large" />
          <button id="btnDummy2" label="Button 2" imageMso="HappyFace" size="large" />
          <button id="btnDummy3" label="Button 3" imageMso="HappyFace" size="large" />
          <button id="btnDummy4" label="Button 4" imageMso="HappyFace" size="large" />
        </group>
        <group id="grpSample2" label="Group 2" getVisible="grpSample_getVisible">
          <button id="btnDummy5" label="Button 1" imageMso="SadFace" size="large" />
          <button id="btnDummy6" label="Button 2" imageMso="SadFace" size="large" />
          <button id="btnDummy7" label="Button 3" imageMso="SadFace" size="large" />
          <button id="btnDummy8" label="Button 4" imageMso="SadFace" size="large" />
        </group>
        <group id="grpSample3" label="Group 3" getVisible="grpSample_getVisible">
          <button id="btnDummy9" label="Button 1" imageMso="HappyFace" size="large" />
          <button id="btnDummy10" label="Button 2" imageMso="HappyFace" size="large" />
          <button id="btnDummy11" label="Button 3" imageMso="HappyFace" size="large" />
          <button id="btnDummy12" label="Button 4" imageMso="HappyFace" size="large" />
        </group>
        <group id="grpSample4" label="Group 4">
          <button id="btnSample" label="フォーム表示" imageMso="HappyFace" size="large" onAction="btnSample_onAction" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

標準モジュール

'標準モジュール
Option Explicit

Public myRibbon As Office.IRibbonUI

Public Sub rbnSample_onLoad(ribbon As IRibbonUI)
  Set myRibbon = ribbon
End Sub

Public Sub grpSample_getVisible(control As IRibbonControl, ByRef returnedVal)
  Dim sh As Excel.Worksheet
  
  Set sh = ThisWorkbook.Worksheets("設定")
  Select Case control.ID
    Case "grpSample1": returnedVal = sh.Range("B1").Value
    Case "grpSample2": returnedVal = sh.Range("B2").Value
    Case "grpSample3": returnedVal = sh.Range("B3").Value
  End Select
End Sub

Public Sub btnSample_onAction(control As IRibbonControl)
  UserForm1.Show False
End Sub

ユーザーフォーム(UserForm1)

'UserForm
Option Explicit

Private configSheet As Excel.Worksheet

Private Sub CheckBox1_Change()
  configSheet.Range("B1").Value = Me.CheckBox1.Value
  myRibbon.InvalidateControl "grpSample1"
End Sub

Private Sub CheckBox2_Change()
  configSheet.Range("B2").Value = Me.CheckBox2.Value
  myRibbon.InvalidateControl "grpSample2"
End Sub

Private Sub CheckBox3_Change()
  configSheet.Range("B3").Value = Me.CheckBox3.Value
  myRibbon.InvalidateControl "grpSample3"
End Sub

Private Sub UserForm_Initialize()
  Set configSheet = ThisWorkbook.Worksheets("設定")
  Me.CheckBox1.Value = configSheet.Range("B1").Value
  Me.CheckBox2.Value = configSheet.Range("B2").Value
  Me.CheckBox3.Value = configSheet.Range("B3").Value
End Sub

ポイントは下記4点です。

  1. IRibbonUIオブジェクトの変数(myRibbon)をPublicにする。
  2. getVisible属性のコールバックを一つにまとめる場合は、第一引数であるIRibbonControlオブジェクトのIDプロパティで処理を分ける。
  3. group要素の表示状態を、設定用のシートから読み取るようにする。
  4. チェックボックスのイベントで、チェックボックスの値を設定用シートの値と連動させ、InvalidateControlメソッドによって表示・非表示を切り替える。

今回は簡単なサンプルなので処理が冗長なままですが、下記thom氏のブログ記事のような方法を使えば、よりシンプルに設定用シートから値を読み出せるようになります。

また、制御したい要素が多い場合には、クラスを利用して処理をまとめた方がコードもすっきりするでしょう。

関連記事

  1. Office関連

    [リボン・カスタマイズ]アクティブシートにより表示するグループを切り替える。

    Excelで、選択しているシートによって表示するグループを切り替えたい…

  2. Office関連

    既存の機能の代わりにマクロを実行する方法をまとめてみました。

    「既存の機能の代わりにマクロを実行する」の関連になりますが、Offic…

  3. アイコン一覧

    Office 365アイコン(imageMso)一覧(S)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  4. Office アドイン

    [Office用アプリ]Apps for Office サミット!で登壇しました。

    21日(土)に開催されたOffice 用アプリの勉強会「Apps fo…

  5. Office関連

    ページ番号を取得するWordマクロ

    Wordマクロで選択位置のページ番号を取得する場合、簡単なのはSele…

コメント

  • コメント (1)

  • トラックバックは利用できません。

  1. きぬあさ様

    早速やってみました。
    無事にやりたいことができました。
    ユーザフォームのチェックボックスの変化をリアルタイムにリボンに反映させるには
    ユーザフォームのShowModal=FalseにしたらOKになりました。

    ありがとうございます♪
    またよろしくお願い致します。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP