#目次
- はじめに
- 概要
- サンプルコード
- サンプル画像と使用例
- おわりに
- 参考にしたサイト
- 追記(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も奥が深い。
勉強のし甲斐がありますね。