2011年12月21日水曜日

[ExcelVBA] FizzBuzz問題


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

■解答例
まずは、1~100まで出力するコードを書く。
  1. Option Explicit  
  2.   
  3. Sub SampleCode()  
  4.     Dim row As Integer  
  5.     For row = 1 To 100  
  6.       Cells(row, 1) = row  
  7.     Next  
  8. End Sub  

次に3の倍数の時、つまり3で割って余り0の時に"Fizz"と出力。5の倍数の時、つまり5で割って余り0の時に"Buzz"と出力する処理を書いてみる。
  1. Option Explicit  
  2.   
  3. Sub SampleCode()  
  4.     Dim row As Integer  
  5.     For row = 1 To 100  
  6.         If row Mod 3 = 0 Then  
  7.             Cells(row, 1) = "Fizz"  
  8.   
  9.         ElseIf row Mod 5 = 0 Then  
  10.             Cells(row, 1) = "Buzz"  
  11.           
  12.         End If  
  13.     Next  
  14. End Sub  

このままだと3と5の倍数の時に3の倍数の処理が行われて"Fizz"のみになるのでこれらの処理より先に3と5の倍数の処理をしなければいけない。
(完成形その1)
  1. Option Explicit  
  2.   
  3. Sub SampleCode()  
  4.     Dim row As Integer  
  5.     For row = 1 To 100  
  6.         If row Mod 3 = 0 And row Mod 5 = 0 Then  
  7.             Cells(row, 1) = "FizzBuzz"  
  8.   
  9.         ElseIf row Mod 3 = 0 Then  
  10.             Cells(row, 1) = "Fizz"  
  11.   
  12.         ElseIf row Mod 5 = 0 Then  
  13.             Cells(row, 1) = "Buzz"  
  14.               
  15.         End If  
  16.     Next  
  17. End Sub  

下記のような書き方もいいですね。
(完成形その2)
  1. Option Explicit  
  2.   
  3. Sub SampleCode()  
  4.     Dim row As Integer, Temp As String  
  5.     For row = 1 To 100  
  6.         Temp = "" '条件に合うワードを一時格納する変数  
  7.         If row Mod 3 = 0 Then Temp = "Fizz"   
  8.         If row Mod 5 = 0 Then Temp = Temp & "Buzz"  
  9.         If Temp = "" Then Temp = row  
  10.           
  11.         Cells(row, 1) = Temp '最後に出力  
  12.     Next  
  13. End Sub  

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

0 件のコメント: