ButtonBarClass【ExcelVBA】
ユーザーフォームのコントロールのButtonBarコントロールを追加し、使用方法を説明しながら試す。
ユーザーフォームの挿入からコントロールの追加、設置、各プロパティを使用していきます。
準備:コントロールの設置
STEP1 「ユーザーフォーム挿入」
VBE画面→挿入タブ→ユーザーフォームを選択し挿入
STEP 「ツールボックスを表示」
VBE画面→表示タブ→ツールボックスを選択
※注意点 ツールボックスがグレーアウトして押せない場合
ユーザーフォームを選択した状態でなければ、ツールボックスは押せない為
挿入したユーザーフォームを一度選択し、その後表示タブを選択しツールボックスを表示してください。
STEP3 「ButtonBarコントロールを追加」
ツールボックスのコントロール内で右クリック→その他のコントロールを選択
コントロールの追加ダイアログ内にある利用可能なコントロールから
「ButtonBar Class」にチェックをつけ、OKボタンを押下
ツールボックスに新しくButtonBarが追加されたら成功です。
カーソルを合わせるとポップアップでButtonBarと表示されます。
追加されたButtonBarコントロールを選択し、UserForm上に追加しましょう。
選択状態で、UserForm上でクリックをすると追加されます。
ここまでで追加のみ完了で、これがButtonBarコントロールです。
一度どのようなコントロールなのかユーザーフォームを表示する命令を記述し見てみましょう。
STEP4 「ユーザーフォームを表示」
ユーザーフォームを表示するには、Showメソッドを使用します。
UserFormのオブジェクト名に対して.Showでユーザーフォームを表示することが可能です。
引数modalには「vbModal」か「vbModeless」を指定します。
vbModal → モーダル表示(既定値) 省略するとこちら
vbModeless → モードレス表示(フォーム表示中もアプリケーション内のその他の操作が可能)
対象のユーザーフォームを選択し、プロパティウィンドウのオブジェクト名を見てみましょう。
オブジェクト名はUserForm1になっています(私の環境下では)
その為、UserForm1.Showで表示することが可能です。今回はモーダル表示で引数は省略します。
挿入タブから標準モジュールを挿入します。
そして、プロシージャを挿入し、UserForm1.Showとユーザーフォームを表示する命令を記述します。
Sub/ユーザーフォームの実行(F5)で実行してみましょう。
ButtonControlのついたユーザーフォームが表示されています。
ButtonBarコントロールにカーソルを合わせるとカーソルを合わせたボタンに色がついておしゃれです。
座標を設定したりせずとも、簡単に使用できます。
ここまでで準備段階は終了です。早速、ButtonControlの各機能を使用してみましょう。
設定:プロパティウインドウで設定
STEP1 「プロパティウィンドウの表示」
表示タブ→プロパティウィンドウ(ショートカットキーF4)
プロパティウィンドウを表示したらユーザーフォーム内にあるButtonBarコントロールを選択し
ButtonBarのプロパティを見ていきましょう。
この場合、ButtonBarのオブジェクト名はButtonBar1になります。
STEP2 「ControlTipTextプロパティ」 → カーソルを合わせた時のポップアップヒントのテキスト
ControlTipTextプロパティはButtonBarにカーソルを合わせた時に
出てくるポップアップヒントのテキストになります。
任意のテキストを入力し、UserFormを表示させて、カーソルを合わせて見ましょう。
カーソルをボタンの上にのせると、設定したテキストが表示されます。
これがControlTipTextプロパティになります。
STEP3 「Heightプロパティ・Widthプロパティ」 → ボタンの高さと横幅の設定
HeightプロパティとWidthプロパティは高さと横幅を設定することが可能です。
ただ、初期状態では変更することができません。
テキストボックスのようにテキスト範囲自体がない場合、最低のサイズになる為
仮にHeight50と入力しても大きくすることはできません。
STEP4 「Leftプロパティ・Topプロパティ」 → ボタンの左端の位置と上端の位置の設定
LeftプロパティとTopプロパティは場所を指定することが可能です。
Leftプロパティは左端からの位置(ボタンの左端の位置)で
Topプロパティは上端からの位置(ボタンの上端の位置)を指定します。
仮にLeftを0、Topを0とした場合フォーム上の一番左上隅に設置されます。
STEP5 「TabIndexプロパティ・Tabプロパティ」 → タブ(Tab)キーを押した際の設定
TabStopプロパティはTabキーを押した時に、そのコントロールで止まるかどうかをTrue/Falseで設定。
そしてTabIndexはタブキーを押した場合に止まる順番になります。
ユーザーフォーム上にコントロールが複数あり、何番目に止まるかを指定することが可能です。
0の場合は一番最初にタブキーを押した場合に、フォーカスが移ります。
複数コントロールを設置してタブキーを押した時にフォーカスが移る順番を任意に設定したい場合に
各コントロールのTabIndexと合わせて調整しましょう。
1つずつコントロールをTabIndexで設定せず、各コントロールを纏めて順番設定したい場合は表示タブの
タブオーダーを選択し、順番を設定することも可能です。
コントロールを選び、上に移動・下に移動で順番を設定しましょう。
STEP6 「Visibleプロパティ」 → コントロールの表示設定
VisibleプロパティをTrueで表示設定、Falseで非表示に設定できます。
Falseに設定した場合、対象のコントロールは表示されません。
目的があり、最初は非表示で後程何かしらのきっかけを元に表示したい場合等は
VisibleプロパティをTrue/Falseで切り替えて表示/非表示を切り換えます。
TagプロパティやHelpContextID等はメインで使用しない為、省略します。
ただプロパティは実際はこれだけではありません。
ここからはプロパティウィンドウに表示されていないプロパティや命令を実践していきましょう。
実践:各種命令
STEP1 「SetButtonLabelメソッド」 → ボタンのラベルを設定
SetButtonLabelメソッドを使用し、ButtonBarについているラベルを設定していきます。
引数はButtonIdにラベルを設定したいボタンのIDを指定し
pButtonLabelにラベルに設定する文字列を指定します。
各ボタンのIdは整数で左から0、1、2となっています。
その為、一番左のボタンラベルを設定したい場合は、引数ButtonIdに0を指定します。
早速コードを記述していきましょう。
ラベルを設定するタイミングはUserFormの初期化時に設定したいので
オブジェクトボックスは「UserForm」を選択し、プロシージャボックスは「Initialize」を選択します。
Private Sub UserForm_Initilaizeとユーザーフォームの初期時に起動されるプロシージャが入ります。
ユーザーフォーム初期化時に、ラベルを設定してみましょう。
サンプルコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Option Explicit
Private Sub UserForm_Initialize()
'ボタンバーのボタンIDが0のラベルを左のボタンというテキストを設定
ButtonBar1.SetButtonLabel 0, "左のボタン"
'ボタンバーのボタンIDが1のラベルを中のボタンというテキストを設定
ButtonBar1.SetButtonLabel 1, "中のボタン"
'ボタンバーのボタンIDが2のラベルを右のボタンというテキストを設定
ButtonBar1.SetButtonLabel 2, "右のボタン"
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーサンプルコード
ユーザーフォームを起動すると、各ButtonIdに対応したラベルが
pButtonLabelで指定した文字列のテキストになっています。
これで各ボタンに任意のテキストラベルを設定することができるようになりました。
STEP2 ButtonIdを指定して押したボタンに応じて処理を分ける
ラベルを設定することができたら、次は押したボタンに応じて、処理を分けてみましょう。
ButtonBarを選択し右クリック→コードの表示でButtonBarにコードを設定していきます。
オブジェクトボックスはButtonBarコントロールのオブジェクト名であるButtonBar1を指定し
プロシージャボックスはOnClickを指定します。
そうするとPrivate Sub ButtonBar1_OnClickという、ButtonBarコントロールをクリックしたときに
起動されるプロシージャが設定されます。
そしてByVal ButtonId As LongのButtonIdにどのボタンを押下したのか整数で値が入ります。
例えば、メッセージボックスにButtonIdを表示する命令を記述し、実行してみましょう。
そうすると、ButtonIdが0の一番左のボタンを押下するとメッセージに0と表示され
1の真ん中のボタンを押下すると1が表示、2の右のボタンを押下すると2が表示されます。
つまり押したボタンのIdをButtonIdによって取得することが可能です。
ですので、SelectCaseでButtonIdの値により処理を分けます。
サンプルコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Option Explicit
Private Sub ButtonBar1_OnClick(ByVal ButtonId As Long)
'ボタンIdの値により処理を分ける
Select Case ButtonId
'ボタンのIdが0の場合の処理
Case 0
MsgBox "左のButtonIdは" & ButtonId
'ボタンのIdが1の場合の処理
Case 1
MsgBox "真ん中のButtonIdは" & ButtonId
'ボタンのIdが2の場合の処理
Case 2
MsgBox "右のButtonIdは" & ButtonId
End Select
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーサンプルコード
このコードで実行し、各ボタンを順番に押して試してみましょう。
各ボタンに応じて、処理が分岐し、ボタンに応じた命令が実行されます。
左のボタンを押した場合はCase 0の命令が実行されます。
中のボタンを押した場合はButtonIdが1なので、Case 1の場合の処理が実行。
右のボタンを押した場合はButtonIdは2の為、Case 2の処理が実行される。
ここまでのサンプルコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Option Explicit
Private Sub ButtonBar1_OnClick(ByVal ButtonId As Long)
'ボタンIdの値により処理を分ける
Select Case ButtonId
'ボタンのIdが0の場合の処理
Case 0
MsgBox "左のButtonIdは" & ButtonId
'ボタンのIdが1の場合の処理
Case 1
MsgBox "真ん中のButtonIdは" & ButtonId
'ボタンのIdが2の場合の処理
Case 2
MsgBox "右のButtonIdは" & ButtonId
End Select
End Sub
Private Sub UserForm_Initialize()
'ボタンバーのボタンIDが0のラベルを左のボタンというテキストを設定
ButtonBar1.SetButtonLabel 0, "左のボタン"
'ボタンバーのボタンIDが1のラベルを中のボタンというテキストを設定
ButtonBar1.SetButtonLabel 1, "中のボタン"
'ボタンバーのボタンIDが2のラベルを右のボタンというテキストを設定
ButtonBar1.SetButtonLabel 2, "右のボタン"
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーここまでのサンプルコード
ここまでで、ユーザーフォームを起動し、起動時にラベルを任意のテキストに設定し
ButtonBarコントロールの押したボタンに応じて処理を分けることができています。
普通のボタンコントロールに飽きて少しオシャレなボタンを設置したい時に使ってます。
カーソルを合わせると光るのはおしゃれですよね。
2023年12月現在、ネット上にもButtonBarコントロールの情報は一切なく
メソッドも少なく誰も使わないのだろうと思いながらも、このご時世にChatGPTもGoogleもBingも
情報がないのは寂しいので誰かが使う日を心待ちにしてアップしておきます。