前回の記事ではExcelでのVBAの書き方のルールやVBAを含んだExcelブックの扱い方、MsgBoxを使用したメッセージ出力方法について学習しました
今回は変数や四則演算、ランダムな数やIF文、割った余りについて学習していこうと思います
まずはExcelを開いて「開発」タブのリボン左端の「Visual Basic」ボタンをクリックし「Microsoft Visual Basic for Applications」画面を起動して、その画面の「挿入」タブの「標準モジュール」を選択してプログラミングの準備をしましょう

変数と四則演算
ExcelのVBAでは変数と呼ばれるデータを保管する箱のようなイメージのものを宣言し、その変数に値を代入すると変数を使って四則演算(足し算、引き算、掛け算、割り算)を行うことが出来ます
変数を宣言する時は変数名とデータの型を決める必要があり「Dim 変数名 As データ型」と記述します
変数名は前回の記事の「挨拶1(出力)」で学習したプログラム名のルールと同様、記号を含んだり、数字で始まったり、VBAで使用する予約語を使用することは出来ません
データ型は10種類ほどありますが、とりあえず整数型「Integer(インテジャー)」と文字列型「String(ストリング)」は良く使うのでこの2種類を覚えておきましょう
なお、変数の宣言は小文字で入力しても自動で先頭の文字が大文字に変換されます
また、変数は1つのプログラムの中でいくつも使用することが出来ますが同じ変数名は使えません
以下は整数型の変数 a と 整数型の変数 b にそれぞれ 30 と 7 を代入するプログラムです
変数と四則演算.gif)
以下は上記プログラムのイメージです

この変数 a と変数 b を使って四則演算をしてMsgBoxに計算結果を表示するプログラムを書いていきましょう
足し算は「+」、引き算は「-」、掛け算は「 *(アスタリスク) 」、割り算は「 /(スラッシュ) 」の演算子と呼ばれる記号を使って計算します
(詳しくはMicrosoftのVBAに関する「+ 演算子」「^ 演算子」「* 演算子」「/ 演算子」のページをご覧ください ※引き算の「 – 演算子」が何故か「 ^ 演算子」と書かれていますが多分ミスです^-^;)
変数と四則演算メッセージ表示.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 変数と四則演算()
Dim a As Integer
a = 30
Dim b As Integer
b = 7
MsgBox a + b
MsgBox a - b
MsgBox a * b
MsgBox a / b
End Sub
ランダムな数
では次にランダムな数を出力するプログラムを書いていきます
VBAには関数(かんすう)と呼ばれる便利なプログラムがあらかじめ多数用意されており、関数を呼び出すことで色々な結果を得ることが出来ます
今回はランダムな数を生成するRnd関数(ランドかんすう)という関数を使ってみようと思います
Rnd関数は0以上1未満の数を毎回ランダムに生成してくれる関数です
(詳しくはMicrosoftのVBAに関する「Rnd 関数」のページをご覧ください)
本当にランダムな数が生成されるかMsgBoxで中身を表示してみましょう
Rnd関数.gif)
0以上1未満のランダムな数がいくつか表示された中に以下のような数字が紛れ込んでいました

