category name  »  page title date

スピンボタンのイベント

スピンボタンは、簡単に使えて便利ですが、そのイベントがどんなタイミングでどんな順番で発生するのか、その時にValueプロパティの値はどうなっているのか、調べてみました。

用意したユーザーフォーム

こんなユーザーフォームを用意しました。START ボタンで記録がリセットされ、スピンボタンをクリックした結果がアクティブシートに記載されていきます。
SETMINMAX ボタンは、スピンボタンの Min/Max プロパティを再設定するとどうなるかを試すためのものです。

以下、ユーザーフォームのコードと、それに連携した標準モジュールのコードです。とても素直に書いていますので、とくに解説はしません。
SpinButton には、けっこうたくさんのイベントが定義されていますが、とりあえずは Change、SpinUp、SpinDpwn が使えればたいていの用が足りると思いますので、この3つのイベントを対象としました。

フォーム         SpinTestForm

'----- コマンドボタン
Private Sub CommandButton1_Click()
      Start
End Sub
Private Sub CommandButton2_Click()
      SetMinMax
End Sub
'----- スピンボタン
Private Sub SpinButton1_Change()
      Record "Change"
End Sub
Private Sub SpinButton1_SpinDown()
      Record "SpinDown"
End Sub
Private Sub SpinButton1_SpinUp()
      Record "SpinUp"
End Sub

標準モジュール         RecordModule

Private index As Long
Private button As Object
'----- ここから実行開始
Public Sub ShowForm()
      Start
      SpinTestForm.Show vbModeless
End Sub
'----- フォーム上の START ボタンの実行マクロ
Public Sub Start()
      ActiveSheet.Cells.Clear
      index = 3
      Set button = SpinTestForm.SpinButton1
End Sub
'----- フォーム上の SETMINMAX ボタンの実行マクロ
Public Sub SetMinMax()
      button.Min = 10
      button.Max = 15
End Sub
'----- イベントの種類と、発生時の Value プロパティを記録
Public Sub Record(eventName)
      With ActiveSheet.Cells(index, 1)
            .Offset(0, 0).Value = button.Value
            .Offset(0, 1).Value = eventName
      End With
      index = index + 1
End Sub

結果

さて、これで右や左の三角をクリックしたり、途中で Min/Max を再設定したりしてみた結果です。

まず、右向きの三角で Value は 0 から 1 に増加し、最初に Change イベントが、続けて SpinUp イベントが発生しています(実際には、最初のクリックで Change イベントが発生する前に Enter が発生し、その時の Value 値は更新する前の値となっていますが、ここではとくにそれを検証していません)。
次に左向きの三角をクリックすると、1 が 0 に戻り、また Change -> SpinDown イベントが発生します。初期値では Min が 0 なので、それ以上左向き三角をクリックしても、値は更新されず 0 のままとなり、SpinDown イベントは発生しても Change イベントは発生しません。
途中で Min/Max を再設定すると、Value 値は新しい Min 値に更新され、Change イベントが発生します。


結果をまとめると、次のようになっているようです。

① Value 値が変化した場合にのみ、SpinUp / SpinDown に先だって Change イベントが発生する。
② Value 値が変化するのは、SpinUp / SpinDown ボタンによって増減した場合と、Min / Max 値を変更して Value 値がその範囲を逸脱したために強制的に範囲内の値に修正された場合。
③ SpinUp / SpinDown のイベントは、該当するボタンをクリックするたびに Value 値の変化に関係なく発生する。

ついでに、Min、Max、Value の初期値は、それぞれ 0、100、0 になっているようです。
Min > Max で上下限値を設定すると、三角ボタンによる Value の増減方向は逆になります。