生成AI活用研究
Geminiと100本ノック 22本目:FizzBuzz発展問題

Geminiを中心に生成AIの活用と研究の記録
公開日:2025-05-15 最終更新日:2025-05-15

Geminiと100本ノック 22本目:FizzBuzz発展問題


AIのGeminiがVBA100本ノックに挑戦!


Googleが開発した生成AIモデルのGeminiにVBA100本ノックをやってもらいました。
AIがVBAをどこまで扱えるかの実証実験の22本目です。

2025年3月からGemsが無料で使えるようになりました。
そこで、独自に作成したGem(名前は「AI神髄VBA」改良を続けている)を使った回答も掲載しています。


VBA100本ノックの出題と解答

VBA100本ノック 22本目:FizzBuzz発展問題
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

前回まではGeminiの回答は、キャプチャ画像とそのテキストにしていましたが今回からはテキストのみにします。
Geminiの回答であるというエビデンスの意味でキャプチャを掲載していましたが、さすがにもう必要はないでしょう。

Geminiの回答 Geminiへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
A列に1からの連番を出力してください。
ただし、
・3で割り切れる場合はB列に"Fizz"を出力。
・5で割り切れる場合はC列に"Buzz"を出力。
・両者で割り切れる場合はD列に"FizzBuzz"を出力。
※出力する数値範囲は適当に
はい、承知いたしました。VBAでA列に連番を出力し、3と5の倍数に応じてB, C, D列にそれぞれ"Fizz", "Buzz", "FizzBuzz"を出力するコードを作成します。出力範囲は例として1から100までとします。

以下のコードをVBAエディタに貼り付けて実行してください。

VBA
Sub FizzBuzz()

 Dim i As Long
 Dim maxRow As Long ' 出力する最大行

 ' 出力する数値の範囲を設定 (例: 1から100まで)
 maxRow = 100

 ' 既存のデータをクリア (必要に応じて)
 ' Columns("A:D").ClearContents

 For i = 1 To maxRow
  ' A列に連番を出力
  Cells(i, 1).Value = i

  ' 3と5の両方で割り切れる場合
  If i Mod 3 = 0 And i Mod 5 = 0 Then
   Cells(i, 4).Value = "FizzBuzz"
  ' 3で割り切れる場合
  ElseIf i Mod 3 = 0 Then
   Cells(i, 2).Value = "Fizz"
  ' 5で割り切れる場合
  ElseIf i Mod 5 = 0 Then
   Cells(i, 3).Value = "Buzz"
  End If
 Next i

 MsgBox "処理が完了しました。", vbInformation

End Sub

コードの説明:
  1. Sub FizzBuzz(): マクロの名前です。
  2. Dim i As Long: ループカウンターとなる変数 i を宣言します。
  3. Dim maxRow As Long: 出力する最後の行数を保持する変数です。ここでは100に設定しています。必要に応じてこの値を変更してください。
  4. Columns("A:D").ClearContents: (コメントアウトしています) 実行前にA列からD列までの既存のデータをクリアしたい場合にこの行のコメントアウトを解除してください。
  5. For i = 1 To maxRow: i を1から maxRow まで繰り返します。
  6. Cells(i, 1).Value = i: 現在の i の値をA列の i 行目に出力します。
  7. If i Mod 3 = 0 And i Mod 5 = 0 Then: i が3でも5でも割り切れるか(つまり15で割り切れるか)をチェックします。
    • 割り切れる場合は、Cells(i, 4).Value = "FizzBuzz" でD列に"FizzBuzz"を出力します。
  8. ElseIf i Mod 3 = 0 Then: 上記の条件に合わず、かつ i が3で割り切れるかをチェックします。
    • 割り切れる場合は、Cells(i, 2).Value = "Fizz" でB列に"Fizz"を出力します。
  9. ElseIf i Mod 5 = 0 Then: 上記のどの条件にも合わず、かつ i が5で割り切れるかをチェックします。
    • 割り切れる場合は、Cells(i, 3).Value = "Buzz" でC列に"Buzz"を出力します。
  10. End If: 条件分岐を終了します。
  11. Next i: i を次の値に進め、ループの最初に戻ります。
  12. MsgBox "処理が完了しました。", vbInformation: 処理が終了したことを知らせるメッセージボックスを表示します。
  13. End Sub: マクロの終了です。

