生成AI活用研究
Geminiと100本ノック 7本目:日付データの扱い

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

Geminiと100本ノック 7本目:日付データの扱い


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


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


VBA100本ノックの出題と解答

VBA100本ノック 7本目:日付データの扱い
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

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

VBA問題
A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック

ユーザーから提供された画像ファイルを確認しました。A列には様々な形式で日付らしき文字列が入っています。

VBAでA列の文字列を日付として認識できるか判定し、日付であればB列に月末日を「mmdd」形式で出力し、それ以外は空白にする処理を記述します。

「日付とみなす」判定については、VBAの IsDate 関数を使用するのが最も簡単で一般的です。IsDate 関数は、引数の文字列が有効な日付に変換可能かどうかを判定します。ただし、IsDate 関数はOSの地域設定に影響を受ける可能性があるため、より厳密な判定が必要な場合は、Replace関数などで区切り文字を統一したり、TryParseのような自作関数を使用したりすることも検討できますが、今回は IsDate 関数を使用します。

以下に、この処理を行うVBAコード例を示します。

VBA
Sub ProcessDates()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート名") '処理対象のシート名に置き換えてください

Dim lastRow As Long
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

Dim i As Long
For i = 2 To lastRow '2行目から最終行まで処理 (1行目はヘッダーを想定)

  Dim dateString As String
  dateString = ws.Cells(i, "A").Value

  '日付として認識できるか判定
  If IsDate(dateString) Then
    '日付に変換
    Dim validDate As Date
    validDate = CDate(dateString)

    '月末日を計算
    Dim lastDayOfMonth As Date
    lastDayOfMonth = DateSerial(Year(validDate), Month(validDate) + 1, 0)

    'mmdd形式でB列に出力
    ws.Cells(i, "B").Value = Format(lastDayOfMonth, "mmdd")
  Else
    '日付以外はB列を空欄にする
    ws.Cells(i, "B").Value = ""
  End If

Next i

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

End Sub

コードの説明:
  1. Dim ws As Worksheet: ワークシートオブジェクトを宣言します。
  2. Set ws = ThisWorkbook.Sheets("シート名"): 処理を行うシートを指定します。「シート名」の部分を実際のシート名に置き換えてください。
  3. Dim lastRow As Long: データの最終行を格納する変数を宣言します。
  4. lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row: A列の最終行を取得します。
  5. For i = 2 To lastRow: 2行目から最終行までループ処理を行います。(1行目はヘッダーとしてスキップしています)
  6. Dim dateString As String: A列から取得した文字列を格納する変数を宣言します。
  7. dateString = ws.Cells(i, "A").Value: 現在の行のA列の値を dateString に格納します。A列の表示形式が文字列でも、.Value で内容を取得できます。
  8. If IsDate(dateString) Then: IsDate 関数を使って dateString が日付として有効かを判定します。
  9. validDate = CDate(dateString): IsDate が True の場合、CDate 関数を使って文字列を日付型のデータに変換します。
  10. lastDayOfMonth = DateSerial(Year(validDate), Month(validDate) + 1, 0): DateSerial 関数を使って月末日を計算します。Year(validDate) で年、Month(validDate) + 1 で翌月、0 を指定することで翌月の1日の前日、つまり当月末日が得られます。
  11. ws.Cells(i, "B").Value = Format(lastDayOfMonth, "mmdd"): 計算した月末日を Format 関数を使って「mmdd」形式の文字列に変換し、B列に出力します。
  12. Else: IsDate が False の場合(日付として認識できない場合)の処理です。
  13. ws.Cells(i, "B").Value = "": B列を空欄にします。
  14. Next i: 次の行の処理に移ります。
  15. MsgBox "処理が完了しました。", vbInformation: 処理がすべて完了したことをメッセージボックスで通知します。

使用方法:
  1. Alt + F11 キーを押してVBAエディターを開きます。
  2. 挿入タブから「標準モジュール」を選択します。
  3. 上記のコードをコピーして、標準モジュールに貼り付けます。
  4. コード内の "シート名" を実際に処理したいシートの名前に変更します。
  5. VBAエディターを閉じ、Excelシートに戻ります。
  6. Alt + F8 キーを押してマクロダイアログを開き、「ProcessDates」を選択して実行します。
このコードを実行すると、A列のデータを基にB列に月末日(mmdd形式)が出力されます。IsDate 関数がある程度の柔軟性を持って日付形式を判定するため、画像にあるような様々な形式の日付文字列に対応できると考えられます。

完璧です。
少なくともプロンプトの内容通りの処理となっていますし、VBAコードも言うことなしです。


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

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

2020.10.5
これも日付と判定されるようにしてください。
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック

はい、承知いたしました。「2020.10.5」のようなピリオド区切りの日付文字列も日付として正しく判定されるようにコードを修正します。

IsDate 関数は、システムの地域設定によってはピリオド区切りを認識しない場合があります。確実にするためには、判定する前にピリオド (.) をスラッシュ (/) またはハイフン (-) に置換してから判定する方法が有効です。ここではスラッシュに置換します。

修正したVBAコードは以下のようになります。

VBA
Sub ProcessDates_Revised()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート名") '処理対象のシート名に置き換えてください

Dim lastRow As Long
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

Dim i As Long
For i = 2 To lastRow '2行目から最終行まで処理 (1行目はヘッダーを想定)

  Dim dateString As String
  dateString = ws.Cells(i, "A").Value

  ' 判定用にピリオドをスラッシュに置換
  Dim checkDateString As String
  checkDateString = Replace(dateString, ".", "/")

  '日付として認識できるか判定
  If IsDate(checkDateString) Then
    '日付に変換 (置換後の文字列を使用)
    Dim validDate As Date
    validDate = CDate(checkDateString)

    '月末日を計算
    Dim lastDayOfMonth As Date
    lastDayOfMonth = DateSerial(Year(validDate), Month(validDate) + 1, 0)

    'mmdd形式でB列に出力
    ws.Cells(i, "B").Value = Format(lastDayOfMonth, "mmdd")
  Else
    '日付以外はB列を空欄にする
    ws.Cells(i, "B").Value = ""
  End If

Next i

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

End Sub

変更点:
  1. checkDateString = Replace(dateString, ".", "/") という行を追加しました。これは、A列から取得した元の文字列 (dateString) 中のピリオド (.) をすべてスラッシュ (/) に置き換えた新しい文字列 (checkDateString) を作成します。
  2. IsDate 関数と CDate 関数の引数を dateString から checkDateString に変更しました。これにより、ピリオドがスラッシュに置換された形式で日付判定と変換が行われるため、「2020.10.5」のような形式も正しく日付として認識されるようになります。
この修正により、ピリオド区切りの日付も考慮されるようになります。上記コードを再度標準モジュールに貼り付けて実行してください。

これも一発回答で、関心するばかりです。
変数の使い方として、最初のVBAにあったdateStringはそのままにして、
新たにcheckDateStringを宣言して、そこにピリオド (.) 置換した値を入れてチェックするようにしています。
ここは、人間でも書き方が分かれるところだと思います。
変数を増やすことを煩わしいと思う人と、データに合わせて追加していく。
もちろん、どちらも正当な理由なので、好みと時々によって変わってくると思います。




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

Geminiと100本ノック 4本目:セルの消去
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本ノック 12本目:セル結合の解除


新着記事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」をお願いいたします。
本文下部へ