LoginSignup
1
0

More than 3 years have passed since last update.

[ExcelVBA]ExcelVBAでFizzBuzz!

Last updated at Posted at 2020-05-27

目次

  • はじめに
  • 概要
  • サンプルコード
  • サンプル画像と使用例
  • おわりに
  • 参考にしたサイト
  • 追記(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とする。こうしないと、マクロが機能しない。また、コードは上記のコードをコピペするものとする。
コメント 2020-05-27 231911.png
4.こうしてボタンを押すと、以下画像の通り、FizzBuzzの結果が表示される。
・実行結果の一例
コメント 2020-05-27 232600.png

おわりに

さて、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も奥が深い。
勉強のし甲斐がありますね。

1
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0