マクロ(Excel VBA)を使えば、Excel シート上に配置した図形の色などを変更することができます。
この際に、オブジェクトを繰り返し操作する For Each ステートメントを使います。
今日は、For Each ステートメントを使って図形の色を変更するマクロ(Excel VBA)を紹介します。
1、スライムと背景の色を変化させたい!
さて、今日取り上げるのが以下にシート上にドラクエのスライムの絵を描いたものです。
(いびつなスライムですが、そこはご容赦下さい 笑)
スライムの周りを四角で囲い、背景としています。
また、Excel VBA の実行ボタンを2つ作ってあります。
「スライム」ボタンと「背景」ボタンです。
Excel VBA を使って行う操作内容
さて、今回は実行ボタンを押してスライムの色と背景の色を変更するマクロを作りたいと思います。
具体的には
●「スライム」ボタンを押せば、マクロが実行しスライムの色が青、オレンジ、緑、灰色のいずれかに変わる
●「背景」ボタンを押せば、マクロが実行し背景の色が水色か黒のいずれかに変わる
というものです。
まずは、どのようなものを作ったか動画をご確認下さい。
「スライム」ボタンを何回も押した動画↓ 何回もスライムの色が変わります。
「背景」ボタンを何回も押した動画↓ 何回も背景の色が変わります。
今回、上記の動画のような動作をすることができる
挿入タブの図形で作った絵
まず、どのようにして絵を描くかと言うと、まずスライムの外形↓と口は「挿入」タブの「図形」の「曲線」を使って描いています。
色は最初はてきとうに青色にしておきました(図形の塗りつぶしで)。
外形↓
同様に目は「挿入」タブの「図形」の「楕円」を使っています。
また、背景は「挿入」タブのの「図形」の「正方形 / 長方形」を使って描いています。
VBA コードで図形として指定できるようにするために名前を付ける
さて、VBA コードを書くための準備がまだ必要です。
操作対象となる図形を指定できなければならないので、図形に名前を付ける必要があります。
スライムの外形、背景、スライムボタン、背景ボタン それぞれに名前を付けます。
まず、スライムの外形の名前は外形(スライム本体の図形)を選択して、画面左上に表示される図形の名前を変更します。
「スライム」としました。
図形の名前は、最初に図形を挿入した段階ではてきとうに付けられていますので、これを変更する必要があるということです。
図形の名前が表示されているボックスを選択して、名前を変更したら Enter キーを押すのを忘れないようにしましょう!
同様に「背景」の図形を選択して名前を変更します。
「スライム」ボタンと「背景」ボタンの2つの実行ボタンの名前も変更しましょう。
2、For Each ステートメントを使って図形の色を変化させるプログラミングコード
今回は標準モジュールの1つのプロシージャのみの VBA コードとなります。
「スライム」ボタン、「背景」ボタンともにプロシージャ名「Slim_Change」のマクロを組み込んでおきます。
「スライム」ボタンの場合以下の手順です。
全 VBA コード
全 VBA コードは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
Sub Slim_Change() Dim Slim As Shape Dim Background As Shape Dim s As Shape Dim Slim_Color As Double Dim Back_Color As Double Select Case Application.Caller Case "スライムボタン" 'スライムボタンを押した場合' For Each s In ActiveSheet.Shapes If s.Name = "スライム" Then '図形の名前が「スライム」の場合' Slim_Color = Rnd 'スライムの色' If Slim_Color >= 0 And Slim_Color < 0.25 Then s.Fill.ForeColor.RGB = RGB(0, 204, 255) '青色' ElseIf Slim_Color >= 0.25 And Slim_Color < 0.5 Then s.Fill.ForeColor.RGB = RGB(255, 102, 0) 'オレンジ色' ElseIf Slim_Color >= 0.5 And Slim_Color < 0.75 Then s.Fill.ForeColor.RGB = RGB(192, 192, 192) '灰色' ElseIf Slim_Color >= 0.75 And Slim_Color < 1 Then s.Fill.ForeColor.RGB = RGB(153, 204, 0) '緑色' Else End If Else End If Next s Case "背景ボタン" '背景ボタンを押した場合' For Each s In ActiveSheet.Shapes If s.Name = "背景" Then '図形の名前が「背景」の場合' Back_Color = Rnd '背景の色' If Back_Color >= 0 And Back_Color < 0.5 Then s.Fill.ForeColor.RGB = RGB(204, 255, 255) '水色' ElseIf Back_Color >= 0.5 And Back_Color < 1 Then s.Fill.ForeColor.RGB = RGB(51, 51, 51) '黒色' Else End If Else End If Next s Case Else End Select End Sub |
コード説明
さて、今回のコードのポイントとなるところを説明します。
一番お伝えしたいところは、For Each 文を用いて図形を認識するところですかね。
Application.Caller を用いた実行ボタンによる場合分け
まず、最初 Excel シート上の2つの実行ボタン(「スライム」ボタンと「背景」ボタン)に同じマクロを組み込んでいます。
しかし、実行される内容はどちらのボタンを押すかによって異なります。
プロシージャの数を1つにしたいので、このようにしたのですがそのための方法として「Application.Caller」っています。
正確には Application オブジェクトの Caller プロパティを使うことによって、プロシージャの呼び出し元の情報を取り出します。
以前に詳しい内容を記事にしましたので参考にして下さい↓
マクロ(Excel VBA)で標準モジュールにコードを記述するに場合、プロシージャの数は少ない方が良いでしょう。1つの標準モジュールの中にいくつものプロシージャがあるよりも、1つの方がすっきりします。今日は、Application オブジェクトの Caller プロパティを使ってプロシージャを1つに統一することができる例を紹介します。1、原価率、利益率、売上総利益を計算するシートシート設計次のシートを実例として使います。「売上」と「売上原価」を数値で入力してから、原価率、利益率、売上総利益のいずれかを計算することができるシー... マクロ(Excel VBA) 「Application.Caller」 を使ってプロシージャを1つに統一する - My タックスノロジー |
Select Case ステートメントを用いて「Application.Caller」を複数の条件に分けているわけです。
———————————————
Select Case Application.Caller
Case “スライムボタン”
処理①
Case “背景ボタン”
処理②
Case Else
End Select
———————————————
「スライム」ボタンが押さて実行した場合には処理①を行い、「背景」ボタンが押さて実行した場合には処理②を行います。
For Each ステートメントを使って目的の図形を探し出す
今回一番取り上げたい箇所はここです。
スライムの色を変化させる、背景の色を変化させるためには該当する図形の色を変更するという操作をしなければいけません。
ここで、該当する図形を For Each ステートメントを使って探すために先ほど図形に名前を付けたことが生きてくるわけです。
For Each ステートメントは以下のように記述して使います。
処理名
Next 変数
オブジェクト名として今回は「アクティブなシート上の図形」を指定しています。
ActiveSheet.Shapes
変数名は、このオブジェクトを入れ込むための変数です。
今回の変数 s は Shape 型(オブジェクト型)として定義しています。
Dim s As Shape
さて、「スライム」ボタンが押された場合に以下の部分を実行することになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
For Each s In ActiveSheet.Shapes If s.Name = "スライム" Then '図形の名前が「スライム」の場合' Slim_Color = Rnd 'スライムの色' If Slim_Color >= 0 And Slim_Color < 0.25 Then s.Fill.ForeColor.RGB = RGB(0, 204, 255) '青色' ElseIf Slim_Color >= 0.25 And Slim_Color < 0.5 Then s.Fill.ForeColor.RGB = RGB(255, 102, 0) 'オレンジ色' ElseIf Slim_Color >= 0.5 And Slim_Color < 0.75 Then s.Fill.ForeColor.RGB = RGB(192, 192, 192) '灰色' ElseIf Slim_Color >= 0.75 And Slim_Color < 1 Then s.Fill.ForeColor.RGB = RGB(153, 204, 0) '緑色' Else End If Else End If Next s |
「アクティブなシート上の図形」を1つずつ調べていき、名前が「スライム」の場合色を変更する
という処理を行っているわけですね。
スライムの色を 青、オレンジ、緑、灰色に確率 1/4 で変更するために以下で説明する「Rnd 関数」を使っています。
Rnd 関数
Rnd 関数は単精度浮動小数点型の乱数(疑似乱数)をランダムに返す関数のことです。
0以上1未満の値を返します。
コード中に「Rnd」と記述すれば、それだけで上記範囲の値がランダムに入れられることになります。
今回はこれを使ってスライムの色、背景の色をランダムに変化させているわけです。
以下の部分でスライムの色を変化させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Slim_Color = Rnd 'スライムの色' If Slim_Color >= 0 And Slim_Color < 0.25 Then s.Fill.ForeColor.RGB = RGB(0, 204, 255) '青色' ElseIf Slim_Color >= 0.25 And Slim_Color < 0.5 Then s.Fill.ForeColor.RGB = RGB(255, 102, 0) 'オレンジ色' ElseIf Slim_Color >= 0.5 And Slim_Color < 0.75 Then s.Fill.ForeColor.RGB = RGB(192, 192, 192) '灰色' ElseIf Slim_Color >= 0.75 And Slim_Color < 1 Then s.Fill.ForeColor.RGB = RGB(153, 204, 0) '緑色' Else End If |
まずRnd 関数を使って、変数「Slim_Color」に 0以上1未満の値を入れ込みす。
続いて、If ステートメントを用いて、Slim_Color の値が 0以上1未満のどこになるかで分岐しているわけです。
●0以上0.25未満の場合 青色
●0.25以上0.5未満の場合 オレンジ色
●0.5以上0.75未満の場合 灰色
●0.75以上1未満の場合 緑色
背景についても同様に処理しています。
図形の色を変更する
色を変化させるためには、例えば青色であれば RGB を用いて次のように指定します。
1 |
s.Fill.ForeColor.RGB = RGB(0, 204, 255) |
Fill プロパティは、Shape オブジェクトの塗りつぶしの書式設定を行うためのものであり、ForeColor プロパティは前景色を意味します。
RGB は色の指定方法です。
以下のサイトが大変参考になりました↓
3、まとめ
オブジェクトを繰り返し操作するためには For Each ステートメントを使います。
今回はスライムを題材として、図形の特定をするために「名前を付けた図形を For Each ステートメントを用いて探す」という操作を行ってみました。
「スライム」ボタンを何回も押した動画↓
「背景」ボタンを何回も押した動画↓
スライムは経理の仕事とは関係ありませんが、今回のように図形を操作することは使い勝手の良いツールを作る上で有用です。
何かのお役に立てて頂ければ! と思います。