前回の記事では演習問題1(おみくじ)、とFor文やセルへの操作(Cells)、演習問題2(九九)について学習しました
今回は比較演算と論理演算について学習し、その後で演習問題3(FizzBuzz)に挑戦してもらいます
また、最後に挨拶2(入力)についても学習しましょう
まずはExcelを開いて「開発」タブのリボン左端の「Visual Basic」ボタンをクリックし「Microsoft Visual Basic for Applications」画面を起動して、その画面の「挿入」タブの「標準モジュール」を選択してプログラミングの準備をしましょう

比較演算と論理演算
比較演算と論理演算はどちらも条件の判定の際に使用され、IF文やWhile文と共に使用されることが多いです(While文はFor文の際にご説明したループのパターン②の構文で、もう少し後で学習します)
【比較演算】
比較演算とは2つの値を比べる計算のことで、比べる際に以下の6種類の比較演算子と呼ばれる記号のどれかを使用します(①~④は数学で習う不等号と同じです)
① 値1 > 値2 …値1が値2より大きいか比較する
② 値1 >= 値2 …値1が値2以上か比較する
③ 値1 < 値2 …値1が値2より小さいか比較する
④ 値1 <= 値2 …値1が値2以下か比較する
⑤ 値1 = 値2 …値1が値2と等しいか比較する
⑥ 値1 <> 値2 …値1が値2と等しくないか比較する
実際に比較演算をIF文の中で使用して、条件で分けるプログラムを書いてみましょう
以下のプログラムは変数aと変数bの値を比較してaがbより大きい場合(上記の①)とaがbより小さい場合(上記③)とその他の場合(等しい場合)を比べてそれぞれMsgBoxで結果を表示します
比較演算1.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 比較演算1()
Dim a As Integer
a = 100
Dim b As Integer
b = 10
If a > b Then
MsgBox "aはbより大きいです"
ElseIf a < b Then
MsgBox "aはbより小さいです"
Else
MsgBox "aとbは等しいです"
End If
End Sub
今度は変数cと変数dの値を比較してcとdが等しくない場合(上記の⑥)と等しい場合(上記の⑤)を比べてそれぞれMsgBoxで結果を表示します
比較演算2.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 比較演算2()
Dim c As String
c = "あいうえお"
Dim d As String
d = "かきくけこ"
If c <> d Then
MsgBox "cとdは等しくありません"
ElseIf c = d Then
MsgBox "cとdは等しいです"
End If
End Sub
少し細かい話ですが、比較演算の計算が正しい場合はTrue(トゥルー)、正しくない場合はFalse(フォールス)という結果になり、IF文は条件がTrueの時に実行されます
このようなTrueまたはFalseのどちらかの値のことをBoolean(ブール)型の値と言います
(詳しくはMicrosoftのVBAに関する「比較演算子」のページをご覧ください)
【論理演算】
論理演算とは2つの条件に対してどちらも条件を満たしているか(日本語の「かつ」に相当)、どちらか片方でも条件を満たしているか(日本語の「または」に相当)、1つの条件を満たしていないか(日本語の「ではない」に相当)の判定をする計算のことで、以下の3種類の論理演算子と呼ばれる記号のどれかを使用します
Ⅰ 条件1 And 条件2 …条件1かつ条件2のどちらも条件を満たしているか判定する
Ⅱ 条件1 Or 条件2 …条件1または条件2のどちらか片方でも満たしているか判定する
Ⅲ Not 条件 …条件を満たしていないか判定する
条件については先ほど学習した比較演算を使用します
また、論理演算の結果も先ほどのBoolean型のTrueかFalseのどちらかになります
以下に条件に対するAndとOrとNotの演算結果を一覧表にまとめました
(詳しくはMicrosoftのVBAに関する「And 演算子」「Or 演算子」「Not 演算子」のページをご覧ください)
条件1 | 論理演算子 | 条件2 | 演算結果 |
True | And | True | True |
True | And | False | False |
False | And | True | False |
False | And | False | False |
True | Or | True | True |
True | Or | False | True |
False | Or | True | True |
False | Or | False | False |
– | Not | True | False |
– | Not | False | True |
実際に論理演算をIF文の中で比較演算と共に使用して、条件で分けるプログラムを書いてみましょう
以下のプログラムは条件1(年齢が18以上か)かつ条件2(国籍が日本か)のどちらも条件を満たす場合(上記のⅠ)とその他の場合を比べてそれぞれMsgBoxで結果を表示します
論理演算1.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 論理演算1()
Dim 年齢 As Integer
年齢 = 18
Dim 国籍 As String
国籍 = "日本"
If 年齢 >= 18 And 国籍 = "日本" Then
MsgBox "選挙に行けます"
Else
MsgBox "選挙に行けません"
End If
End Sub
以下のプログラムは条件1(お金を2000以上持っているか)または条件2(チケットを持っているか)のどちらか片方でも満たす場合(上記のⅡ)とその他の場合を比べてそれぞれMsgBoxで結果を表示します
論理演算2.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 論理演算2()
Dim お金 As Integer
お金 = 2000
Dim チケット As Boolean
チケット = True 'Trueがチケット有り、Falseがチケット無し
If お金 >= 2000 Or チケット = True Then
MsgBox "映画を観れます"
Else
MsgBox "映画を観れません"
End If
End Sub
以下のプログラムは条件(名前が山田じゃない)を満たす場合(上記のⅢ)とその他の場合を比べてそれぞれMsgBoxで結果を表示します
論理演算3.gif)
上記のプログラムと同じ内容を以下に記載します
Sub 論理演算3()
Dim 名前 As String
名前 = "鈴木"
If Not 名前 = "山田" Then
MsgBox "山田じゃありません"
Else
MsgBox "山田です"
End If
End Sub
演習問題3(FizzBuzz)
FizzBuzz(フィズバズ)という英語圏の言葉遊びがあり、円状に並んだ人が時計回りに1から順番に数字を言っていきます
ただし、3の倍数の数字の時はFizzと言い、5の倍数の数字の時はBuzzと言い、3の倍数かつ5の倍数の時(15の倍数の時)はFizzBuzzと言わなくてはならず、言い間違えたら負けという遊びです
演習問題3(FizzBuzz)の説明.gif)
FizzBuzzはプログラミングの練習問題の題材にされることが多いので、今回は以下のルールのFizzBuzzに挑戦してもらおうと思います
これまで学習した知識を使って以下のプログラムを作ってみましょう
ルール1) For文を使って変数iを1~30まで30回ループし、以下のように変数iが3の倍数の時はFizz、5の倍数の時はBuzz、3の倍数かつ5の倍数の時はFizzBuzz、その他の場合は変数iをそれぞれA1~A30のセルに入力する

