ChangePushedButtonColor|クリックした図形の色を一瞬変える
- yuji fukami
- 2 日前
- 読了時間: 3分

この部品でできること
ChangePushedButtonColor は、シート上に作図したボタン(図形)をクリックした瞬間だけ色を変え、コンマ数秒後に元の色へ自動的に戻すExcel VBAの汎用プロシージャです。
クリックされた図形のOnActionにこのプロシージャを登録しておくだけで、「押した感」の演出になる
変更前の色を自動で覚えておき、一定時間後に確実に元の色へ戻す
背景色・フォント色をそれぞれ指定できる
下の図のように、ボタンを押すと一瞬色が変わり、コンマ数秒で元の色に戻ります。

使いどころ
VBAで自作した図形ボタンに、クリックした手応え(フィードバック)を持たせたいとき
コマンドボタンではなく、シート上に描いた図形をボタン代わりに使っているとき
「押せているのか分かりにくい」という自作ボタンのUXを、最小限の実装で改善したいとき
EventSelectChangeUpDownRowの▲▼ボタンなど、他の記事の図形ボタンでもこの部品がクリック演出として使われています。
コード
使い方・引数
引数は2つです。
FillColor(Long)・・・クリックしたときの背景色(RGB(255,255,255)のようなLong値)
FontColor(Long)・・・クリックしたときのフォント色
使い方は、対象の図形の「マクロの登録」(OnAction)にこのプロシージャ経由の呼び出し用マクロを設定するだけです。
ChangePushedButtonColor自体は引数付きのプロシージャなので、図形のOnActionには直接登録できません。上のように引数なしのラッパー用プロシージャを1つ作り、そちらを図形のOnActionに登録してください。
内部ではApplication.Caller(今クリックされた図形の名前)をGetShapePushedで取得し、その図形の色を一時的に書き換えてから、WaitByDoEventsで100ミリ秒待機し、元の色に戻しています。
依存プロシージャ
GetShapePushed/GetShapeByName(クリックされた図形の取得)とWaitByDoEvents(色を戻すまでの待機処理)に依存しますが、いずれも上のコードブロックに含めているので、そのまま標準モジュールに貼り付ければ動作します。WaitByDoEventsについて、なぜSleepAPIやApplication.WaitではなくDoEventsループを使っているかは、WaitByDoEventsの記事で詳しく解説しています。
応用・注意点
色を毎回RGB(...)で指定するのが面倒な場合は、ChangePushedButtonColorAutoという応用版が使えます。こちらはボタンの今の色から自動的にクリック時の色を計算してくれるので、引数を渡さずに呼ぶだけで使えます。

ChangePushedButtonColorAuto は、色の計算に ConvDarkerColor / ConvLighterColor(さらにその内部で GetRGB_Array)を使います。下記は依存する部品もすべて含めたコードです。上の「コード」ブロックと併せて標準モジュールに貼り付ければ、そのまま動作します。
背景色はConvDarkerColorで指定した割合だけ暗く、フォント色はConvLighterColorで指定した割合だけ明るく、それぞれ自動計算しています。どちらもGetRGB_ArrayでRGB値をR・G・Bの3つの成分に分解してから、各成分を割合で補正しているだけのシンプルな計算です。ボタンごとに元の色がバラバラでも、DarkenPercentの1つの数値だけで統一感のあるクリック演出を作れます。
なお、WaitByDoEventsはその性質上、待機中に別の操作が割り込むと再入してしまう副作用があります。今回のような短時間のクリック演出では問題になりにくいですが、詳しくはWaitByDoEventsの記事を参照してください。
サンプルブック(ダウンロードして試せます)
コードの詳しい動きは上のコードブロックと解説のとおりですが、まず動かして試したい場合は、下記のサンプルブックをダウンロードして、ボタンを押すだけで動作を確認できます。
まとめ
ChangePushedButtonColor は、クリックされた図形の色を一瞬だけ変えて自動的に元へ戻す、シンプルながら効果の分かりやすい汎用プロシージャです。図形のOnActionにラッパー用のプロシージャを1つ登録するだけで使え、色を自動計算するChangePushedButtonColorAutoと組み合わせれば、複数のボタンに手間なく統一感のあるクリック演出を持たせられます。

