使用するファイル:「マクロの練習」フォルダー「合否判定を行う.xlsm」
難易度が高い課題にいきなり挑戦するのは挫折の元。
「D. マクロを実行してみる(その1)」では、複数のシートをまとめるマクロは、シートとセルを操作しているため、まったくの初心者にとっては、決して簡単ではない。
比較的やさしいと言われている、セルを操作するマクロを実行して、そこに書かれているコードを見ることからマクロを始めましょう。
ここでは出来上がっている簡単マクロを使用して VBE の操作を見ていくことにします。
使用する教材は「合否判定を行う.xlsm」ブック。下図は、その実行後の画面表示だ。
A 列の点数が 80 以上を「合格」、80 未満を「不合格」と、B 列に表示するマクロ。
「他のすべての Excel を閉じて、・・・」は重要です。
マクロは開いているすべての Excel ファイルを認識できるので、マクロが混乱するのを避けるためにも、関係のない Excel ファイルがあれば、事前に閉じておきましょう。
※ ここで紹介する操作は、「E-1-1.「マクロ」ダイアログからVBEを起動する」で紹介したものです。必要であればそちらを参照してください
また、開始時と同様に、終了時にもメッセージが表示されるが、今回は「OK」のボタンが表示されているのも確認しよう。
「OK」のボタンを押す前は、Excel での他の操作ができるかどうかも確認してみよう。
ヒント:
「標準モジュール」で「Sample」名とは?
モジュール名は本来(挿入された時点)は「Module1」などとなっているが、これを変更したものです。すなわちモジュール名は本来の物を変更できます。
プログラミングに共通する考え方の、演算子、関数、変数、if文、For~Next文が使われている状況を確認する。
マクロは英語文章のように記述されているが、これを日本語に変えると以下のようになる:
Sub :「合否判定を行う」サブプロシージャです
Dim : 文字 i を、桁数の大きな整数を扱える変数と宣言する
IF
MsgBox :
「合否判定を行いますか?」とのメッセージを出して、「はい」か「いいえ」の返答を待つ。
vbNo :
Then :
返答が、「いいえ」であれば、
Exit Sub :
サブプロシージャを終了して以降の作業は行わない。
For :
i = 1 to 5 :
変数 i の値を最初に 1 として、繰り返し作業をここから始める。
値が 5 までは繰り返します。
IF :
Range("A" & i).Value >= 80 :
セル A & i の値(i が 1 の時は A1、以降同様)が 80 以上であれば、
Then :
Range("B" & i).Value = "合格"
セル B & i の値を "合格" とする。
Else :
そうでなければ、
Range("B" & i).Value = "不合格" :
セル B & i の値を "不合格" にする
End iF :
条件作業はここまで
Next i :
変数 i の値を +1 して、i の値が 5 迄は、ここまでの作業を繰り返す。
+1 して変数 i の値が 6 になったところで、作業を繰り返さないで、次に記述された作業を行う。
MsgBox :
「合否判定が終了しました」とのメッセージを出して、
End Sub :
「OK」が応えられたら、サブプロシージャを終了する。
MsgBox 関数はメッセージとボタンを表示して、クリックされたボタンの数値を返す関数です。
ここでは、"ダブルクオーテーション"で囲まれたメッセージとともに「Yes(はい)」と「No(いいえ)」の両方のボタンを表示し、ユーザーはどちらかのボタンを押すことになっています。押されたボタンの値が戻されます。
セル、シート、ブックなどの Excel の要素を「オブジェクト」といいます。
Excel の要素である個々のオブジェクトには、固有の名前があります。
例えばセルを表すオブジェクトを Range オブジェクト、あるいは Cells オブジェクト、ワークシートを表すオブジェクトを Worksheet オブジェクト、ブックを表すオブジェクトを Workbook オブジェクトと言います。
Excel そのものもオブジェクトの一つで、Application オブジェクトと言います。
セルはいろいろな側面を持っています。例えば、セルで表示する文字、文字の大きさ、文字の色、背景色、罫線等々。これを選択されたオブジェクトのプロパティ(「属性」)と呼びます。
セルの番地は、Range("A1") のように表します。"A1" が番地を表します。
Range の中に書くセル番地は必ず大文字で書きましょう。
何故でしょう? それは Excel の列表示が、A とか AA とか XFD 等とか大文字で表示されているからです。
例えばセルの文字の大きさを指定する時は、Range("A1").Font.Size =11 となります。
セルの値もプロパティの一つで、これを Value と呼び、"A1" 番地のセルの値を Range("A1").Value と表します。
「=」の記号は、左右が等しいということではありますが、マクロでは、左向き「←」とでも考えるといいでしょう。すなわち、「=」の右側の文字や数値を左側に入れる、ということです。
文字は "ダブルクォーテーションで囲みます"(数字の場合は囲む必要はありません)。
セルを指定するには、「Range」を使うことをみてきましたが、「Cells」を使うこともあります。この場合セル番地の列を表すには(A、B、C などの列記号ではなく)1、2、3 などと数値を使って可能となります。
例えばこれまで「Range("A" & i)」で A列の i 番目の行のセルを表してましたが、同じ A列の i 番目の行のセル番地を「Cells」で表現するには「Cells(i, 1)」と記述し、i 行目の、1 番目の(すなわち A )列のセルとして表示します。
Range 場合のセル番地の表現は、(「列記号」&「行数」)ですが、Cells の場合は(「行数」,「 列数」)と、カンマで区切って「行」と「列」の表示順が逆に表現されます。加えて、「列」の表記が "A" のように「列記号」なのか、「列数」なのかの違いがあります。
「Range("A" & i)」の表示は、縦方向のループには変数 「i」 の値で行番号を変えることでよかったのですが、 横方向のループ処理を表現するには、横方向に列記号を "A" から "Z"、"AA"から"AZ"、"AAA"から"XFD" までなどと、大変なことになってしまいそうです。
横(すなわち列)方向のループを列記号ではなく列数で表すためにも Cells 表記があるものと考えます。
セル番地が "A" & i、と表示されています。
これは、文字 A と変数 i とを & (アンパサンド)を使って結合させています。
変数 i は、1 から 5 までの数値をとれるので、Range(A1)から Range(A5) までのセルを順次表しています。
同じく Range("B" & i) は (B1) から (B5) までのセルを表しています。
ループ処理の一つである For ~ Next 文を使うと、この間に記述されている作業を、繰り返し行うことができる。繰り返す回数は「カウンター変数」と呼ばれ、カウンター変数には「i」を使うことが慣習になっています。「i」は「Iterator(反復子)、Increment(増加)、Integer(整数)」等からきているものと思われます。
For 文では変数 i の値の初期値と範囲(i = 1 to 5)が記述されていて、i の値がその範囲にあるときのみ、For 文以下 Next 文までを繰り返します。
For 文と対になっている Next 文では変数 i の値を+1 して、範囲内の値であれば、For 文まで戻ります。+1した結果変数値が範囲を超えると、For には戻らず、For 文の次の作業を行います。