Microsoft Excel(エクセル)VBAプログラミング(実践3)

ExcelVBAプログラミング(実践3) プログラミング

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

Excel開発タブ-VisualBasic-MicrosoftVisualBasicforApplications-標準モジュール

演習問題1(おみくじ)

これまで学習した知識を使って以下のプログラムを作ってみましょう。
ルール1) プログラム名を「おみくじ」にする
ルール2)プログラムを実行すると「大吉」か「中吉」か「小吉」のどれかがランダムに表示される
ルール3)「大吉」と「中吉」に比べて「小吉」を出にくくする

演習問題1(おみくじ)ヒント:考え方

前回の「割った余り」で学習した Rnd * 10 Mod 3 の式により0~2のランダムな数を生成し、「変数と四則演算」で学習した整数型の変数へ代入する
その変数に対して「IF文」で学習した条件分岐により変数が0の場合と1の場合と2の場合の3つの条件ごとに処理を分けて「挨拶1(出力)」で学習したMsgBoxを用いて「大吉」「中吉」「小吉」を表示する
ただし「小吉」を出にくくするために変数が2の場合を「小吉」とすること(変数が0と1の場合はどちらが「大吉」でも「中吉」でも構わない)

演習問題1(おみくじ)解答
ExcelVBA-演習問題1(おみくじ)
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 ステートメントを使用する」のページをご覧ください)
また、処理の行はTabキーで一定の隙間(インデント)を空けて、Forのループに含まれている部分であることを見やすくしましょう。

では実際にFor文を使ったプログラムを書いてみましょう。
以下はFor文の中で変数 i を1から5まで5回繰り返し、1回ごとに変数 i の値をMsgBoxで表示します。

ExcelVBA-For文

For文とIF文を組み合わせてループの中で特定の条件を満たす時は別の処理をするということも可能です。
以下は先ほどのFor文の中で、もし変数 i が 3 だったらループが5回終わっていなくてもループを抜けるという行を5~8行目に追加しました。
なお、ループを途中で抜ける処理は「 Exit For 」と記述します。

ExcelVBA-For文とIF文の組み合わせ

上記のプログラムと同じ内容を以下に記載します。

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回ループさせてみましょう。

ExcelVBA-For文とIF文の組み合わせ(二重ループ1)

以下のように新しく変数 j を宣言しFor j = 1 To 2とNext jで挟まれた部分(緑枠)を2回ループします。さらにその中の赤枠を5回ループします。(ただし、赤枠は3回目でループを抜けるので実質3回ループ)

ExcelVBA-For文とIF文の組み合わせ(二重ループ2)

処理の順序としては緑枠のループ1回目( j = 1 ) の時に赤枠のループを5回( i = 1 ~ 5 ) 実行し、次に緑枠のループ2回目( j = 2 )の時にまた赤枠のループを5回( i = 1 ~ 5 ) 実行します。

ExcelVBA-For文とIF文の組み合わせ(二重ループ)の結果

上記のプログラムと同じ内容を以下に記載します。

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つのセルに値を入力するプログラムです。

ExcelVBA-Cells

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

ExcelVBA-Cells結果

Cellsは行番号や列番号を数字ではなく変数で扱うことも出来ます。
先ほど学習したFor文を使って以下のようにループの中で変数 i を用いてセルの行番号を1~5へ順番にずらしてみます。

ExcelVBA-Cells(行番号変数)

実行すると以下のようにA1~A5の5つのセルに変数 i の値が入力されています。

ExcelVBA-Cells(行番号変数)結果

では今度は行番号も列番号もどちらも変数を用いてセルの場所を指定してみましょう。
以下はFor文の二重ループを使って外側のループの変数 i を行番号、内側のループの変数 j を列番号とし、変数 i と変数 j を足し合わせた値をそれぞれのセルに入力します。

ExcelVBA-Cells(行番号と列番号変数)

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

ExcelVBA-Cells(行番号と列番号変数)結果

しかし一瞬で実行されるのでFor文の二重ループがどの順番で実行されたのか分かりませんでした。
そこでブレイクポイントと呼ばれる便利な機能を使ってプログラムを指定の場所で一時停止しましょう。
プログラムの左の列をクリックするとブレイクポイントと呼ばれる赤丸が表示されます。

ExcelVBA-ブレイクポイントの設定の仕方

ではもう一度ブレイクポイントを有効にした状態で先ほどのプログラムを実行してみます。

ExcelVBA-Cells(行番号と列番号変数)結果(ブレイクポイントあり)

このようにブレイクポイントを設定するとプログラムの途中経過を見ることが出来てとても便利です。
ブレイクポイントは複数設定することが出来るので一時停止したい場所ごとに赤丸を設置しましょう。
なお、ブレイクポイントを解除するには再度赤丸をクリックすれば解除出来ます。

上記のプログラムと同じ内容を以下に記載します。

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

Cellsはセルへの入力だけでなく、削除する際にも使用します。
以下は全てのセルの値や色や書式などまとめて全て消すプログラムです。
何かリセットをするような場面で使用することが多いので覚えておきましょう。

ExcelVBA-Cells-全部消す

上記のプログラムと同じ内容を以下に記載します。

Sub セルの削除()
    Cells.Clear
End Sub

演習問題2(九九)

ここまで学習したVBAの内容を理解できているか確認するため、今回は演習問題2(九九)に挑戦してもらおうと思います。
すぐに答えを見ないでまずは自分で考えて解いてみてください。

以下のような九九の表を作成するプログラムをFor文の二重ループを使って作ってみましょう。

ExcelVBA-演習問題2(九九)
演習問題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)に挑戦してもらいます。

<<1つ前の記事  1つ後の記事>>

コメント

タイトルとURLをコピーしました