生成AI活用研究
Geminiと100本ノック 8本目:点数の合否判定

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

Geminiと100本ノック 8本目:点数の合否判定


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


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


VBA100本ノックの出題と解答

VBA100本ノック 8本目:点数の合否判定
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

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

VBA問題
「成績表」シートに5教科の成績表があります。
以下の2条件を満たした者が合格となります。
・5教科合計が350点以上
・全ての科目が50点以上
G列に、合格者に対しては「合格」と出力し、不合格は空欄にしてください。
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック

はい、承知いたしました。VBAで「成績表」シートのG列に合否判定を出力するコードを作成します。

以下のVBAコードをAlt + F11を押してVBE(Visual Basic Editor)を開き、挿入 > 標準モジュールから新しいモジュールに貼り付けて実行してください。

VBA
Sub 合否判定()

 Dim ws As Worksheet
 Dim lastRow As Long
 Dim i As Long
 Dim totalScore As Long
 Dim passCriteria1 As Boolean ' 5教科合計が350点以上
 Dim passCriteria2 As Boolean ' 全ての科目が50点以上

 ' "成績表"シートを設定
 Set ws = ThisWorkbook.Sheets("成績表")

 ' データの最終行を取得 (B列を基準としています)
 lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

 ' 2行目から最終行までループ
 For i = 2 To lastRow

  ' 各行の5教科の合計点を計算 (B列からF列)
  totalScore = Application.Sum(ws.Cells(i, "B").Resize(1, 5))

  ' 5教科合計が350点以上か判定
  If totalScore >= 350 Then
   passCriteria1 = True
  Else
   passCriteria1 = False
  End If

  ' 全ての科目が50点以上か判定
  ' B列からF列の各セルをチェック
  passCriteria2 = True ' 初期値としてTrueを設定
  Dim j As Long
  For j = 2 To 6 ' B列(2)からF列(6)まで
   If ws.Cells(i, j).Value < 50 Then
    passCriteria2 = False ' 50点未満の科目があればFalseにする
    Exit For ' 1つでも条件を満たさない科目があればループを抜ける
   End If
  Next j

  ' 両方の条件を満たすか判定
  If passCriteria1 And passCriteria2 Then
   ' 条件を満たす場合はG列に「合格」と出力
   ws.Cells(i, "G").Value = "合格"
  Else
   ' 条件を満たさない場合はG列を空欄にする
   ws.Cells(i, "G").Value = ""
  End If

 Next i

 ' メモリの解放
 Set ws = Nothing

 MsgBox "合否判定が完了しました。", vbInformation

End Sub

コードの解説:
  1. Sub 合否判定(): マクロの開始を宣言します。
  2. 変数の宣言: 使用する変数を宣言します。
    • ws: 「成績表」シートを扱うためのWorksheetオブジェクト。
    • lastRow: データがある最終行を格納する変数。
    • i: 行番号をループさせるための変数。
    • totalScore: 5教科の合計点を格納する変数。
    • passCriteria1, passCriteria2: 各合格条件を満たすかを真偽値で保持する変数。
  3. Set ws = ThisWorkbook.Sheets("成績表"): "成績表"という名前のシートをwsオブジェクトに設定します。シート名が異なる場合はここを変更してください。
  4. lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row: B列の一番下からCtrl + ↑と同じ動作で、データが入っている最終行の行番号を取得します。
  5. For i = 2 To lastRow: 2行目から最終行まで、1行ずつ処理を繰り返します。
  6. totalScore = Application.Sum(ws.Cells(i, "B").Resize(1, 5)): 現在の行 (i) のB列からF列までの5つのセルの合計値を計算します。Resize(1, 5)は、指定したセル(ws.Cells(i, "B"))から1行、5列の範囲を指定するものです。
  7. If totalScore >= 350 Then ... End If: 合計点が350点以上か判定し、passCriteria1に結果(TrueまたはFalse)を格納します。
  8. passCriteria2 = True: 全ての科目が50点以上であるかの判定の前に、一旦passCriteria2をTrueに設定します。
  9. For j = 2 To 6 ... Next j: B列からF列(列番号で2から6)までをループします。
  10. If ws.Cells(i, j).Value < 50 Then ... End If: 現在の行 (i)、現在の列 (j) のセルの値が50未満かどうかを判定します。
  11. passCriteria2 = False: 50点未満の科目が見つかった場合、passCriteria2をFalseにします。
  12. Exit For: 1つでも50点未満の科目があれば、それ以上同じ行の科目をチェックする必要はないため、内側のループ(For j)を抜けます。
  13. If passCriteria1 And passCriteria2 Then ... Else ... End If: passCriteria1とpassCriteria2の両方がTrue(And条件)であるか判定します。]
  14. ws.Cells(i, "G").Value = "合格": 両方の条件を満たす場合、現在の行 (i) のG列に"合格"と出力します。
  15. ws.Cells(i, "G").Value = "": 条件を満たさない場合、現在の行 (i) のG列を空欄にします。
  16. Next i: 次の行の処理に移ります。
  17. Set ws = Nothing: 使用したオブジェクトのメモリを解放します。
  18. MsgBox "合否判定が完了しました。", vbInformation: 処理が完了したことを示すメッセージボックスを表示します。
