2014/02/22

リボンメニューでチェックボックスをラジオボタンのように VBA で制御する方法


前の記事では、トグルボタンをラジオボタンのように1つしか選択できないようにしましたが、今度はチェックボックスをラジオボタンのように動作するよう VBA で制御します。

基本的な方法は同じですが、用途としてはトグルボタンよりチェックボックスの方がラジオボタンとして使用する頻度は高いかもしれませんね。

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

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

<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="グループ">
      <checkBox id="chk1" getPressed="checkBox_getPressed" onAction="checkBox_onAction" label="チェックボックス1"/>
      <checkBox id="chk2" getPressed="checkBox_getPressed" onAction="checkBox_onAction" label="チェックボックス2"/>
      <checkBox id="chk3" getPressed="checkBox_getPressed" onAction="checkBox_onAction" label="チェックボックス3"/>

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

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

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

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

'チェックボックスの値を格納する変数
Dim checkBox1 As Boolean
Dim checkBox2 As Boolean
Dim checkBox3 As Boolean

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

'起動時処理
Sub Auto_Open()
'デフォルト値設定
checkBox1 = True
checkBox2 = False
checkBox3 = False
End Sub

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

'チェックボックスの値を設定
Sub checkBox_getPressed(control As IRibbonControl, ByRef returnValue)
  Select Case control.id
    Case "chk1"
      returnValue = checkBox1
    Case "chk2"
      returnValue = checkBox2

    Case "chk3"
      returnValue = checkBox3
  End Select
End Sub

'チェックボックスの変更内容を保存
Sub checkBox_onAction(control As IRibbonControl, pressed As Boolean)
  Select Case control.id
    Case "chk1"
      checkBox1 = pressed
      If checkBox1 = True Then
        checkBox2 = False
        checkBox3 = False
      End If
    Case "chk2"
      checkBox2 = pressed
      If checkBox2 = True Then
        checkBox1 = False
        checkBox3 = False
      End If
    Case "chk3"
      checkBox3 = pressed
      If checkBox3 = True Then
        checkBox1 = False
        checkBox2 = 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フィードのご登録はこちらから