VBAコードの実行方法:
  1. Excelを開きます。
  2. Alt + F11キーを押してVBAエディタを開きます。
  3. VBAエディタのメニューバーから「挿入」-> 「標準モジュール」を選択します。
  4. 開いた新しいモジュールに上記のコードをコピー&ペーストします。
  5. VBAエディタを閉じます (Alt + Q または 右上のXボタン)。
  6. Excelシートに戻り、Alt + F8キーを押してマクロのダイアログを開きます。
  7. リストから「FizzBuzz」を選択し、「実行」ボタンをクリックします。
これで、指定した範囲でA列に連番、条件に合わせてB, C, D列に"Fizz", "Buzz", "FizzBuzz"が出力されます。

これはもう動けば問題ないです。


AI神髄VBAへの出題とAI神髄VBAの回答

AI神髄VBAとは、GeminiのGems機能を使って作ったVBAに特化したカスタムAIです。
AI神髄VBAの回答 AI神髄VBAへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
A列に1からの連番を出力してください。
ただし、
・3で割り切れる場合はB列に"Fizz"を出力。
・5で割り切れる場合はC列に"Buzz"を出力。
・両者で割り切れる場合はD列に"FizzBuzz"を出力。
※出力する数値範囲は適当に
VBA
' 概要:指定範囲にFizzBuzzのルールに従って値を生成し出力します。
Sub GenerateFizzBuzz()
  ' 出力する行数を設定(例として100行)
  Const OutputRows As Long = 100
  Dim dataArrayA() As Variant
  Dim dataArrayB() As Variant
  Dim dataArrayC() As Variant
  Dim dataArrayD() As Variant
  Dim i As Long

  ' 配列のサイズを定義
  ' 1ベースの配列として定義
  ReDim dataArrayA(1 To OutputRows, 1 To 1)
  ReDim dataArrayB(1 To OutputRows, 1 To 1)
  ReDim dataArrayC(1 To OutputRows, 1 To 1)
  ReDim dataArrayD(1 To OutputRows, 1 To 1)

  ' 配列にデータを格納
  For i = 1 To OutputRows
    ' A列に連番を格納
    dataArrayA(i, 1) = i

    ' FizzBuzzの条件判定
    If i Mod 15 = 0 Then
      ' 15で割り切れる場合(3と5の両方で割り切れる)
      dataArrayD(i, 1) = "FizzBuzz"
    ElseIf i Mod 3 = 0 Then
      ' 3で割り切れる場合
      dataArrayB(i, 1) = "Fizz"
    ElseIf i Mod 5 = 0 Then
      ' 5で割り切れる場合
      dataArrayC(i, 1) = "Buzz"
    End If
  Next i

  ' シートへの書き出しを高速化するため画面描画を停止
  Application.ScreenUpdating = False

  ' 配列からシートに一括出力
  ' Sheet1は実際のシート名に合わせて適宜変更してください
  Sheet1.Range("A1").Resize(OutputRows, 1).Value = dataArrayA
  Sheet1.Range("B1").Resize(OutputRows, 1).Value = dataArrayB
  Sheet1.Range("C1").Resize(OutputRows, 1).Value = dataArrayC
  Sheet1.Range("D1").Resize(OutputRows, 1).Value = dataArrayD

  ' 画面描画を再開
  Application.ScreenUpdating = True

End Sub

VBAコードの解説

