ワークシート上のレコードに対し、一行おきに着色するサンプルコードです。レコードのデータ確認をしやすくしたり、報告用の表の見栄えを良くしたりするのにも使えます。
データを目視で確認する際に、1行置きに着色してあると、データを目で追いやすいですよね。今回の実行内容は、単純ですが初登場でかつ大切なVBAコードも出てきますよ。
では、さっそく下のVBAコードを真似て書いてみてくださいね。
書き終えましたらVBAを実行してみてください。
どうでしょう。ちょっと黄色が目にきつい気がしますが、ちゃんと1行置きに着色されましたでしょうか。では、引き続きVBAコードの詳細です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Option Explicit 'Excelワークシート上のデータに対し、1行置き着色するコード Sub Sample022() Dim r As Long '行ルーチン処理用変数 Dim lngERow As Long '最終レコードの行番号用変数 Dim lngECol As Long '一番右側の列番号用変数 '最終レコード行番号取得 lngERow = Range("A" & Rows.Count).End(xlUp).Row '一番右側の列番号取得 lngECol = Range("A1").End(xlToRight).Column 'データ範囲に対し、1行置きに着色する For r = 2 To lngERow Step 2 '1行置きのレコードに対し処理する 'レコード行を着色する Range(Cells(r, 1), Cells(r, lngECol)).Interior.ColorIndex = 6 Next End Sub |
10行目: lngERow = Range("A" & Rows.Count).End(xlUp).Row
レコードの最終行番号を求めるVBAコードです。
7行目:Dim lngECol As Long
データ範囲の最終列番号を入れるための変数です。Excelシートを見ると、G列までがデータの範囲になりますので、答えを先に言ってしまうと7列目ですよね。これを次でお話しするVBAコードで取得しています。
13行目:lngECol = Range("A1").End(xlToRight).Column
これはVBA集計業務の頻出コードのバリエーションになります。左辺は、前述にお話ししたデータ範囲の最終列番号が代入される変数です。よって、右辺でその最終列番号を取得しているのですが、取得方法については図で詳しくお話ししますね。
今回あらたに登場したのは、「.End(xlToRight)」です。これは、レコードの最終行番号を求めるときによく使われる「.End(xlUp)」のバリエーションです。「.End(xlUp)」は、上のセルへジャンプするのでしたね。
さて、「.End(xlUp)」のショートカットキーは「Ctrl」+「↑」でしたが、今回の「.End(xlToRight)」のショートカットキーは「Ctrl」+「→」になります。
そこで、「.End(xlToRight)」は初めてになりますので、その動きについて下図でお話ししますね。
図は、黄色セルを出発点(はじめ選択状態)にして、「Ctrl」+「→」を実行する度に、色付きセルへジャンプする様子をあらわしたものです。出発点は4パターンありますので、実際に実行してもらえるとよくわかると思います。
まず、A1セルを出発点にした場合ですが、間のB1~E1セルを飛ばしてF1セルに飛びます。さらにもう一回押すと、Excelシートの最終列(XFD1)まで飛びます。
この場合、出発セル(A1)の右隣りのセルが空白でない場合は、さらに右隣りのセルが空白でない限り移動し続けます。そして、右隣りが空白になったときに、そこで止まるということです。これは、A1セルを出発した例ですね。
一方、出発セルの右隣りのセルが空白の場合は、さらに右隣りのセルが空白である限り移動し続けます。そして、移動してから初めて空白でないセルに来たところで止まります。これは、A2セルを出発した例ですね。
これら2つの移動のルールを理解すれば、A4とA5セルをそれぞれ出発セルとしたケースも理解できると思います。聞いているだけだと、面倒くさい気がしますが、慣れればルールなど気にせず正しく使えるようになります。
またVBAコードのプロパティ「.End(xlUp)」や残りのバリエーション「.End(xlDown)」、「.End(xlToLeft)」に対しても同じルールになります。繰り返しになりますが、実際にセル上で「Ctrl」+(矢印)で確認すると早く慣れると思います。
ここで1点だけ注意しておきたいのは、空白セルのように見えて、実はスペースが入っている場合です。この場合、スペースは空白ではないので、セルが埋まっているものとして考えてください。
16~21行目:For r=2 to lngERow Step 2 ~ Next
今回の繰り返し処理の部分のVBAコードになります。「For r=2 to lngERow 」までは、既に何回か出てきています。今回初登場なのが「Step 2」のところになります。
この「Step」は、繰り返し回数を入れる変数(今回の例では変数「r」)の増減を指定しています。これまでのFor ~ Next文の例では、「Step」はありあませんでした。
その場合は繰り返し回数を入れる変数は、1回の処理を終える度に「+1」増えます。そして、VBAコード上でStepを使って数字を指定する場合は、「+1」以外の増減を指定するために、「Step ※」のように書いて指定します。
よって、今回「Step 2」となっているのは、1行置きに色を付けなくてはならないためです。試しに、一度セルの色を無色にしてから、「Step」の後ろの数値を、3とか4にして確認してみるとよく理解できますよ。
ただ先ほど、「Step」の後は増減を入れると言いましたが、この例の場合は負の値を入れても意味がありませんからご注意くださいね。「Step」に負の値を入れる例は次回以降でご紹介します。
19行目:Range(Cells(r, 1), Cells(r, lngECol)).Interior.ColorIndex = 6
左辺の「Range(Cells(r, 1), Cells(r, lngECol))」は、セル範囲をRangeオブジェクトで表すVBAコードです。この場合は、1レコード分の範囲になりますね。
「.Interior.ColorIndex = 6」で、セルに黄色(6番)をつけています。「.Interior」はRangeオブジェクトの背景のことです。また「.ColorIndex」は、その背景の色を決めるパレット番号です。
よって「.Interior.ColorIndex」で、セルの背景の色を取得しています。
まとめ
今回は、VBAコードにより1行置きのレコードに着色する例をお話ししました。実行内容はポピュラーで少々たいくつさせてしまったかもしれませんね。ただ、お話しの中で出てきた「.End(xlUp)」のバリエーション「.End(xlToRight)」については、VBA集計業務の中では大切な考え方ですので、ぜひ身につけておいてくださいね。