ルール2) ルール1の「3の倍数かつ5の倍数の時はFizzBuzz」は論理演算子(And)を使って2つの条件を両方満たす場合という書き方とする(論理演算子Andを使わずに15の倍数の時という書き方はNG)
演習問題3(FizzBuzz)ヒント:サンプルプログラム
「For文を使って変数iを1~30まで30回ループし、変数iが3の倍数だったらセルへFizzを入力し、その他の場合は変数iを入力する」というプログラムは以下のようになる
Sub FizzBuzzヒント()
Dim i As Integer
For i = 1 To 30
If i Mod 3 = 0 Then
Cells(i, 1).Value = "Fizz"
Else
Cells(i, 1).Value = i
End If
Next i
End Sub
演習問題3(FizzBuzz)解答
演習問題3(FizzBuzz)解答.gif)
Sub FizzBuzz()
Dim i As Integer
For i = 1 To 30
If i Mod 3 = 0 And i Mod 5 = 0 Then
Cells(i, 1).Value = "FizzBuzz"
ElseIf i Mod 3 = 0 Then
Cells(i, 1).Value = "Fizz"
ElseIf i Mod 5 = 0 Then
Cells(i, 1).Value = "Buzz"
Else
Cells(i, 1).Value = i
End If
Next i
End Sub
以下のように間違える人がいますが、プログラムは上から下に流れていくため、15の倍数は8~9行目の「3の倍数かつ5の倍数の時はFizzBuzz」を通る前に4~5行目「3の倍数の時はFizz」に引っかかってしまいA15とA30のセルの値がFizzになってしまいます
Sub FizzBuzz間違い()
Dim i As Integer
For i = 1 To 30
If i Mod 3 = 0 Then
Cells(i, 1).Value = "Fizz"
ElseIf i Mod 5 = 0 Then
Cells(i, 1).Value = "Buzz"
ElseIf i Mod 3 = 0 And i Mod 5 = 0 Then '実行されず
Cells(i, 1).Value = "FizzBuzz"
Else
Cells(i, 1).Value = i
End If
Next i
End Sub
挨拶2(入力)
MsgBoxはメッセージを表示する関数でしたが、今回は値を入力するInputBoxという関数について学習しましょう
以下のプログラムはInputBox関数が「あなたの名前を入力してください」という入力欄を表示し、入力欄へ入力した文字が変数yournameへ代入され、MsgBoxで変数yournameと「さん、こんにちは」という文字が繋がってメッセージが表示されます
なお、VBAでは文字や数字や変数を繋げる場合はアンド記号「 & 」で繋ぎますので覚えておきましょう
(詳しくはMicrosoftのVBAに関する「InputBox 関数」のページをご覧ください)
挨拶2(入力).gif)
上記のプログラムと同じ内容を以下に記載します
Sub 挨拶2()
Dim yourname As String
yourname = InputBox("あなたの名前を入力してください")
MsgBox yourname & "さん、こんにちは"
End Sub
次回はここまで学習した内容がきちんと理解できているか確認するため、演習問題4(数字当てゲーム)に挑戦してもらいます
難しいかも知れませんがすぐに答えを見ないでまずは自分で考えて解いてみてください
さらに演習問題4(数字当てゲーム)の後は、挨拶3(フォームボタン)セルへの操作(Range)、セルの行列幅調整についても学習します
<<1つ前の記事 1つ後の記事>>
コメント