【VBA】If文を減らしてスマートに解く!FizzBuzz問題のエレガントな解法
プログラミングの入試問題とも言われる「FizzBuzz」。単純に条件分岐を重ねるだけでも解けますが、コードの美しさと拡張性を意識すると、全く違ったアプローチが見えてきます。今回は、VBA特有の文字列結合を活かした、If文の少ないスッキリとしたコードを解説します。
1. 仕様:FizzBuzz問題のルール
1から指定した数まで順番に数字を数え上げ、以下の条件に従って値を出力します。特に「15のとき」をどう処理するかが、If文を減らす鍵となります。
・3の倍数なら 「Fizz」
・5の倍数なら 「Buzz」
・両方の倍数(15の倍数)なら 「FizzBuzz」
・それ以外は 「その数字」 をそのまま表示
2. アルゴリズム:文字列結合による「条件分岐の集約」
重要ポイント:空文字変数に「付け足していく」発想
「15の倍数」を独立した条件として判定するのではなく、3の判定結果と5の判定結果を「結合」させることで、複雑なElseIfを排除します。最後に、変数の中身が空かどうかで数字を表示するか判定するだけの、極めてシンプルな構造です。
Step 1: 初期化
変数 res を空にする。
Step 2: 3の倍数判定
15は3で割り切れるので、res に "Fizz" を代入(結合)。
Step 3: 5の倍数判定
15は5でも割り切れるので、res に "Buzz" を追加結合。
結果、res は "FizzBuzz" になる。
Step 4: 最終判定
res が空でないのでそのまま出力。もし空なら数字を出力。
3. サンプルコード(そのままコピーOK)
イミディエイトウィンドウに出力する、If文の使用を最小限に抑えたエレガントな実装例です。
Dim i As Long
Dim res As String
For i = 1 To 30
res = "" ' 変数をリセット
' 3の倍数なら文字を入れる
If i Mod 3 = 0 Then res = "Fizz"
' 5の倍数なら文字を「付け足す」
If i Mod 5 = 0 Then res = res & "Buzz"
' 文字が入っていればそれを、空なら数字を表示
Debug.Print IIf(res <> "", res, i)
Next i
End Sub
4. 実行結果
上記コードを実行すると、イミディエイトウィンドウには以下のように出力されます。15と30の箇所が正しく「FizzBuzz」になっているのが分かります。
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
1. 技術的な補足: IIf 関数(Immediate If)を使用することで、条件出力を1行に集約しています。また、3と5の判定を独立させることで、「15のときは…」という重複した条件式を書く必要がなくなり、コードの「DRY(Don't Repeat Yourself)」原則を守っています。
2. エンジニアの視点: この手法は、将来的に「7の倍数のときはWoof」といった条件が追加されても、If文を1行足すだけで対応できる「拡張性」に優れています。多分岐を力技で書くのではなく、データの流れ(パイプライン)を作るような意識で書くのが「いけいけ」なエンジニアへの近道です。