VBA100本ノック 22本目:FizzBuzz発展問題
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で割れる数を条件判定します。
処理画面は以下の通り↓↓
よく考えたら、「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で割り切れた場合の結果を列で分けることを肉付けしました。
処理結果は以下の画像↓↓
最初よりは結果が見やすくなってますね!
4 感想
Select Caseの場合は「Select Case True」とすることを忘れていました。Like演算子で文字列を処理するときに使っていたのを思い出しました。簡単な問題ですがいい復習になりました。
ではでは、このへんで(^^)/~~~