[ExcelVBA]ExcelVBAでFizzBuzz!


目次

  • はじめに
  • 概要
  • サンプルコード
  • サンプル画像と使用例
  • おわりに
  • 参考にしたサイト
  • 追記(2020/5/30)

はじめに

気晴らしにVBAについてネットサーフィンをしていたら、このような記事を見つけた。
この記事によると、FizzBuzzをできない情報技術者は、石川遼を知らずにゴルフを語るようなものらしい。要するに、この程度を簡単にコーディングできないようでは情報技術者失格ということのようだ。
というわけで、VBAでFizzBuzzをやってみた。

サンプルコード

Option Explicit
'*******************************************
'おそらく一般的なFizzBuzzのコード
'*******************************************
Public Sub FizzBuzz()

    Dim shtFizzBuzz As Worksheet

    Set shtFizzBuzz = ThisWorkbook.Worksheets("FizzBuzz")

    'セルの値クリア
    Dim rngEndRow As Variant
    rngEndRow = shtFizzBuzz.Cells(Rows.Count, 3).End(xlUp).Row
    shtFizzBuzz.Range("C8", "C" & rngEndRow + 1).Clear

    '空白判定
    If IsEmpty(shtFizzBuzz.Cells(3, 3)) = True Then
        MsgBox "セルC3に数値を入力してください。"
        Exit Sub
    ElseIf IsEmpty(shtFizzBuzz.Cells(4, 3)) = True Then
        MsgBox "セルC4に数値を入力してください。"
        Exit Sub
    End If

    '文字列判定
    If IsNumeric(shtFizzBuzz.Cells(3, 3)) = False Then
        MsgBox "セルC3に文字列ではなく数値を入力してください。"
        Exit Sub
    ElseIf IsNumeric(shtFizzBuzz.Cells(4, 3)) = False Then
        MsgBox "セルC4に文字列ではなく数値を入力してください。"
        Exit Sub
    End If

    Dim numFizzBuzz_1 As Integer
    Dim numFizzBuzz_2 As Integer

    numFizzBuzz_1 = shtFizzBuzz.Cells(3, 3).Value
    numFizzBuzz_2 = shtFizzBuzz.Cells(4, 3).Value

    Dim i As Integer
    Dim j As Integer

    j = 8 'セルC8から結果を入力するために設定
    'FizzBuzzメイン処理
    For i = numFizzBuzz_1 To numFizzBuzz_2

        If i Mod 3 = 0 And i Mod 5 = 0 Then
            shtFizzBuzz.Cells(j, 3).Value = "FizzBuzz"
        ElseIf i Mod 3 = 0 Then
            shtFizzBuzz.Cells(j, 3).Value = "Fizz"
        ElseIf i Mod 5 = 0 Then
            shtFizzBuzz.Cells(j, 3).Value = "Buzz"
        Else
            shtFizzBuzz.Cells(j, 3).Value = i
        End If
        j = j + 1

    Next i

End Sub

サンプル画像と使用例

以下の手順で作成してほしい。
1.Excelブックを新規作成する。
2.Excelブックのシート名を「FizzBuzz」に変更する。
3.以下画像の通り、ボタンを配置する。なお、数値を入力するセルはC3とC4とする。こうしないと、マクロが機能しない。また、コードは上記のコードをコピペするものとする。

4.こうしてボタンを押すと、以下画像の通り、FizzBuzzの結果が表示される。
・実行結果の一例

おわりに

さて、VBAでFizzBuzzのコーディングをしてみたが、意外と難しかった。
ネットで調べずにやろうとしたら、セルの空白判定のやりかた、最終行の取得のやりかたなどが分からず、結局ネットで調べる羽目になった。
これは、自分のコーディング力のなさ、如いては、実力のなさが身に沁みてわかった。
これからもネットサーフィン等で情報を集め、気になるコードがあったら写経したり、何か切っ掛けをつかみ、実際にモノを作ってレベルアップしたい。

参考にしたサイト

わえなび ワード&エクセル問題集
No.8 ワークシートの最終行、最終列を取得する
エクセルの神髄

追記(2020/5/30)

第二弾として、関数を用いて、できる限り短く(当社比)コーディングしてみた。
※FizzBuzzメイン処理以外は、前記のコードと変わりません。また、コメントしていただいたExcel Insiderとは関係ありません…

    'FizzBuzzメイン処理(関数版)
    For i = numFizzBuzz_1 To numFizzBuzz_2
        shtFizzBuzz.Cells(j, 3) = IIf(i Mod 3, IIf(i Mod 5, i, "Buzz"), IIf(i Mod 5, "Fizz", "FizzBuzz"))
        j = j + 1

    Next i

見た目はシンプルになったかなと思います。
今回使用したIIF関数について、簡単に解説すると、簡易版If Then ElseIf関数なのかなと思います。(この記事を参考にしました。)
式を書くと、以下の通りです。
IIF(条件A, 真(条件Aが成立する)場合, 偽(条件AもBも成立しない)場合)
では、今回のコードを、上記の式を踏まえて解説します。
IIf(i Mod 3, IIf(i Mod 5, i, "Buzz"), IIf(i Mod 5, "Fizz", "FizzBuzz"))
条件:3で割り切れる(i Mod 3)
真(3で割り切れる)の場合:
     IIf(i Mod 5, i, "Buzz")の処理に移行
     条件:5で割り切れる(i Mod 5)
     真の場合:i を記述する
     偽の場合:"Buzz" を記述する
偽(3で割り切れない)の場合:
     IIf(i Mod 5, "Fizz", "FizzBuzz")の処理に移動
     条件:5で割り切れる(i Mod 5)
     真の場合:"Fizz" を記述する
     偽の場合:"FizzBuzz" を記述する
例えば、100を対象としてみると、以下の通りになります。
100は3で割り切れない → 偽の場合の処理(IIf(i Mod 5, "Fizz", "FizzBuzz"))が走る
→ 100は5で割り切れるので、"Fizz"を返す

こうしてみると、ややこしいですね。。。
いやー、FizzBuzzもそうですが、VBAも奥が深い。
勉強のし甲斐がありますね。