2011年12月21日水曜日

[ExcelVBA] FizzBuzz問題


■お題
1~100までの数字をセルに出力する。ただし、3の倍数の時に「Fizz」、5の倍数の時に「Buzz」、3と5の倍数の時に「FizzBuzz」と表示しなさい。

■解答例
まずは、1~100まで出力するコードを書く。
Option Explicit

Sub SampleCode()
    Dim row As Integer
    For row = 1 To 100
      Cells(row, 1) = row
    Next
End Sub

次に3の倍数の時、つまり3で割って余り0の時に"Fizz"と出力。5の倍数の時、つまり5で割って余り0の時に"Buzz"と出力する処理を書いてみる。
Option Explicit

Sub SampleCode()
    Dim row As Integer
    For row = 1 To 100
        If row Mod 3 = 0 Then
            Cells(row, 1) = "Fizz"

        ElseIf row Mod 5 = 0 Then
            Cells(row, 1) = "Buzz"
        
        End If
    Next
End Sub

このままだと3と5の倍数の時に3の倍数の処理が行われて"Fizz"のみになるのでこれらの処理より先に3と5の倍数の処理をしなければいけない。
(完成形その1)
Option Explicit

Sub SampleCode()
    Dim row As Integer
    For row = 1 To 100
        If row Mod 3 = 0 And row Mod 5 = 0 Then
            Cells(row, 1) = "FizzBuzz"

        ElseIf row Mod 3 = 0 Then
            Cells(row, 1) = "Fizz"

        ElseIf row Mod 5 = 0 Then
            Cells(row, 1) = "Buzz"
            
        End If
    Next
End Sub

下記のような書き方もいいですね。
(完成形その2)
Option Explicit

Sub SampleCode()
    Dim row As Integer, Temp As String
    For row = 1 To 100
        Temp = "" '条件に合うワードを一時格納する変数
        If row Mod 3 = 0 Then Temp = "Fizz" 
        If row Mod 5 = 0 Then Temp = Temp & "Buzz"
        If Temp = "" Then Temp = row
        
        Cells(row, 1) = Temp '最後に出力
    Next
End Sub

7行目:3の倍数の時は、"Fizz"。
8行目:5の倍数の時は、3と5の倍数もありえるので Temp & "Buzz"
9行目:値がない時は、3でも5の倍数でもない。
11行目:それらの結果を出力する。

0 件のコメント: