概要
ChangeValueTextBox_byKeyは、UserForm上のTextBoxで上キー、下キーを押したときに、表示中の数値を増減させるExcel VBA汎用プロシージャです。
対象のTextBox、最小値、最大値を渡すと、上キーで1増やし、下キーで1減らします。上限を超えたら最小値へ、下限を下回ったら最大値へ戻る循環処理も入っています。戻り値はなく、対象TextBoxの表示値を直接変更します。
使う場面
- 時、分、秒などの数値入力を上下キーで調整できるようにしたい
- 複数のTextBoxで同じ増減処理を使い回したい
KeyDownイベントごとに同じ分岐や範囲チェックを書きたくない- 0から23、0から59など、決まった範囲で循環する入力欄を作りたい
処理イメージ図
ChangeValueTextBox_byKeyの処理は、次の流れです。
KeyDownイベントで受け取ったKeyCodeを確認する- 上キーなら
+1、下キーなら-1を増減量にする - 上下キー以外なら何もせず終了する
- 現在のTextBox値を数値化し、範囲内に丸める
- 増減後、上限超えなら最小値、下限未満なら最大値に戻す
- 必要に応じて2桁ゼロ埋めでTextBoxへ表示する
使用例
下の例では、時、分、秒のTextBoxそれぞれのKeyDownイベントから、同じ汎用プロシージャを呼び出します。
コードを読み込み中...コピー可能な実装コード
コードを読み込み中...初心者向けコード解説
KeyCode As MSForms.ReturnIntegerは、どのキーが押されたかを受け取る引数です。KeyDownイベントから渡される値をそのまま使います。
Target As MSForms.TextBoxは、値を増減させたいTextBoxです。Me.txt_時のように、フォーム上の対象コントロールを渡します。
MinValueとMaxValueは、入力として許可する最小値と最大値です。時刻入力なら、時は0から23、分や秒は0から59のように指定します。
Optional ByVal zeroPad2 As Boolean = Trueは、2桁ゼロ埋めをするかどうかの指定です。Trueなら5を"05"として表示し、Falseなら"5"として表示します。
Select Case KeyCodeでは、押されたキーを判定しています。vbKeyUpならdelta = 1、vbKeyDownならdelta = -1にします。上下キー以外の場合はExit Subで処理を終えます。
KeyCode = 0は、上下キーによる既定の動きを止めるための行です。TextBox内のカーソル移動などを抑え、数値変更の操作として扱いやすくしています。
実際の数値変更は、S__StepTextBoxValueに分けています。キー判定と値変更を分離しているため、あとからボタンクリックなど別の入口から同じ増減処理を使いやすくなります。
Trim$(Target.Text)でTextBoxの前後の空白を取り除きます。未入力や数値以外の場合はMinValueから開始します。
値が範囲外だった場合は、いったん最小値または最大値に丸めます。その後でdeltaを足し、上限を超えた場合は最小値へ、下限を下回った場合は最大値へ循環させます。
最後にFormat$(Value, "00")またはCStr(Value)で文字列にして、Target.Textへ戻します。Target.SelStart = Len(Target.Text)は、カーソル位置を末尾に置いて操作感を安定させるための行です。
注意点
- このプロシージャはMSFormsのTextBox向けです。ワークシート上のセル入力にはそのまま使いません。
KeyDownイベントから呼び出す前提です。Changeイベントから呼ぶと、値変更とイベント発火が絡んで扱いにくくなる場合があります。- 未入力や数値以外の文字列は
MinValue扱いで開始します。別の初期値にしたい場合は、補助プロシージャ側の判定を調整します。 - 上限と下限が循環する設計です。上限で止めたい入力欄には、そのままでは向きません。
- 元コード内の古い公式ブログURLは、実装の出典メモとして残しています。記事本文では、使い方と処理内容がTech Blog内で完結するように説明しています。
まとめ
ChangeValueTextBox_byKeyを使うと、VBAのUserFormで、上下キーによるTextBoxの数値増減処理を共通化できます。
時刻入力や番号入力など、範囲が決まった小さな数値をキーボードで調整させたいフォームで再利用しやすい汎用プロシージャです。
