EventShowSpinButton_Multi|セルを選択すると増減ボタンが自動表示される
- yuji fukami
- 3 日前
- 読了時間: 5分
更新日:2 日前

この部品でできること
EventShowSpinButton_Multi は、セルを選択すると、その隣に増減ボタン(スピンボタン風)を複数段階で自動表示するExcel VBAの汎用プロシージャです。
選択セルが指定した範囲内なら、増減ボタン(例:「-10」「+10」「-1」「+1」)をその場に自動で並べる
増減の幅(ValueDelta)は複数指定でき、幅ごとにボタンが1段ずつ並ぶ
増減の上限・下限も指定でき、ボタンを押しても範囲外にはみ出さない
別のセルを選ぶと、古いボタンは自動的に消え、新しい対象に応じたボタンに切り替わる
下の動画は、実際にセルを選択して増減ボタンが表示され、クリックで値が変わる様子のデモです。
使いどころ
パラメータセル(設定値・数値入力欄)を、マウス操作だけで手軽に調整できるようにしたいとき
テンキー入力が面倒な数値(角度・座標・比率など)を、ボタンのクリックだけで細かく調整させたいとき
「-10」「-1」「+1」「+10」のように、粗い調整と細かい調整を両方用意したスピンボタンUIを作りたいとき
コード
宣言セクションのEnumはモジュールの先頭に配置してください。本体(EventShowSpinButton_MultiとUpValue_ByMoveButton_Multi/DownValue_ByMoveButton_Multi)に加え、依存するDrawRectangleRound/ChangePushedButtonColor/ChangeValueCell/WaitByDoEvents/DeleteShapeNameLike/GetSelectionCell/GetShapeByName/Set__FontColorなどの部品もすべて含めています。下記をそのまま標準モジュールに貼り付ければ動作します。
使い方・引数
引数は6つです。ValueDeltasはParamArrayなので、増減幅をいくつでもカンマ区切りで渡せます。
Target(Range)・・・選択されたセル(イベントのTargetをそのまま渡す)
CellArea(Range)・・・この部品の処理対象とするセル範囲
MinValue(String)・・・増減の下限値(省略する場合は空文字"")
MaxValue(String)・・・増減の上限値(省略する場合は空文字"")
Position(EnumCellNearPosition)・・・ボタンの配置位置。vbセルの右上かvbセルの左下
ValueDeltas(ParamArray)・・・増減幅。複数指定すると、その数だけボタンが段になって並ぶ
Worksheet_SelectionChangeから呼び出すのが基本の使い方です。以下は、C3セル(0〜100の範囲、増減幅1と10)とC6セル(-1〜1の範囲、増減幅0.001・0.01・0.1)の2箇所にスピンボタンを設置する例です。
C3セルを選択すると「-1」「+1」「-10」「+10」の4個、C6セルを選択すると「-0.001」「+0.001」「-0.01」「+0.01」「-0.1」「+0.1」の6個のボタンが、それぞれセルの右上に段になって表示されます。

ボタンをクリックした瞬間は、ChangePushedButtonColorによって一瞬赤みがかった色に変わります。