このコードを実行すると、「成績表」シートのG列に指定された条件に基づいた合否判定結果が表示されます。

特に問題はありませんが、もう少し簡潔な書き方にしたいところです。


GeminiへのVBAコードの改善提案

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

少しVBAコードが冗長に感じます。
もう少し短く簡潔にしてください。
VBA マクロ Gemini 100本ノック

はい、承知いたしました。Application.SumとApplication.Min関数を使うことで、より簡潔に記述できます。

以下のVBAコードを試してみてください。

VBA
Sub 合否判定簡潔版()

 Dim ws As Worksheet
 Dim lastRow As Long
 Dim i As Long

 ' "成績表"シートを設定
 Set ws = ThisWorkbook.Sheets("成績表")

 ' データの最終行を取得 (B列を基準としています)
 lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

 ' 2行目から最終行までループ
 For i = 2 To lastRow

  ' 5教科の合計点が350点以上 かつ 全ての科目が50点以上か判定
  ' Application.Sum で合計を計算
  ' Application.Min で範囲内の最小値を計算
  If Application.Sum(ws.Cells(i, "B").Resize(1, 5)) >= 350 And _
    Application.Min(ws.Cells(i, "B").Resize(1, 5)) >= 50 Then

   ' 両方の条件を満たす場合はG列に「合格」と出力
   ws.Cells(i, "G").Value = "合格"
  Else
   ' 条件を満たさない場合はG列を空欄にする
   ws.Cells(i, "G").Value = ""
  End If

 Next i

 ' メモリの解放
 Set ws = Nothing

 MsgBox "合否判定が完了しました。", vbInformation

End Sub

変更点:
  • 5教科の合計計算にApplication.Sumを使用しました。
  • 全ての科目が50点以上であるかの判定に、範囲内の最小値を求めるApplication.Minを使用しました。最小値が50以上であれば、全ての科目が50以上であると判断できます。
  • これらの判定を直接Ifステートメント内で combined logic (AND) として記述し、変数passCriteria1やpassCriteria2を不要にしました。
これにより、最初のコードよりも短く、より簡潔な表現になっています。

やればできるじゃないですか。
ただし、そもそも、コードが短い方が良いと思っているのは愚かな人間だけです。
そしてそれは、職人気取りの人に多くみられる気がします。
そういう人はAIに職を追われないようにしてください。
冗談ですよ(笑)
とはいえ、AIにコードを書いてもらってコピペするなら、多少のコードの長短は無問題ですね。




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

Geminiと100本ノック 5本目:セルの計算
Geminiと100本ノック 6本目:セルに計算式
Geminiと100本ノック 7本目:日付データの扱い
Geminiと100本ノック 8本目:点数の合否判定
Geminiと100本ノック 9本目:フィルターコピー
Geminiと100本ノック 10本目:行の削除
Geminiと100本ノック 11本目:セル結合の警告
Geminiと100本ノック 12本目:セル結合の解除
Geminiと100本ノック 13本目:文字列の部分フォント
Geminiと100本ノック 14本目:社外秘シート削除
Geminiと100本ノック 13本目:文字列の部分フォント


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

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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