このVBAコードは、ExcelシートのA列に1からの連番を生成し、FizzBuzzのルールに従ってB列、C列、D列に文字列を出力します。パフォーマンスを向上させるために、配列を使用し、シートへの書き込み回数を最小限に抑えています。
  1. GenerateFizzBuzz プロシージャー: このコードのメインプロシージャーです。
  2. Const OutputRows As Long = 100: 出力する行数を OutputRows という名前の定数として定義しています。ここでは例として100行に設定しています。この値を変更することで、出力される連番の範囲を調整できます。
  3. Dim dataArrayA() As Variant, ...: A, B, C, D列に出力するデータを一時的に保持するための配列を宣言しています。Variant 型を使用することで、数値と文字列の両方を格納できます。
  4. ReDim dataArrayA(1 To OutputRows, 1 To 1), ...: 宣言した配列のサイズを OutputRows で指定した行数に合わせて再定義します。各配列は1列分のデータを保持するため、列数は1としています。1ベースの配列として定義することで、行番号と配列のインデックスを一致させています。
  5. For i = 1 To OutputRows: 1から OutputRows までの数値を順に処理するためのループです。
  6. dataArrayA(i, 1) = i: ループ変数 i の値を dataArrayA の現在の行に格納します。これがA列の連番となります。
  7. If i Mod 15 = 0 Then ... ElseIf i Mod 3 = 0 Then ... ElseIf i Mod 5 = 0 Then ... End If: FizzBuzzの条件判定を行います。
    • i Mod 15 = 0: i が15で割り切れる(3と5の両方で割り切れる)場合、dataArrayD に "FizzBuzz" を格納します。
    • i Mod 3 = 0: i が3で割り切れる場合、dataArrayB に "Fizz" を格納します。(15で割り切れる条件より後に判定することで、重複を防ぎます)
    • i Mod 5 = 0: i が5で割り切れる場合、dataArrayC に "Buzz" を格納します。(15で割り切れる条件より後に判定することで、重複を防ぎます)
  8. Application.ScreenUpdating = False: シートへの書き込み処理中に画面が更新されるのを停止します。これにより、処理速度が大幅に向上します。
  9. Sheet1.Range("A1").Resize(OutputRows, 1).Value = dataArrayA, ...: 各配列の内容を、対応する列の先頭セル(A1, B1, C1, D1)から OutputRows 分の範囲に一括して書き出します。配列を使用することで、セルへの個別書き込みループを避けることができ、高速なデータ出力が可能になります。Sheet1 の部分は、実際にデータを出力したいシート名に合わせて変更してください。
  10. Application.ScreenUpdating = True: データ出力が完了したら、画面描画を再度有効にします。
このコードは、配列と画面描画の停止を活用することで、大量のFizzBuzzデータを効率的かつ高速に生成し、シートに出力します。

出力の高速化に自ら対応してくれているのは良いですね。
ただ、なぜに1次元配列なんだろ・・・

AI神髄VBAの回答 AI神髄VBAへの出題
2次元配列で処理します
はい、承知いたしました。2次元配列を使用して、よりシンプルに処理するVBAコードを作成します。

VBA
' 概要:2次元配列を使用して、指定範囲にFizzBuzzのルールに従って値を生成し出力します。
Sub GenerateFizzBuzz_2DArray()
  ' 出力する行数を設定(例として100行)
  Const OutputRows As Long = 100
  ' 使用する列数を設定 (A, B, C, D の4列)
  Const OutputCols As Long = 4
  Dim dataArray() As Variant
  Dim i As Long

  ' 2次元配列のサイズを定義 (行, 列)
  ' 1ベースの配列として定義
  ReDim dataArray(1 To OutputRows, 1 To OutputCols)

  ' 配列にデータを格納
  For i = 1 To OutputRows
    ' A列 (1列目) に連番を格納
    dataArray(i, 1) = i

    ' FizzBuzzの条件判定と配列への格納
    If i Mod 15 = 0 Then
      ' 15で割り切れる場合(3と5の両方で割り切れる)
      ' D列 (4列目) に "FizzBuzz" を格納
      dataArray(i, 4) = "FizzBuzz"
    ElseIf i Mod 3 = 0 Then
      ' 3で割り切れる場合
      ' B列 (2列目) に "Fizz" を格納
      dataArray(i, 2) = "Fizz"
    ElseIf i Mod 5 = 0 Then
      ' 5で割り切れる場合
      ' C列 (3列目) に "Buzz" を格納
      dataArray(i, 3) = "Buzz"
    End If
    ' 条件に合わない場合、B, C, D列はVariantのデフォルト値 (Empty) のままとなり、
    ' シート出力時には空白セルとなります。
  Next i

  ' シートへの書き出しを高速化するため画面描画を停止
  Application.ScreenUpdating = False

  ' 2次元配列からシートに一括出力
  ' Sheet1は実際のシート名に合わせて適宜変更してください
  ' 例: ActiveSheet.Range("A1").Resize(OutputRows, OutputCols).Value = dataArray
  Sheet1.Range("A1").Resize(OutputRows, OutputCols).Value = dataArray

  ' 画面描画を再開
  Application.ScreenUpdating = True

