[ExcelVBA]ExcelVBAでFizzBuzz！ 

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

#はじめに
気晴らしにVBAについてネットサーフィンをしていたら、[このような記事](https://www.waenavi.com/entry/20190624/1561370153)を見つけた。
この記事によると、FizzBuzzをできない情報技術者は、石川遼を知らずにゴルフを語るようなものらしい。要するに、この程度を簡単にコーディングできないようでは情報技術者失格ということのようだ。
というわけで、VBAでFizzBuzzをやってみた。

#サンプルコード
 ```VBA
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とする。こうしないと、マクロが機能しない。また、コードは上記のコードをコピペするものとする。
<img width="389" alt="コメント 2020-05-27 231911.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341829/f49e692d-0372-c66f-290f-74142d6ea468.png">
4.こうしてボタンを押すと、以下画像の通り、FizzBuzzの結果が表示される。
・実行結果の一例
<img width="388" alt="コメント 2020-05-27 232600.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341829/26feb18d-1c5a-44af-6593-44dcb05dbd0f.png">
#おわりに
さて、VBAでFizzBuzzのコーディングをしてみたが、意外と難しかった。
ネットで調べずにやろうとしたら、セルの空白判定のやりかた、最終行の取得のやりかたなどが分からず、結局ネットで調べる羽目になった。
これは、自分のコーディング力のなさ、如いては、実力のなさが身に沁みてわかった。
これからもネットサーフィン等で情報を集め、気になるコードがあったら写経したり、何か切っ掛けをつかみ、実際にモノを作ってレベルアップしたい。
#参考にしたサイト
[わえなび ワード＆エクセル問題集](https://www.waenavi.com/entry/20190624/1561370153)
[No.8 ワークシートの最終行、最終列を取得する](http://www.niji.or.jp/home/toru/notes/8.html)
[エクセルの神髄](https://excel-ubara.com/excelvba4/EXCEL237.html)
#追記(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関数なのかなと思います。([この記事](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1491356619)を参考にしました。)
式を書くと、以下の通りです。
**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も奥が深い。
勉強のし甲斐がありますね。