VBA100本ノック 22本目:FizzBuzz発展問題

この記事から得るもの

IF文、Select Case文での条件分岐

1 今回のお題

たまにはちょっと遊んでみましょう!
A列に1からの連番を出力してください。
ただし、
・3で割り切れる場合はB列に"Fizz"を出力。
・5で割り切れる場合はC列に"Buzz"を出力。
・両者で割り切れる場合はD列に"FizzBuzz"を出力。
※出力する数値範囲は適当に

2 今回のお題の意図

3,5,15で割れる数を処理する順番を考慮する。

3 回答

私の回答

Sub ノック22本目_1()

Dim ws As Worksheet: Set ws = Worksheets("sheet1")
Dim amount As Integer


For i = 1 To ws.Cells(Rows.Count, 1).End(xlUp).Row
    amount = ws.Cells(i, 1)
    
    If amount Mod 15 = 0 Then
        ws.Cells(i, 2) = "FizzBuzz"
    
    ElseIf amount Mod 3 = 0 Then
        ws.Cells(i, 2) = "Fizz"
        
    ElseIf amount Mod 5 = 0 Then
        ws.Cells(i, 2) = "Buzz"
    End If
Next

End Sub

ポイントは、15で割れる数を条件の最初にもってくることです。その後に3、5で割れる数を条件判定します。
処理画面は以下の通り↓↓
f:id:bimori466:20201119080846p:plain

よく考えたら、「A列に1からの連番を出力してください。」というお題に応えられていませんでした。
最初はSelect Caseで書こうと思ったのですが、書き方がぱっと浮かばずにIFで記述しました。
サイト管理者のSelect Caseバージョンは以下の通り

サイト管理者のSelect Caseでの記述

Sub VBA100_22_02()

Dim i As Long

Cells.Clear

For i = 1 To 100
    Select Case True
        Case i Mod 15 = 0
            Cells(i, 4) = "FizzBuzz"
        Case i Mod 3 = 0
            Cells(i, 2) = "Fizz"
        Case i Mod 5 = 0
            Cells(i, 3) = "Buzz"
        Case Else
            Cells(i, 1) = i
    End Select
Next
    
End Sub

このコードから学べることが2点ありました。
1.セルデータをすべて消去して、「For i = 1 To 100」で連番とする。
2.3,5,15で割り切れた結果を別の列に記述する。

この2点を踏まえた私の最終回答。

私の最終回答

Sub ノック22本目_2()

Dim ws As Worksheet: Set ws = Worksheets("sheet1")
Dim amount As Integer

'セルデータを削除
ws.Cells.Clear

'FizzBuzz判定
For i = 1 To 30
    ws.Cells(i, 1) = i
    amount = ws.Cells(i, 1)
    
    If amount Mod 15 = 0 Then
        ws.Cells(i, 4) = "FizzBuzz"
    
    ElseIf amount Mod 3 = 0 Then
        ws.Cells(i, 2) = "Fizz"
        
    ElseIf amount Mod 5 = 0 Then
        ws.Cells(i, 3) = "Buzz"
    End If
Next

セルデータの削除と3,5,15で割り切れた場合の結果を列で分けることを肉付けしました。

処理結果は以下の画像↓↓
f:id:bimori466:20201119082118p:plain

最初よりは結果が見やすくなってますね!

4 感想

Select Caseの場合は「Select Case True」とすることを忘れていました。Like演算子で文字列を処理するときに使っていたのを思い出しました。簡単な問題ですがいい復習になりました。


ではでは、このへんで(^^)/~~~