End Sub

VBAコードの解説

このVBAコードは、単一の2次元配列を使用してFizzBuzzのデータを生成し、Excelシートに高速に出力します。
  1. GenerateFizzBuzz_2DArray プロシージャー: 2次元配列を使ったFizzBuzz生成のメイン処理です。
  2. Const OutputRows As Long = 100: 出力する行数を定義します。(例: 100行)
  3. Const OutputCols As Long = 4: 出力する列数(A, B, C, Dの4列)を定義します。
  4. Dim dataArray() As Variant: データを保持するための2次元配列を宣言します。
  5. ReDim dataArray(1 To OutputRows, 1 To OutputCols): 配列を、指定した行数と列数のサイズで再定義します。1ベースの配列を使用することで、Excelの行・列番号と合わせやすくなります。
  6. For i = 1 To OutputRows: 1から OutputRows までの数値をループ処理します。
  7. dataArray(i, 1) = i: ループ変数 i (連番) を配列の現在の行の1列目(A列に対応)に格納します。
  8. If i Mod 15 = 0 Then ... ElseIf ... End If: FizzBuzzの条件判定を行い、条件に合致する場合に、配列の対応する行の適切な列(2列目=B列, 3列目=C列, 4列目=D列)に "Fizz", "Buzz", または "FizzBuzz" を格納します。条件に合わないセルは、Variant型のデフォルト値である Empty のままになります。
  9. Application.ScreenUpdating = False: シートへの書き込み中の画面更新を停止し、処理速度を向上させます。
  10. Sheet1.Range("A1").Resize(OutputRows, OutputCols).Value = dataArray: 生成した2次元配列 dataArray の内容を、Sheet1 のA1セルを起点とした指定範囲に一括で書き出します。この一括書き出しが、高速化の鍵となります。Sheet1 は実際のシート名に合わせて変更してください。
  11. Application.ScreenUpdating = True: 処理完了後、画面描画を再度有効にします。
このコードは、データを一度配列に格納し、最後にシートに一括で書き出すことで、セルへの個別アクセスを最小限に抑え、大量データ処理において高いパフォーマンスを発揮します。また、単一の2次元配列を使用することで、コードがより簡潔になっています。

言えばちゃんと出来るのね。
つまり、もっとプロンプトの精度をあげれば良いのでしょうか。
とはいえ、VBAを知っている人が詳しくプロンプトを書かないといけないのでは、あまり意味が無くなってしまうきもします。




同じテーマ「生成AI活用研究」の記事

Geminiと100本ノック 19本目:図形のコピー
Geminiと100本ノック 20本目:ブックのバックアップ
Geminiと100本ノック 21本目:バックアップファイルの削除
Geminiと100本ノック 22本目:FizzBuzz発展問題
Geminiと100本ノック 23本目:シート構成の一致確認
Geminiと100本ノック 24本目:全角英数のみ半角
Geminiと100本ノック 25本目:マトリックス表をDB形式に変換
生成AIと100本ノック 26本目:ファイル一覧作成
生成AIと100本ノック 27本目:ハイパーリンクのURL
生成AIと100本ノック 28本目:シートをブックに分割
生成AIと100本ノック 29本目:画像の挿入


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