前回の記事では変数や四則演算、ランダムな数やIF文、割った余りについて学習しました
今回はこれまでに学習したVBAがきちんと理解出来ているか確認するため演習問題1(おみくじ)に挑戦し、その後にFor文、セルへの操作(Cells)について学習して最後に演習問題2(九九)に挑戦してもらいます
まずはExcelを開いて「開発」タブのリボン左端の「Visual Basic」ボタンをクリックし「Microsoft Visual Basic for Applications」画面を起動して、その画面の「挿入」タブの「標準モジュール」を選択してプログラミングの準備をしましょう

演習問題1(おみくじ)
これまで学習した知識を使って以下のプログラムを作ってみましょう
ルール1) プログラム名を「おみくじ」にする
ルール2)プログラムを実行すると「大吉」か「中吉」か「小吉」のどれかがランダムに表示される
ルール3)「大吉」と「中吉」に比べて「小吉」を出にくくする
演習問題1(おみくじ)ヒント:考え方
前回の「割った余り」で学習した Rnd * 10 Mod 3 の式により0~2のランダムな数を生成し、「変数と四則演算」で学習した整数型の変数へ代入する
その変数に対して「IF文」で学習した条件分岐により変数が0の場合と1の場合と2の場合の3つの条件ごとに処理を分けて「挨拶1(出力)」で学習したMsgBoxを用いて「大吉」「中吉」「小吉」を表示する
ただし「小吉」を出にくくするために変数が2の場合を「小吉」とすること(変数が0と1の場合はどちらが「大吉」でも「中吉」でも構わない)
演習問題1(おみくじ)解答
おみくじ.gif)
Sub おみくじ()
Dim e As Integer
e = Rnd * 10 Mod 3
If e = 0 Then
MsgBox "大吉"
ElseIf e = 1 Then
MsgBox "中吉"
ElseIf e = 2 Then 'Elseでも構わない
MsgBox "小吉"
End If
End Sub
For文
同じ処理を繰り返すことをループと言いますが、VBAではループとして以下の2種類の方法があります
① 決められた回数繰り返すループ
② ある条件を満たす間ずっと繰り返すループ
今回はFor文という①のパターンのループの構文について学習しましょう
(②のパターンのループはWhile文という構文でもう少し後で学習します)
For文は以下のような構文になります
Dim i As Integer
For i = 1 To 数字
処理
Next i
For文のループはFor~Next i で挟まれた処理を数字の回数繰り返します
この変数 i はループの回数を数えるカウンターのような役割をする変数で「For i = 1 To 数字」は変数 i が1からスタートし、繰り返し1回ごとに変数 i が1ずつ増えていき、変数 i が 数字になるまで繰り返すという意味です
(詳しくはMicrosoftのVBAに関する「For…Next ステートメントを使用する」のページをご覧ください)
また、処理の行は左端から一定の隙間(インデント)を空けて、Forのループに含まれている部分であることを見やすくしましょう
では実際にFor文を使ったプログラムを書いてみましょう
以下はFor文の中で変数 i を1から5まで5回繰り返し、1回ごとに変数 i の値をMsgBoxで表示します
For文.gif)
For文とIF文を組み合わせてループの中で特定の条件を満たす時は別の処理をするということも可能です
以下は先ほどのFor文の中で、もし変数 i が 3 だったらループが5回終わっていなくてもループを抜けるという行を5~8行目に追加しました
なお、ループを途中で抜ける処理は「 Exit For 」と記述します
For文_ExitFor_i3でループ抜ける.gif)
上記のプログラムと同じ内容を以下に記載します
Sub For文()
Dim i As Integer
For i = 1 To 5
MsgBox i
If i = 3 Then
MsgBox "iが3なのでループを抜けます"
Exit For
End If
Next i
End Sub
For文の中にさらにFor文を入れて二重構造にすることも出来、そのような二重構造のFor文を二重ループと言います
先ほどのFor文について、以下の赤枠の部分を2回ループさせてみましょう
For文ネスト前.png)
以下のように新しく変数 j を宣言しFor j = 1 To 2とNext jで挟まれた部分(緑枠)を2回ループします
さらにその中の赤枠を5回ループします(ただし、赤枠は3回目でループを抜けるので実質3回ループ)
For文ネスト後.png)
処理の順序としては緑枠のループ1回目( j = 1 ) の時に赤枠のループを5回( i = 1 ~ 5 ) 実行し、次に緑枠のループ2回目( j = 2 )の時にまた赤枠のループを5回( i = 1 ~ 5 ) 実行します
For文_ExitFor_二重ループi3でループ抜ける_1.gif)
上記のプログラムと同じ内容を以下に記載します
Sub For文()
Dim i As Integer
Dim j As Integer
For j = 1 To 2
For i = 1 To 5
MsgBox i
If i = 3 Then
MsgBox "iが3なのでループを抜けます"
Exit For
End If
Next i
Next j
End Sub
セルへの操作(Cells)
ここまでExcelのVBAをいろいろ学習してきましたが、処理はMsgBoxばかりで全然Excelのセルに対する処理をしていませんでした
そこで、今回はExcelのセルに値を入力するプログラムを書いていきましょう
VBAでセルを扱うにはCells(セルズ)とRange(レンジ)の2種類ありますが今回はCellsを学習します(Rangeはもう少し後で学習します)
ところで以前「Excelの基本用語」の中でExcelのセルについてご説明しましたが、セルの場所はアルファベットの列番号と数字の行番号で表されるので、例えば一番左上のセルはA1と表しました
一方、Cellsはセルの場所をCells(行番号 , 列番号)として行番号も列番号もどちらも数字で表します
列番号は左から何列目かを数字で表すため、例えばA1のセルはCells(1 , 1)、A2のセルはCells(2 , 1)、B1のセルはCells(1 , 2)、B2のセルはCells(2 , 2)と表します
そしてセルに値を入力する場合は「 Cells(行番号 , 列番号).Value = 値 」と記述します
以下はA1~B2の4つのセルに値を入力するプログラムです

