2014/02/22

リボンメニューでトグルボタンをラジオボタンのように VBA で制御する方法


リボンメニューには、残念ながらラジオボタンがありません。

その代替手段として、トグルボタンをラジオボタンのように1つしか選択できないように VBA で制御する方法をご紹介します。

なお、動作検証は、Excel 2010 で行っています。

まず、リボンメニューの定義をします。リボンメニューの定義方法は以下の記事を参考にしてください。

リボンメニューの定義は以下のようになります。

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="customUI_onLoad">
<ribbon startFromScratch="false">
  <tabs>
   <tab id="customTab" label="サンプル">
    <group id="grp1" label="グループ">
     <toggleButton id="tgl1" getPressed="toggleButton_getPressed" onAction="toggleButton_onAction" label="選択肢1"/>
     <toggleButton id="tgl2" getPressed="toggleButton_getPressed" onAction="toggleButton_onAction" label="選択肢2"/>
     <toggleButton id="tgl3" getPressed="toggleButton_getPressed" onAction="toggleButton_onAction" label="選択肢3"/>

    </group>
   </tab>
  </tabs>
</ribbon>
</customUI>

ポイントは、customUI 要素の onLoad 属性を設定して関数をコールバックしているところです。これにより、VBA がリボンメニューにアクセスする参照を取得できるようになります。

VBA のコードは以下のようになります。

コードでは、リボンインターフェースの Invalidate を呼び出していることで、リボンメニューを再描画しているところがポイントです。

'トグルボタンの値を格納する変数
Dim toggleButton1 As Boolean
Dim toggleButton2 As Boolean
Dim toggleButton3 As Boolean

'リボンメニューの参照
Dim ribbonUI As IRibbonUI

'起動時処理
Sub Auto_Open()
'デフォルト値設定
toggleButton1 = True
toggleButton2 = False
toggleButton3 = False
End Sub

'リボンメニュー読み込み時処理
Sub customUI_onLoad(ribbon As IRibbonUI)
  'リボンメニューへの参照を取得
  Set ribbonUI = ribbon
End Sub

'トグルボタン値を設定
Sub toggleButton_getPressed(control As IRibbonControl, ByRef returnValue)
  Select Case control.id
    Case "tgl1"
      returnValue = toggleButton1
    Case "tgl2"
      returnValue = toggleButton2

    Case "tgl3"
      returnValue = toggleButton3
  End Select
End Sub

'トグルボタンの変更内容を保存
Sub toggleButton_onAction(control As IRibbonControl, pressed As Boolean)
  Select Case control.id
    Case "tgl1"
      toggleButton1 = pressed
      If toggleButton1 = True Then
        toggleButton2 = False
        toggleButton3 = False
      End If
    Case "tgl2"
      toggleButton2 = pressed
      If toggleButton2 = True Then
        toggleButton1 = False
        toggleButton3 = False
      End If
    Case "tgl3"
      toggleButton3 = pressed
      If toggleButton3 = True Then
        toggleButton1 = False
        toggleButton2 = False
      End If
  End Select
  'リボンメニュー再描画
  ribbonUI.Invalidate
End Sub

Excel 2010 の画面は以下のようになります。1つの選択肢を選択すると、他の選択が外れるようになっています。

pic01


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。

    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから