【VBA備忘録】ボタンのカラーを変更する

2024年10月10日

最近は仕事先でVBAを使っていろいろ作って遊んでいるのですが、Excelの仕様で、ちょっとしたことでつまづくことが多くて多くて…
その度に調べるのが面倒なので、備忘録としてここに記録しておこうと思います。

コマンドボタンの色を変えたい

別にマクロを実行するだけのボタンなので色なんてデフォルトのグレーでいいし、図形にマクロを登録してそこから実行すればいいんですけど…いいんですけど…!
あの押したときカチってへこんで見えるやつ…!視覚効果っていうんでしょうか?


↑これです

あるとないではボタンを押した感が全然違って、コマンドボタンはちゃんと押せてるっていうのがわかるので、私はどうしてもコマンドボタンを使いたいというわけです。

Shironeco(嫁)
Shironeco(嫁)
カチってさせたい…!(小さなこだわり)

ボタンの色を変えたい

しかしコマンドボタンは色の変更があんまり簡単じゃないんですよ。

システム由来のデフォルトの色(黒とかグレーとか)かパレットで指定できますが、パレットの色はちょっとしかない…!

Shironeco(嫁)
Shironeco(嫁)
もっと微妙な色合いを使いたいのに…!(小さなこだわりその2)

でも、任意の数字を入力すれば色の指定ができそうな感じが…!
↑の図でいくとBack Colorの

&H00000000

という値で
色のついた部分を16進数のRGBの割合を指定すれば好きな色に変更できそう!やってみよ!

カラーチャートで色を決めてRGBを指定する

「RGB」「16進数」とはなんぞやと思われるかもしれませんが、説明すると長くなるので簡単に「RGB」=光の三原色、「16進数」=色の強さの値と思ってください。(多分厳密にいえば違いますが)

RGBはR(レッド)G(グリーン)B(ブルー)の光の三原色でその光の強さによって色が変化します。

すべての色がなければ黒だし、全色混ぜれば白になります。小学校の理科で3色のライトを重ねるとって習ったアレです。
混ざれば混ざるほど色が明るくなるので絵具と逆ですね。

16進数は0~9とA~Fの全16文字で値を表す方法です。
0が一番小さくFが一番大きい数になります。

つまりRGBの三色の割合を16進数で指定すれば好きな色が指定できるのです。
指定方法はR2桁G2桁B2桁の6桁の色番号で指定します。

例えば黒はすべて0なので

#000000

白は全部最大値(F)なので

#FFFFFF

赤はRだけ最大値で

#FF0000

となるわけです。

早速色番号を指定してみる

私はWebサイトで調べられるカラーパレットを使って色を決めることが多いです。
何色も色を使うとき、組み合わせを失敗しなくていいです!
私はColordropというサイトをよく使います。

好きな配色を選ぶと右側で色番号を教えてくれて、クリックすれば色番号をクリップボードにコピーしてくれます。

今回はコマンドボタンをこのきれいなブルー?グリーン?に変更してみます。

VBAでActiveXで設置したボタンがあるSheetを選択しデザインモードにした後、開発→Visual Basicを開きます。

プロパティの「Sheet〇〇 Worksheet」をプルダウンメニューから「CommandButton〇 CommandButton」に変更し、項目の中から「BackColor」を探して
□ &H8000000F&(デフォルトのグレー)
となっているところに先ほどColordropでコピーしてきた値を入力して
□ &H00BBDED6&(&H00(固定)を頭につけ、おしりに&で挟む)にしてみたところ

なんか、色違うくない…?

こんなくすんでましたっけ??え??どういうこと…?と大混乱です。

VBAの仕様のせいでした

しばらく悩んで、もしやRGBの色の順番が違うのではと思いRBの位置をを交換してみたらなんとビンゴ!!!!
WebやIllustratorなどの描画系ソフトは通常の16進数なのでRGBの順番ですが、
なぜかExcel VBAはBGRの順番だったのです。

つまり先ほどの色だとRのBBとBのD6を入れ替えて
□ &H00D6DEBB&
と入力すると

できたーーーー!!!!!

ボタン色をカスタムすれば、使いやすいシートになる

ボタンがカチッとなったり、グレーでないボタンを使うっていうのは小さなこだわりなんですが、
例えば使用者がボタンを押したか不安になって何度も押してしまうのを防いだり、
重要なボタンに色をつけて押し間違えを防いだりできるので、
使用者にとってより使いやすいシートにできる工夫のひとつなんですよね。
私と同じようにボタンの色に悩んでいる方の助けになればいいと思います。