実行すると以下のようにA1~B2の4つのセルにそれぞれ値が入力されました
なお、数字はセルの中で右寄せ、文字はセルの中で左寄せになります(セルの書式の表示形式の分類が「標準」の場合の数字と文字の配置の違いです)

Cellsは行番号や列番号を数字ではなく変数で扱うことも出来ます
先ほど学習したFor文を使って以下のようにループの中で変数 i を用いてセルの行番号を1~5へ順番にずらしてみます
セルへの操作CellsForのループ.png)
実行すると以下のようにA1~A5の5つのセルに変数 i の値が入力されています
セルへの操作CellsForループ結果.png)
では今度は行番号も列番号もどちらも変数を用いてセルの場所を指定してみましょう
以下はFor文の二重ループを使って外側のループの変数 i を行番号、内側のループの変数 j を列番号とし、変数 i と変数 j を足し合わせた値をそれぞれのセルに入力します

実行すると以下のようにA1~E3の15のセルに変数 i と変数 j を足した値が正しく入力されています

しかし一瞬で実行されるのでFor文の二重ループがどの順番で実行されたのか分かりませんでした
そこでブレイクポイントと呼ばれる便利な機能を使ってプログラムを指定の場所で一時停止しましょう
プログラムの左の列をクリックするとブレイクポイントと呼ばれる赤丸●が表示されます
ブレイクポイント.png)
ではもう一度ブレイクポイントを有効にした状態で先ほどのプログラムを実行してみます
セルへの操作Cells二重ループ.gif)
このようにブレイクポイントを設定するとプログラムの途中経過を見ることが出来てとても便利です
ブレイクポイントは複数設定することが出来るので一時停止したい場所ごとに赤丸●を設置しましょう
なお、ブレイクポイントを解除するには再度赤丸●をクリックすれば解除出来ます
上記のプログラムと同じ内容を以下に記載します
Sub セルへの操作Cells()
Dim i As Integer
Dim j As Integer
For i = 1 To 3
For j = 1 To 5
Cells(i, j).Value = i + j
Next j
Next i
End Sub
演習問題2(九九)
ここまで学習したVBAの内容を理解できているか確認するため、今回は演習問題2(九九)に挑戦してもらおうと思います
すぐに答えを見ないでまずは自分で考えて解いてみてください
以下のような九九の表を作成するプログラムをFor文の二重ループを使って作ってみましょう
演習問題2(九九).png)
演習問題2(九九)解答
Sub 九九()
Dim i As Integer
Dim j As Integer
For i = 1 To 9
For j = 1 To 9
Cells(i, j).Value = i * j
Next j
Next i
End Sub
今回はここまでにして、次回は比較演算と論理演算を学習し、最後に演習問題3(FizzBuzz)に挑戦してもらいます
コメント