1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[ExcelVBA]ExcelVBAでFizzBuzz!

Last updated at Posted at 2020-05-27

#目次

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

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

#サンプルコード

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とする。こうしないと、マクロが機能しない。また、コードは上記のコードをコピペするものとする。
コメント 2020-05-27 231911.png
4.こうしてボタンを押すと、以下画像の通り、FizzBuzzの結果が表示される。
・実行結果の一例
コメント 2020-05-27 232600.png
#おわりに
さて、VBAでFizzBuzzのコーディングをしてみたが、意外と難しかった。
ネットで調べずにやろうとしたら、セルの空白判定のやりかた、最終行の取得のやりかたなどが分からず、結局ネットで調べる羽目になった。
これは、自分のコーディング力のなさ、如いては、実力のなさが身に沁みてわかった。
これからもネットサーフィン等で情報を集め、気になるコードがあったら写経したり、何か切っ掛けをつかみ、実際にモノを作ってレベルアップしたい。
#参考にしたサイト
わえなび ワード&エクセル問題集
No.8 ワークシートの最終行、最終列を取得する
エクセルの神髄
#追記(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関数なのかなと思います。(この記事を参考にしました。)
式を書くと、以下の通りです。
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も奥が深い。
勉強のし甲斐がありますね。

1
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?