仕組み(増減ボタンが出る流れ)
この部品は、選択変更イベント・ボタンのクリック・ボタン名からのパラメータ復元という3段構えで動いています。
セルを選ぶとWorksheet_SelectionChangeが発火し、Event_値増減が呼ばれます。Event_値増減はCancelというBoolean変数を用意し、Event__値増減1・Event__値増減2という「対象セルごとの担当プロシージャ」に、この変数を参照渡しで順番に渡していきます
各担当プロシージャは、冒頭でIf Cancel = True Then Exit Subをチェックしてから、自分の担当セル範囲(値増減①や値増減②)に対してEventShowSpinButton_Multiを呼びます。選択セルがその範囲内であればボタンを描画してTrueを返し、それがそのままCancelに代入されます
EventShowSpinButton_Multiは呼ばれるたびに、まずDeleteShapeNameLikeで既存の増減ボタンを全部消してから、新しいボタンを描き直す設計になっています。もしCancelのチェックが無ければ、C3セルを選んでボタンを描いた直後にEvent__値増減2側のEventShowSpinButton_Multiが呼ばれ、そちらのDeleteShapeNameLikeが今しがた描いたばかりのボタンまで消してしまいます。Cancelフラグは、この「後続の担当プロシージャが先に描いたボタンを消してしまう」事故を防ぐためのものです
ボタンをクリックするとUpValue_ByMoveButton_Multi/DownValue_ByMoveButton_Multiが動きます。ボタンの名前(例:増加ボタン_10_0_100)をApplication.Callerで取得し、Splitで「増減幅」「下限」「上限」に分解して、ChangeValueCellへ渡します
ボタン名に増減幅・下限・上限をアンダースコア区切りで埋め込んでおくことで、OnActionに登録する処理側は「今押されたボタンの名前を読むだけ」で、どのセルをどれだけ・どの範囲内で動かせばいいかを判断できます。増減幅ごとに別々のプロシージャを用意する必要がなく、UpValue_ByMoveButton_MultiとDownValue_ByMoveButton_Multiの2つだけで、何段階・何パターンのボタンにも対応できるのがこの設計のポイントです。
依存プロシージャ
このコードは次の自作プロシージャに依存します。上の「コード」ブロックにすべて含めているので、そのまま貼り付ければ動作します。
DrawRectangleRound:角が丸い長方形(増減ボタン)を作図する部品です。詳しくはDrawRectangleRoundを参照してください。
ChangePushedButtonColor(内部でWaitByDoEventsを使用):ボタンを押したときに一瞬色を変える演出のための部品です。詳しくはChangePushedButtonColor・WaitByDoEventsを参照してください。
ChangeValueCell:対象セルの値を上限下限内で増減する部品です。詳しくはChangeValueCellを参照してください。
GetSelectionCell:選択中のセルを取得する部品です。詳しくはGetSelectionCellを参照してください。
DeleteShapeNameLike:指定した名前で始まる図形をまとめて消す部品です。詳しくはDeleteShapeNameLikeを参照してください。既存の増減ボタンを消去するのに使っています。
GetShapeByName/Set__FontColor:シェイプの取得と、ボタンの文字・色を整えるための小さな補助部品です。
応用・注意点
MinValue・MaxValueはString型で受け取っています。これは「上限下限なし」を空文字""で表現するためで、内部でIsNumeric判定してからDoubleに変換しています。呼び出し側では、上限下限を使わないなら""を渡してください(サンプルコードでは数値をそのまま渡していますが、内部で暗黙的に文字列変換されます)。
ValueDeltasに渡す数値の順番がそのままボタンの段の順番(上から下)になります。細かい単位を先に、粗い単位を後に渡すと、セルに近い側に細かい調整ボタンが並びます。
EventShowSpinButton_Multiは呼ばれるたびに一旦ボタンを全部消してから作り直すため、対象セル範囲が複数ある場合は、Event_値増減のように担当プロシージャを分け、Cancelフラグで「どれか1つが処理したら残りはスキップする」制御を必ず入れてください。これを省略すると、後から呼ばれた担当プロシージャがボタンを消してしまいます。
ボタンの大きさはWidth = 60・Height = 30で固定しています。セルの大きさやフォントに合わせて調整したい場合はこの値を変えてください。
実際に組み込んだ例
下の動画は、この部品を実際のツールに組み込んだ例です。曲線を描くツールのパラメータセルに増減ボタンを設置し、ボタンを押すたびに数値が変わり、それに合わせて曲線がその場で描き直されていく様子を確認できます。
このように、値を少しずつ変えながら結果を確かめたい場面では、キーボードで数値を打ち直すよりもボタンを連打する方が圧倒的に速く、感覚的に調整できます。増減幅を複数用意しておけば、粗く動かして当たりを付けてから細かく詰める、という使い方もできます。
まとめ
EventShowSpinButton_Multi をWorksheet_SelectionChangeから呼ぶだけで、セルを選ぶとその場に増減ボタンが自動で現れ、クリックひとつで値を調整できるスピンボタンUIを設置できます。増減幅は複数指定でき、上限下限も指定できるので、複数のパラメータセルにそれぞれ異なる調整幅を持たせたいときにも、担当プロシージャを増やしてCancelフラグでつなぐだけで対応できます。



