ExcelVBAでシートにあるフォームコントロールのボタンの文字色を変更する方法

Excelで普段何気なく使っているボタンですが、このボタンに書かれている文字の「色」から、どんな「役割」があるのかがなんとなく識別できるのではないでしょうか。

 

例えば、文字色の基本は「黒」です。普段の日常生活でも書類にボールペンやシャーペンで自分の名前を書いたりすることもあるかと思います。そのようにExcelのシートに最初に入力した時に表示される文字列の色は黒です。

 

またExcelのリボンに各種設定されたボタンに付随している文字列もほとんどが黒です。一方で文字色に設定される色で黒以外でもすぐに役割がわかるのが「青色」です。パソコンで使われる文字色の「青」で多くの人がイメージするのが「リンク」ではないでしょうか。

 

青色、もしくは水色に近い青色の文字があったら、「何かのページに繋がっているのかな」と考える人が多いかと思います。何らかの注意書きや強調は「赤色」を使ったりします。他にも文字に設定できる色はたくさんありますが、それぞれの文字色にその人ごとのイメージがあるでしょう。

 

同様に、フォームのボタンでもシートに設置したボタンでも状況によってそのボタンの文字色が「グレー」になっていると、「あぁ、このボタンは今は使えないんだな」という風に識別している人が多いのではないでしょうか。

 

以下の前回の過去記事では次のように書いていました。

今回のコードではフォームコントロールを形として「無効」にすることはできますが、同時に文字色までは変えることはできません。ActiveXコントロールだとEnabled=Falseにすると文字色もグレーになって無効になったことがわかりやすいのですが、フォームコントロールだと自動では文字色は変更されません。

 

そのため、必要であればフォームコントロールの文字色を変更するコードが別途必要になります。

上記の過去記事ではシート上に設置するフォームコントロールを「無効」にする方法について書きました。確かに「無効」にはできるんですが、それを見る人がわかりやすいようにボタンの文字色を「グレー」もしくは「灰色」にする、という処理まではできていませんでした。

 

シート上に設置するボタンにおいてActiveXコントロールだと、コードを使って無効にすれば自動的にそのコントロールの文字色も灰色になります。一方フォームコントロールのボタンの場合だと仕様のためか自動的には文字色は灰色にはなりません。

 

そこで今回は、ExcelVBAを使ってシートに設置したフォームコントロールのボタンの文字色を変更する方法について整理していってみます。

ExcelVBAでシートにあるフォームコントロールのボタンの文字色を変更するコード

結論としては次のコードになります。以下のコードの動作を確認した環境はExcel2013になります。

Sub フォームコントロールの文字色を変更()
Dim c
For Each c In Sheets("Sheet1").Shapes
   If Sheets("Sheet1").Shapes(c.Name).DrawingObject.Enabled = False Then
      'ボタンの文字色を灰色に変更
      Sheets("Sheet1").Shapes(c.Name).DrawingObject.Font.ColorIndex = 15
   Else
      'ボタンの文字色を黒色に変更
      Sheets("Sheet1").Shapes(c.Name).DrawingObject.Font.ColorIndex = 1
   End If
Next c
End Sub

順番にコードの解説をしていきます。概要としては、For Each…Nextステートメントでシート上にあるフォームコントロールのボタンを順番に見ていきます。その中でそのボタンの状態ごとに文字色を変えていく、というコードになります。

 

もう少し詳しく見ていくと、2行目で変数cを宣言。3行目のFor Each c In Sheets(“Sheet1”).Shapesで「Sheet1」シート上にある全ての描画オブジェクトを変数cに順番に格納していきます。

 

4行目のIf Sheets(“Sheet1”).Shapes(c.Name).DrawingObject.Enabled = False Thenでシート名が「Sheet1」シートを指します。

 

加えてそのシート内のオブジェクトが格納された「c」からNameプロパティでオブジェクト名を取得。取得したオブジェクト名に該当するオブジェクトをDrawingObjectで個別に選択。

 

Enabled=Falseで、指定したオブジェクトのEnabledプロパティがFalseであればIf文の中に入る、という条件文になっています。

 

6行目のSheets(“Sheet1”).Shapes(c.Name).DrawingObject.Font.ColorIndex = 15では、ボタンのフォントの文字色を15(ここでは灰色)に変更します。

 

7行目のElse以下は、最初のIf~Thenの条件文が「合致しない場合」、つまりシート上にあるフォームコントロール(今回の記事ではボタンを指す) のEnabledプロパティがTrueの場合に適用される条件になります。

 

9行目のSheets(“Sheet1”).Shapes(c.Name).DrawingObject.Font.ColorIndex = 1では、ボタンのフォントの文字色を1(ここでは黒色)に変更します。

 

10行目のEnd IfでIfの文の終了、11行目のNext cは3行目のFor Each…Nextステートメントに対応しており、次のオブジェクトを変数cに格納して再度4行目に戻って繰り返す、というコードになります。

シート上のフォームコントロールのボタンの文字色を変更する上での注意点

今回のコードの注意点としては、コードを実行できるフォームコントロールは「ボタン」だけになります。フォームコントロールのボタンとはActiveXコントロールでいうところの「コマンドボタン」になります。

 

今回のコードはSheets(“Sheet1”).Shapes(c.Name).DrawingObject.Font.ColorIndex = 15という風に、そのボタン内にある「Font」オブジェクトを指して色を変更するようにしています。

 

そのため、最初から「文字を設定できない」とか「文字がない」フォームコントロール、例えばチェックボックスやスピンボタン等で上記のコードを使おうとするとエラーになってしまいます。

 

ですから今回のコードが使えるのは、基本的に何らかの文字を設定したフォームコントロールの「ボタン」だけになりますので、ボタン以外の複数種類のコントロールをシートに設置している場合は、For eachを使わないか、もしくはIf文で特定のボタンだけ指定するようにした方が良いでしょう。

 

フォームコントロールの「ラベル」は文字を設定できるので、これも同様のコードで文字色を変更できるかのように思えます。しかし色々と試してみたのですが、今回のコードで文字色を変更しようとするとエラーになってしまいました。

 

ラベルなどのコントロールは文字を設定できるので別のコードを使えば変更できるのかもしれませんが、とりあえず自分が試してみた範囲、今回のコードではラベルの文字色は変更できませんでした。

まとめ

インターネットでExcelVBAを使ったボタンの文字色の変更方法について調べてみると、目にする情報のほとんどが「フォーム」の「コマンドボタン」の文字色の変更方法についてです。

 

今回の記事のように、ExcelVBAを使ってシートにあるフォームコントロールのボタンの文字色の変更方法についてのまとまった情報は、自分の調べた範囲ではちょっと見つけらなかったです。もちろん自分の探し方が悪かったり、気づいていないだけという可能性も十分あり得ます。

 

以下の過去記事でも書いたのですが、そもそもシートに設置するフォームコントロールは「仕様的に無効にはできない」から、それに伴ってボタンの文字色も変更する必要はない、もしくはできないだろう、と多くの人が考えていたのではないでしょうか。

 

確かに気持ちはわかります。「仕様でできない」のであれば、わざわざ無理をしなくても代替案として「フォームを使えばいい」わけなので。

 

とは言うものの、前回の過去記事の内容と今回の記事の文字色の変更方法から、シート上に設置するフォームコントロールのボタンを無効にして文字色も変更することができる、ことは確認できました。

 

ですので、シートを使ったシステムでフォームコントロールのボタンを使う時も、状況によってユーザーを上手く誘導できるようになるのではないかと思います。

あわせて読みたい

こんな記事も読まれています

コメント