一見すると0以上1未満を超えているように思うかもしれませんが、4.535276E-02の後ろの「E-02」というのは10のマイナス2乗、つまり100分の1という意味を表しているので、この数字は0.04535276というかなり小さい数を表していて、0以上1未満の範囲に当てはまっています
このように「E-XX」は10のマイナスXX乗という意味ですので覚えておきましょう
では今度は先ほどのRnd関数を10倍してみましょう
0以上1未満のランダムな数の10倍なので0以上10未満のランダムな数が表示されます
Rnd関数10倍.gif)
では今度は整数型の変数 c に Rnd関数を10倍した値を代入して 中身を表示してみましょう
変数 c は整数型なので、小数を含んだRnd関数を10倍した値をそのまま代入することが出来ません
このような整数型に小数の値を代入する場合は、自動的に小数第1位の値で四捨五入されて変数 c に代入されるため、変数 c は0~10のランダムな数になります
0から10のランダムな数.gif)
上記のプログラムと同じ内容を以下に記載します
Sub ランダムな数()
Dim c As Integer
c = Rnd * 10
MsgBox c
End Sub
IF文
今度はIF文を使った条件分岐のプログラムを書いてみましょう
条件分岐とは条件によって実行する処理を分けるという意味で、条件はいくつでも分けられますが例えば4つの条件で分けると以下のような構文になります
If 条件1 Then
処理1
ElseIf 条件2 Then
処理2
ElseIf 条件3 Then
処理3
Else
処理4
End If
Ifは「もし」、Thenは「だったら」、ElseIfは「そうではなくもし」、Elseは「その他」という意味で上記は『もし条件1を満たすなら処理1を実行し、そうではなくもし条件2を満たすなら処理2を実行し、そうではなくもし条件3を満たすなら処理3を実行し、その他(どの条件も満たさない場合)は処理4を実行する』という意味です
(詳しくはMicrosoftのVBAに関する「If…Then…Else ステートメントを使用する」のページをご覧ください)
また、IfやElseIfやElseの各処理を行う行の左は一定の隙間(インデント)を空けて、その条件を満たす処理の部分であることを見やすくしましょう
では実際にIF文を使ったプログラムを書いてみましょう
以下は3行目で文字列型の変数 d に対して “男性” という文字を代入し、4行目以降のIfやElseIfやElseの行の中で変数dの値がどの文字と等しいかという条件によってメッセージを分けて表示します
なお、文字列型の変数の値は必ずダブルクォーテーション記号「 ” 」で文字を挟む必要があります
またIfやElseIfやElseの各処理を行う行の左はキーボードのTabキーを押して一定の隙間(インデント)を空けるようにしましょう

3行目の変数dの値を “男性”、”女性”、”赤ちゃん”、”宇宙人”に変えることでそれぞれ異なるメッセージが表示されます
IF文.gif)
もし条件をもっと増やしたい場合は ElseIf の条件と処理の2行を追加すれば増やせます
また、Else のその他(どの条件にも当てはまらない場合)の条件は必須ではないので不要な場合は省略できますがIF文の最後は必ず End If で終わる必要があります
上記のプログラムと同じ内容を以下に記載します
Sub IF文()
Dim d As String
d = "男性"
If d = "男性" Then
MsgBox "男子トイレはあちらです"
ElseIf d = "女性" Then
MsgBox "女子トイレはあちらです"
ElseIf d = "赤ちゃん" Then
MsgBox "赤ちゃんトイレはあちらです"
Else
MsgBox "多目的トイレはあちらです"
End If
End Sub
割った余り
先ほど「変数と四則演算」で変数を使った割り算を学習しましたが、今回は割った余りを使ったプログラムを学習しましょう
割った余りはMod演算子という計算記号を使って求めることが出来「割られる数 Mod 割る数」という書き方になります
(詳しくはMicrosoftのVBAに関する「Mod 演算子」のページをご覧ください)
例えば10 ÷ 4 の余りをMsgBoxで表示するプログラムは以下になります

実行すると以下のように「2」というメッセージが表示されます

では先ほどの「ランダムな数」と組み合わせて0~2のランダムな数をMsgBoxで表示するプログラムを作ってみましょう
以下は整数型の変数 e に対して「Rnd関数を10倍した値(0以上10未満のランダムな数)を3で割った余り」を代入してMsgBoxで表示しています
なお、Mod演算子は割られる数や割る数に小数を含む場合、割った余りを計算する前に先に小数を四捨五入して整数にしてから割った余りを計算する仕様のため、Rnd * 10 Mod 3は「Rnd関数を10倍した値を四捨五入した0~10のランダムな整数を3で割った余り」となります
0から2のランダムな数.gif)
ちゃんと0~2のどれかがランダムに表示されていますね
ただ、実は0~2が均等ではなく2が出る確率が低くなっています
Rnd * 10を 四捨五入した値 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
3で割った余り | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 |
上の表を見ると分かりますが0と1は4回に対して2は3回なので0と1に比べて2が出る確率が低くなるのです
上記のプログラムと同じ内容を以下に記載します
Sub 割った余り()
Dim e As Integer
e = Rnd * 10 Mod 3
MsgBox e
End Sub
ここまで学習したVBAの内容を理解できているか確認するため、次回は演習問題1(おみくじ)に挑戦してもらおうと思います
すぐに答えを見ないでまずは自分で考えて解いてみてください
コメント