忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBA】If文を減らしてスマートに解く!FizzBuzz問題のエレガントな解法

プログラミングの入試問題とも言われる「FizzBuzz」。単純に条件分岐を重ねるだけでも解けますが、コードの美しさと拡張性を意識すると、全く違ったアプローチが見えてきます。今回は、VBA特有の文字列結合を活かした、If文の少ないスッキリとしたコードを解説します。

1. 仕様:FizzBuzz問題のルール

1から指定した数まで順番に数字を数え上げ、以下の条件に従って値を出力します。特に「15のとき」をどう処理するかが、If文を減らす鍵となります。

[ ルール ]
・3の倍数なら 「Fizz」
・5の倍数なら 「Buzz」
・両方の倍数(15の倍数)なら 「FizzBuzz」
・それ以外は 「その数字」 をそのまま表示

2. アルゴリズム:文字列結合による「条件分岐の集約」

重要ポイント:空文字変数に「付け足していく」発想

「15の倍数」を独立した条件として判定するのではなく、3の判定結果と5の判定結果を「結合」させることで、複雑なElseIfを排除します。最後に、変数の中身が空かどうかで数字を表示するか判定するだけの、極めてシンプルな構造です。

[ 具体的なロジック(i = 15 の場合) ]

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文の使用を最小限に抑えたエレガントな実装例です。

Sub ElegantFizzBuzz()
    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」になっているのが分かります。

1
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行足すだけで対応できる「拡張性」に優れています。多分岐を力技で書くのではなく、データの流れ(パイプライン)を作るような意識で書くのが「いけいけ」なエンジニアへの近道です。


PR