ボタン設置グループ「▲▼ボタン(スピンボタン)」の解説
- yuji fukami
- 10月24日
- 読了時間: 5分
概要
書籍「Excel VBA開発を超効率化するプログラミングテクニック」の特典であるIkiKaiso2.xlamのリボン登録マクロの解説のための特設ページです。
出版社の書籍のページ⇒https://gihyo.jp/book/2024/978-4-297-14023-6
リボン登録マクロ全体解説ページ⇒https://www.softex-celware.com/post/ikikaiso2
本ページではIkiKaiso2.xlamの「ボタン設置」グループの「▲▼ボタン」の解説をします。

解説
用途
特定のセルの値を増減させる▲▼ボタン(上下ボタン、スピンボタン)の設置を効率的に行う
使い方
実際に使っている様子の動画を下記でご確認ください。
手順は次の通りです。
①:▲▼ボタンを設置するセル範囲を選択する
②:「▲▼ボタン」をクリック
③:値の増減の変化量をインプットボックスで入力してOK
④:値の増減の最小値をインプットボックスで入力してOK(何も入力しなかった場合は増減の下限無し)
⑤:値の増減の最大値をインプットボックスで入力してOK(何も入力しなかった場合は増減の上限無し)
⑥:▲▼ボタンが自動的に設置される。
通常のやり方およびその比較
▲▼ボタンは一般的に「スピンボタン」と呼びます。
このスピンボタンの通常の設定の仕方は下記図のように「フォームコントロール」を利用する方法があります。具体的に、「開発」タブ→「挿入」→「スピンボタン」からボタンを設置し、最小値、最大値、変化の増分(変化量)、リンク先セルなどのコントロールを設定して完了です。(ちなみにActiveXコントロールのスピンボタンはExcel上で廃止前提ですので使用は非推奨とします。)

紹介しているリボン登録マクロによる「▲▼ボタン」の設置は、この通常のやり方よりも高速かつ、柔軟な設定でスピンボタンが設置可能です。
さらに、上記図にも書いてありますが、フォームコントロールによるスピンボタンは次のようなことができません。
0未満(マイナスの値)は設定不可能
変化量は整数単位のみ(0.1などは設定不可)
最小値、最大値は必ず設定しなければならない
最大値は最大30000まで ⇒ 日付の増減には使えない
リボン登録マクロの「▲▼ボタン」ではこれらの「フォームコントロール」のスピンボタンでできないことも実現しています。
最小値、最大値はマイナスの値も設定可能
変化量は少数単位、マイナスの値も設定可能
最小値、最大値は省略して下限、上限を無くすことも可能
30000を超える値も対応しているので日付のシリアル値にも対応可能
実際に次の動画のようなスピンボタンを設置可能です。
「▲▼ボタン」の仕組み
「▲▼ボタン」の仕組みを簡単に説明すると次のようになります。
「▲▼ボタン」は「▲」ボタンと「▼」ボタンの別々のコマンドボタンで構成されている
「▲」ボタンと「▼」ボタンにはそれぞれ名前が設定してある。
「▲」ボタンと「▼」ボタンには同じマクロが登録されており、それぞれの設定してある名前をもとに別々の処理を行っている。
ボタンの名前に設定を保管
以降詳しく解説します。
「▲」ボタンと「▼」ボタンには下記図のようにそれぞれ名前が設定してあります。
下記図では「変化量0.1、最小値-1、最大値+1」の▲▼ボタンの場合の設定です。
「▲」ボタンには「F2_Up_0.1_-1_1」、「▼」ボタンには「F2_Down_0.1_-1_1」の名前が設定してあり、この名前が「▲▼ボタン」の設定情報となります。

この名前はアンダーバー「"_"」で繋いで5つの情報を格納してあります。具体的に次のようになっています。
[対象セルアドレス(または名前定義)」_「Up/Down」_「変化量」_「最小値」_「最大値」
上記例の「▲」ボタンには「F2_Up_0.1_-1_1」の場合は
対象セルのアドレスは「F2」
Up・・・増加方向の処理を行う
変化量は0.1
最小値は-1
最大値は+1
として処理されます。
「▼」ボタンには「F2_Down_0.1_-1_1」の場合は2番目の情報が「Down」なので減少方向の処理を行うようになります。
「▲」ボタンと「▼」ボタンはどちらも「ClickSpinButton_OnAction」というマクロ(プロシージャ名)が登録されています。

▲▼ボタンに登録してあるマクロ「ClickSpinButton_OnAction」
▲▼ボタンに登録してあるマクロ「ClickSpinButton_OnAction」について詳しく解説します。「ClickSpinButton_OnAction」では別途「ClickSpinButton」を実行する用にしています。

「ClickSpinButton」の中身は下記図で解説しています。ポイントだけ抑えると次の通りです。
Application.Callerメソッドにてクリックされたボタンの名前を取得
ボタンの名前「変数:ShapeName」よりスピンボタンの設定を取得
GetCellByNameプロシージャを利用して処理対象のセルを参照する
ChangeValueCellで増減の処理を行う

GetCellByNameは名前定義やアドレスをもとにセルを参照する処理ですが、On Error Resume Nextを利用して、引数で渡された名前定義が存在しない場合にエラーを起こさずNothingを返すようにしています。これによって、ユーザーが困惑するようなエラーは表示せずに「処理自体は実行されない」ように構築しています。

ChangeValueCellの仕組みは次のようになっています。
「増加or減少」「変化量」「最小値、最大値に達しているか」などをまとめて処理を行って、対象セル「Target」の値を変化させています。
ちなみに「MaxValue」「MinValue」は増減の最大値、最小値を示していますが、こちらのデフォルト値が「-9999」となっている理由は、もし通常のデフォルト値で「0」としてしまうと最大値、最小値が0となってしまい正常に処理ができなくなります。ですので、現実的に入力しないであろう「-9999」をデフォルト値として、このデフォルト値が引数で渡されれば「最大値無し⇒上限なし」「最小値無し⇒下限無し」のような処理を実現できるようになっています。

リボン登録マクロ「▲▼ボタン」のクリックでコードの自動生成している
リボン登録マクロ「▲▼ボタン」をクリックすると最初の動画の様に「対象セル」「変化量」「最小値」「最大値」などを設定すると「▲▼ボタン」が自動的に設置されていますが、これ以外に上記で説明した下記プロシージャをブック内に自動的にコードを記述しています。
ClickSpinButton_OnAction
ClickSpinButton
GetCellByName
ChangeValueCell
さらに説明すると、標準モジュール「Mod93_SpinButton」を自動的に追加して、上記の4つのプロシージャを「Mod93_SpinButton」の中に自動的に記述するような処理を行っています。




コメント