生成AI活用研究
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!

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

第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!


身近なExcel業務の具体的な事例を通して、AIとVBAを組み合わせてどのように作業を劇的に効率化できるかを実践的に学びます。成功体験を積み重ねましょう。


ストーリーで追体験!主人公は「あなた」

第3章までで、あなたはAIを使ってVBAを学び、プロンプトを工夫すれば、欲しい情報やコードを自在に引き出せる力を身につけました。
ここまでは、運転教習所で基本操作を学んだ段階。ここからは、いよいよ実際の「公道」に出て、実務というリアルな道を走り出します。
Excelを舞台に、あなたの頼れるAIアシスタントと、作業を自動化するVBAという二刀流の武器が、あなたの手の中にそろいました。
いよいよここからが本番です。あなたが普段向き合っている、あの手ごわいExcel業務。時間のかかるデータ入力、複雑な集計、毎週繰り返される定型作業…。それらの「困った」一つひとつに、強力なアシスタントであるAIとVBAの二刀流で立ち向かいます。AIは単にコードを生成するだけでなく、あなたの課題解決を一緒に考え、必要な手順やヒントを示してくれる、まさにあなたの右腕となってくれる存在です。

この章は、単なる「事例紹介」ではありません。すべてのケースに、あなたが主人公となるストーリーがあります。登場するケースは、きっとあなたのExcel作業にも共通する「あるある」な悩みのはずです。

「そうそう、この作業、いつも面倒なんだよな…」
「もっと早く終わらせたいけど、どうしたらいいんだろう…」

そんなあなたの心の声に寄り添いながら、ストーリー形式でAIとVBAを使った解決プロセスを追体験してもらいます。
各事例では、まず業務の課題を明確にし、「AIとVBAを使わなかったらいかに大変か」を再認識します。次に、どのようにあなたのAIアシスタントに相談し、どのようなVBAコードを生成してもらい、そしてそのコードをどう活用するのかを具体的に示します。

コードの意味が分からなくても大丈夫。第3章で学んだように、分からない部分はいつでもAIアシスタントに質問できます。そして、重要なのはコードを「書く」ことではなく、AIに「生成してもらう」こと、そしてそれを「理解し、活用する」ことです。

AIとVBAの力で、あなたのExcel作業に革命を起こしましょう。最初の一歩が、未来の働き方を変えるはずです。


目次



事例1:【データ整形】数時間かかっていた入力規則チェックが数秒に!

あなたのExcel作業の「困った」に、AIとVBAの二刀流で立ち向かう最初のストーリーです。多くの人が経験するであろう、あの地味で時間のかかる作業を劇的に変える様子を追体験してみましょう。

【シナリオ】部署名やメアドがバラバラ!担当者リストの困った実態

あなたが普段、頻繁に開くExcelファイルの中に、「担当者リスト」という名のシートがあると想像してください。
このシートには、社内のメンバーの氏名、部署、役職、連絡先といった基本的な情報が一覧になっています。

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門

項目
A列 ID 1, 2, 3...
B列 氏名 山田太郎、佐藤花子...
C列 部署名 営業部、開発部、経理部...
D列 役職名 部長、課長、主任...
E列 電話番号 03-XXXX-XXXX
F列 メールアドレス yamada@example.com

このリストは、連絡先確認、会議の参加者リスト作成、社内システムへのデータ取り込みなど、様々な業務で活用される重要な情報源です。
しかし、困ったことに、このリストは複数の担当者が各自で追記・修正を行っています。その結果、入力ルールが守られず、データの表記がバラバラになってしまう問題が慢性的に発生していました。
  • 部署名・役職名: 「営業部」「営業」「第一営業」「課長」「マネージャー」「Kacho」など、同じ意味なのに違う表記が混在。
  • メールアドレス: 「@」が入っていない、全角になっている、余分な文字が含まれるなど、形式が不適切。

これらの「汚れた」データが混じっていると、リストを使った集計や他のシステムとの連携時にエラーが発生したり、誤った情報で連絡してしまうといったトラブルにつながります。そのため、あなたは定期的にこのリストを目視や手作業のフィルタリングでチェックし、修正する作業に追われていました。

手作業でのチェック、その「苦しみ」とは?

この担当者リストの入力規則チェックは、まさに根気のいる作業です。数百、数千行にもなるデータを相手に、あなたは毎回以下のような「苦しみ」を味わっていました。
  • 目視での確認: データをひたすら目で追っていく作業。行数が多いと目が滑って見落としが発生しやすく、数時間があっという間に過ぎていきます。集中力も維持するのが困難です。
  • フィルタリング: 部署名や役職名をフィルタで絞り込み、「あれ?この表記はおかしいな」と一つずつ確認する方法。これも表記ゆれのパターンが多いと、何度もフィルタをかけ直す必要があり、非常に手間がかかります。また、完全にランダムな入力ミスは見つけにくいという欠点もあります。
  • メールアドレスのチェック: メールアドレスの形式を目視でチェックするのはさらに大変です。「@」があるか、.があるか、全角文字が混じっていないかなど、パターンが多い上に間違いに気づきにくいのです。正規表現のような専門知識がなければ、手作業での完璧なチェックはほぼ不可能です。

リストの行数が多ければ多いほど、この作業にかかる時間は膨大になり、正直「誰か自動でやってくれないかな…」と、うんざりしているのではないでしょうか。あなたの貴重な時間が、こういった定型的なデータ修正作業に奪われてしまっています。

AIアシスタントに相談してみよう!

そこで登場するのが、あなたのAIアシスタントとVBAです。この面倒なチェック作業を自動化するためのVBAコードを、あなたのAIアシスタントにお願いしてみましょう。
AIへの相談(プロンプト)を考える際は、第3章で学んだテクニックを思い出してください。「何を」「どうしたいのか」を具体的に、そしてAIが理解しやすいように伝えます。
今回のゴールは「指定した条件に合わないデータを自動で見つけて、色をつけて教えてもらう」ことです。

必要な情報は以下の通りです。
  • どのExcelファイルか(通常はアクティブなファイルでOK)
  • どのシートか(例: 「担当者リスト」シート)
  • チェックしたい列はどこか(例: 部署名がC列、役職名がD列、メールアドレスがF列)
  • それぞれの列でチェックしたい条件は何か
    部署名・役職名:指定したリスト(正規の表記一覧)に含まれているか
    メールアドレス:メールアドレスの形式として適切か(最低限「@」が1つ含まれているかなど)
  • 条件に合わないセルをどうしたいか(例: セルの背景色を黄色にする)

これらの情報を整理して、AIにプロンプトを作成します。

プロンプト例

あなたのAIアシスタントに、以下のように話しかけてみましょう。
Excel VBAのコードを生成してください。
シート名「担当者リスト」のC列(部署名)とD列(役職名)の入力規則をチェックしたいです。
C列のデータは、以下のリストに含まれているか確認してください。
['営業部', '開発部', '経理部', '人事部', '広報部', '総務部']
D列のデータは、以下のリストに含まれているか確認してください。
['部長', '課長', '係長', '主任', '一般']
これらのリストに含まれていないデータがあるセルは、そのセルの背景色を薄い黄色(例:ColorIndex=6)にしてください。

さらに、同じシートのF列(メールアドレス)もチェックしたいです。
F列のデータがメールアドレスの形式として適切か(具体的には「@」記号が1つ含まれているか)を確認してください。
「@」が含まれていない、または複数含まれているセルも、背景色を薄い黄色にしてください。

チェックはデータの入力されている最終行までを行ってください。
チェックを開始する行は2行目(見出し行を除く)からとします。
コードを実行するたびに、前回のチェックで色をつけたセルをクリアする処理も追加してください。
コードには、それぞれの処理が何をしているか分かるようにコメントも入れてください。
ポイント:
  • シート名、列、条件リストなどを具体的に指定します。
  • どのようなチェックを行いたいか(リストに含まれるか、特定の文字が含まれるか)を明確に伝えます。
  • 条件に合わなかった場合の処理(セルの色付け)を指定します。
  • チェック範囲(開始行、最終行まで)を指定します。
  • 繰り返し実行することを考えて、前回の色をクリアする指示も加えます。
  • コードの理解のためにコメントを要求します。

AIアシスタントからの回答(VBAコード例と解説)

AIはあなたのプロンプトを理解し、以下のようなVBAコードと解説を生成してくれるでしょう。

VBA
Sub CheckInputData()

  Dim ws As Worksheet
  Dim lastRow As Long
  Dim i As Long
  Dim departmentList As Variant
  Dim positionList As Variant
  Dim cellValue As String

  '--- 設定 ---
  ' チェック対象シート名
  Const SHEET_NAME As String = "担当者リスト"
  ' チェック開始行
  Const START_ROW As Long = 2
  ' 条件に合わない場合の背景色 (薄い黄色)
  Const HIGHLIGHT_COLOR As Long = 6 ' ColorIndex 6は黄色

  ' 部署名の正規リスト
  departmentList = Array("営業部", "開発部", "経理部", "人事部", "広報部", "総務部")
  ' 役職名の正規リスト
  positionList = Array("部長", "課長", "係長", "主任", "一般")
  '----------------

  ' シートを設定
  On Error Resume Next ' シートが存在しない場合のエラーを無視
  Set ws = ThisWorkbook.Sheets(SHEET_NAME)
  On Error GoTo 0   ' エラーハンドリングを元に戻す

  If ws Is Nothing Then
    MsgBox SHEET_NAME & "というシートが見つかりません。", vbCritical
    Exit Sub
  End If

  ' 前回のチェックで付けた色をクリア
  ' 使用済みのセル範囲全体の色をクリアすることも可能ですが、ここでは対象列のみクリアします
  With ws
    .Columns("C:D").Interior.ColorIndex = xlNone ' C列とD列の色をクリア
    .Columns("F").Interior.ColorIndex = xlNone ' F列の色をクリア
  End With

  ' データの最終行を取得
  ' C, D, F列のいずれかでデータがある最終行を想定します
  lastRow = ws.Cells.SpecialCells(xlCellTypeLastCell).Row
  ' より確実に特定の列(例: A列)の最終行を取得する場合:
  ' lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

  ' データがある最終行が開始行より小さい場合は処理を終了
  If lastRow < START_ROW Then
    MsgBox "チェック対象のデータがありません。", vbInformation
    Exit Sub
  End If

  ' 各行をループしてチェック
  For i = START_ROW To lastRow

    '--- C列 (部署名) のチェック ---
    cellValue = Trim(ws.Cells(i, "C").Value) ' 前後の空白を除去
    ' リストに含まれているか判定
    If Not IsInArray(cellValue, departmentList) Then
      ws.Cells(i, "C").Interior.ColorIndex = HIGHLIGHT_COLOR ' 色付け
    End If

    '--- D列 (役職名) のチェック ---
    cellValue = Trim(ws.Cells(i, "D").Value) ' 前後の空白を除去
    ' リストに含まれているか判定
    If Not IsInArray(cellValue, positionList) Then
      ws.Cells(i, "D").Interior.ColorIndex = HIGHLIGHT_COLOR ' 色付け
    End If

    '--- F列 (メールアドレス) のチェック ---
    cellValue = Trim(ws.Cells(i, "F").Value) ' 前後の空白を除去
    ' "@"が含まれているか、かつ1つだけかを簡易的にチェック
    ' より厳密なメールアドレス形式チェックは別途関数を用意するか、AIに依頼することも可能です
    If InStr(cellValue, "@") = 0 Or InStr(cellValue, "@") <> InStrRev(cellValue, "@") Then
       ws.Cells(i, "F").Interior.ColorIndex = HIGHLIGHT_COLOR ' 色付け
    End If

  Next i

  MsgBox "入力規則チェックが完了しました。", vbInformation

End Sub

' 配列に値が含まれているか判定する補助関数
Function IsInArray(findValue As String, arr As Variant) As Boolean
  Dim element As Variant
  IsInArray = False ' 初期値はFalse
  For Each element In arr
    ' StrComp関数で大文字小文字を区別せずに比較
    If StrComp(findValue, element, vbTextCompare) = 0 Then
      IsInArray = True ' 見つかったらTrueにして終了
      Exit Function
    End If
  Next element
End Function

(AIからの簡単な解説)
このコードは、指定されたシートのC列、D列、F列のデータを上から順にチェックします。
C列とD列は、それぞれコードの中に書かれたリスト(配列)にデータが含まれているかを確認し、リストにない場合はセルに色をつけます。
F列は、「@」記号が1つだけ含まれているかを確認し、条件に合わない場合にセルに色をつけます。
コードの最初に、前回チェックで色をつけたセルがあれば、その色を消す処理も入っています。また、リストに含まれているかの判定には、新しくIsInArrayという関数を定義して使っています。

コードを貼り付けて実行してみよう!

AIが生成してくれたコードを、あなたのExcelファイルで実行してみましょう。
  1. VBEを開く: Alt + F11キーを押してVBAエディター(VBE)を開きます。
  2. 標準モジュールの挿入: VBEのメニューから「挿入」>「標準モジュール」を選択します。新しいモジュールが表示されます。
  3. コードの貼り付け: AIが生成したVBAコードを、まっさらなモジュール画面に貼り付けます。
  4. シート名や条件の確認と修正:
    • コード内の Const SHEET_NAME As String = "担当者リスト" の部分が、実際にチェックしたいシートの名前と一致しているか確認してください。もしシート名が違う場合は、ここを修正します。
    • departmentList = Array(...)positionList = Array(...) の中のリストの内容が、あなたの正規の表記リストと一致しているか確認し、必要であれば修正・追加してください。
    • メールアドレスのチェック条件をもっと厳密にしたい場合は、AIに相談してコードを修正してもらうことも可能です(例:「正規表現を使ってより厳密なメールアドレス形式チェックに修正してください」)。
  5. 実行: VBEのツールバーにある「実行」ボタン(緑色の再生マーク)をクリックするか、F5キーを押します。「Sub/ユーザーフォームの実行」ダイアログが表示されたら、「CheckInputData」が選択されていることを確認して「実行」をクリックします。

Excelシートに戻ると、どうでしょう? 指定した条件に合わないデータが入っているセルに、薄い黄色(ColorIndex=6)の色がついているはずです。

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門

このコードは何をしているの?(超簡易解説)

AIが生成したコードの全てを理解する必要はありませんが、主な部分だけ簡単に見てみましょう。
  • Sub CheckInputData() から End Sub までが、今回実行する一連の処理です。この名前(CheckInputData)が、実行時に選択したマクロ名になります。
  • Dim ... As ... は、これから使う変数(データを一時的に入れておく箱)を宣言しています。
  • Const ... As ... は、後から変わらない値(定数)を定義しています。シート名や色番号などがこれにあたります。
  • departmentList = Array(...) や positionList = Array(...) で、チェックするための正規のリストをVBAの「配列」という形で定義しています。
  • ws.Columns("C:D").Interior.ColorIndex = xlNone のような行で、セルの色を透明(色なし)に戻しています。これが前回のチェック結果をクリアする処理です。
  • lastRow = ... で、データが入力されている最終行を自動で取得しています。
  • For i = START_ROW To lastRow ... Next i は、指定した開始行(START_ROW)から最終行(lastRow)までを、1行ずつ繰り返して処理するための構文です。変数 i が現在の行番号を表します。
  • ws.Cells(i, "C").Value で、現在の行(i)のC列のセルの値を取得しています。
  • If Not IsInArray(...) Then ... End If や If InStr(...) = 0 Or ... Then ... End If の部分で、それぞれのセルが条件に合っているか(または合っていないか)を判定しています。
  • 条件に合わなかった場合、ws.Cells(i, "C").Interior.ColorIndex = HIGHLIGHT_COLOR のように、そのセルに指定した色をつけています。
  • IsInArray 関数は、指定した値が配列の中に含まれているかを確認するために、AIが一緒に作ってくれた便利な補助機能です。コードの下の方に書かれています。

もしコードの内容をもっと詳しく知りたい場合は、コードの一部を選択してAIに「この部分は何をしていますか?」「この IsInArray 関数は何をしていますか?」などと質問すれば、詳しく解説してくれますよ。

数時間かかっていた作業が数秒に!

どうでしょう? 数十行、数百行、あるいは数千行あるかもしれない担当者リストのチェックが、VBAコードを実行した一瞬で完了しました。これまであなたが何時間もかけて目視やフィルタリングで探していた「表記ゆれ」や「形式のおかしいメールアドレス」が、自動でハイライトされているはずです。

見落としの心配も格段に減り、作業時間は劇的に短縮されました。これが、AIとVBAの力を組み合わせた「書かない自動化」の威力です!あなたは、このコードを一度作成してしまえば、リストが更新されるたびにワンクリックでチェック作業を完了させることができるようになります。

この事例から学べること、そして応用

この事例から、以下のことを実感できたのではないでしょうか。
  • 具体的な課題の解決: 日々の面倒なExcel作業(データチェックや整形)が、AIとVBAで自動化できること。
  • AIへの相談力: 何を自動化したいか、条件は何かを明確に伝えるプロンプトの重要性。今回は、リストチェックと特定の文字列チェックという複数の条件を組み合わせてお願いしました。
  • コード活用の手軽さ: 生成されたコードを貼り付けて実行するだけで、複雑な処理が実現できること。そして、必要に応じてAIに修正をお願いできること。

今回行ったのは「入力規則チェック」ですが、この考え方は他の様々なデータチェックにも応用できます。
  • 商品リストのマスタデータとの照合(商品コードがマスタに存在するか)
  • 数値データが特定の範囲内にあるかのチェック(売上数が閾値を下回っていないかなど)
  • 日付データが正しい形式かどうかのチェック

など、あなたの業務に合わせてプロンプトを修正し、AIに新しいコードを生成してもらうことで、無限に応用が可能です。
この成功体験を元に、次の事例にも挑戦してみましょう!


事例2:【条件判定・抽出】毎週のレポート作成、複雑な集計も自動化!

データが溜まるにつれて大変になるのが、特定の条件に合うデータだけを取り出して集計する作業です。
毎週、毎月、あるいは決まったタイミングで発生する定型レポート作成業務は、多くのExcelユーザーの悩みの種ではないでしょうか。
ここでもAIとVBAの二刀流が、あなたの強力な味方になります。

【シナリオ】毎週金曜日が憂鬱…週次売上レポート作成

あなたは営業部で、日々の売上データをExcelで管理しています。
全売上データというシートには、以下のような形式でデータが日々追加されていきます。

項目
A列 日付 2024/10/21
B列 地域 関東、関西、中部...
C列 顧客名 〇〇商事、△△物産、株式会社□□...
D列 商品カテゴリ Aカテゴリ、Bカテゴリ、Cカテゴリ...
E列 売上金額 50000

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門

このデータを使って、あなたは毎週金曜日の午後に「週次主要顧客売上レポート」を作成し、上司に提出する業務を任されています。レポートの内容は、以下の条件を全て満たす売上データだけを抽出し、その合計金額と件数を集計するというものです。
  • 条件1: 日付が今週(レポート作成日を含む直近7日間)であること
  • 条件2: 地域が「関東」または「関西」であること
  • 条件3: 顧客名が「〇〇商事」または「△△物産」であること
  • 条件4: 商品カテゴリが「Aカテゴリ」であること

抽出したデータは、週次レポートという別のシートに貼り付け、その下に集計結果を記載する必要があります。

手作業でのレポート作成、その「苦しみ」とは?

売上データが増えれば増まるほど、この週次レポート作成は時間と手間がかかる作業になります。手作業で行う場合、あなたは毎回このような手順を踏んでいるのではないでしょうか。
  1. 日付でのフィルタリング: まず、全売上データシートを日付でフィルタリングし、今週のデータだけを表示させます。
  2. 地域・顧客名・商品カテゴリでのフィルタリング: さらに、表示された今週のデータに対して、地域、顧客名、商品カテゴリの条件で複数回フィルタリングを行います。複数の条件を組み合わせるのが結構大変です。
  3. データのコピー&ペースト: 条件に合うデータが表示されたら、それをコピーして週次レポートシートに貼り付けます。見出し行も忘れずにコピーする必要があります。
  4. 合計と件数の集計: 貼り付けたデータに対して、SUM関数やCOUNT関数(あるいはSUBTOTAL関数)を使って合計金額と件数を手動で計算し、レポートシートの指定箇所に記載します。
  5. レポートシートの整形: タイトルや見出しを整えたり、前回のデータをクリアしたりする作業も毎回必要です。

この一連の作業は、データの量によっては数時間かかることも珍しくありません。また、フィルタリングの設定ミスやコピー&ペーストの範囲間違いなど、ヒューマンエラーも発生しやすいです。そして、せっかくの金曜日の午後の貴重な時間が、こういった定型作業に奪われてしまうのは、大きな「苦しみ」です。

AIアシスタントに相談してみよう!

この定型的な週次レポート作成業務も、AIアシスタントとVBAの力で劇的に効率化できます。先ほどの手作業での手順をVBAで自動化するコードを、AIに生成してもらいましょう。

プロンプトを考える際は、作業の手順と条件、そして最終的な出力形式を具体的に伝えます。

必要な情報は以下の通りです。
  • 元データがあるシート名(例: 全売上データ)
  • レポートを出力したいシート名(例: 週次レポート)
  • 元データシートの各列が何を表しているか(日付、地域、顧客名、商品カテゴリ、売上金額)
  • データを抽出するための具体的な条件(日付、地域、顧客名、商品カテゴリ)
  • 抽出したデータをレポートシートのどこに貼り付けるか
  • レポートシートに記載したい集計項目(合計金額、件数)と、それをどこに表示するか
  • レポートシートのクリア処理が必要なこと

これらの情報を整理して、AIにプロンプトを作成します。

プロンプト例

あなたのAIアシスタントに、以下のように話しかけてみましょう。
Excel VBAコードを作成してください。
シート名「全売上データ」のデータを基に、週次レポートを自動作成したいです。
「全売上データ」シートの構成は以下の通りです。
A列: 日付、B列: 地域、C列: 顧客名、D列: 商品カテゴリ、E列: 売上金額
1行目は見出しです。データは2行目から入力されています。

抽出条件は以下の全てを満たす行とします。
1. 日付がコードを実行した日を含む直近7日間であること。
2. 地域が「関東」または「関西」であること。
3. 顧客名が「〇〇商事」または「△△物産」であること。
4. 商品カテゴリが「Aカテゴリ」であること。

抽出したデータ(見出し行を含む)を、シート名「週次レポート」に貼り付けてください。
「週次レポート」シートは、コード実行前に内容をクリアしてください。
抽出データは「週次レポート」シートのA1セルから開始してください。

抽出したデータの合計金額と件数を計算し、レポートシートの抽出データの最終行の次の行に表示してください。
例えば、抽出データが10行目まである場合、11行目に合計と件数を表示します。
合計金額は「売上金額」列(E列)の合計です。件数は抽出データの行数(見出し行を除く)です。
合計金額の行のA列に「合計」、件数の行のA列に「件数」と表示してください。
コードにはコメントを入れて、処理内容が分かるようにしてください。
ポイント:
  • 元データとレポートシートの構造を明確に伝えます。
  • 抽出条件を箇条書きで具体的に指定します。日付条件(今週)のような相対的な条件も指示できます。
  • 抽出データの貼り付け先と、レポートシートのクリアを指示します。
  • 集計したい項目(合計金額、件数)と、その表示場所を指定します。
  • 見出し行をどう扱うか(抽出データに含めるか)も指示します。

AIアシスタントからの回答(VBAコード例と解説)


AIはあなたのプロンプトを理解し、以下のようなVBAコードと解説を生成してくれるでしょう。やや複雑な処理になりますが、AIが適切にコードを組み立ててくれます。(※このコードは事例3でデバッグする前のコードです)

VBA
Sub CreateWeeklyReport()

  Dim wsData As Worksheet ' 元データシート
  Dim wsReport As Worksheet ' レポート出力シート
  Dim lastRowData As Long ' 元データシートの最終行
  Dim i As Long ' ループ用変数
  Dim reportRow As Long ' レポートシートの書き込み行
  Dim totalSales As Double ' 合計売上金額
  Dim dataCount As Long ' データ件数
  Dim startDate As Date ' 集計開始日 (今週の始まり)
  Dim endDate As Date ' 集計終了日 (今日)

  '--- 設定 ---
  Const DATA_SHEET_NAME As String = "全売上データ"
  Const REPORT_SHEET_NAME As String = "週次レポート"
  Const DATA_START_ROW As Long = 2 ' 元データの開始行 (見出しの次)
  '----------------

  ' シートを設定
  On Error Resume Next
  Set wsData = ThisWorkbook.Sheets(DATA_SHEET_NAME)
  Set wsReport = ThisWorkbook.Sheets(REPORT_SHEET_NAME)
  On Error GoTo 0

  ' シートが存在しない場合のエラー処理
  If wsData Is Nothing Then
    MsgBox DATA_SHEET_NAME & "というシートが見つかりません。", vbCritical
    Exit Sub
  End If
  If wsReport Is Nothing Then
    ' レポートシートが存在しない場合は新しく作成することも可能です
    MsgBox REPORT_SHEET_NAME & "というシートが見つかりません。作成してください。", vbCritical
    Exit Sub
  End If

  ' レポートシートの内容をクリア
  wsReport.Cells.ClearContents ' シート全体をクリア

  ' レポートシートに見出しをコピー
  ' 元データシートの1行目を見出しとしてコピー
  wsData.Rows(1).Copy wsReport.Rows(1)
  reportRow = 2 ' レポートシートの書き込み開始行

  ' 今週の開始日と終了日を計算
  ' Weekday関数で今日が週の何日目かを取得 (日曜=1, 月曜=2, ...)
  ' Today()で今日の日付を取得
  endDate = Date ' 今日
  startDate = endDate - Weekday(endDate, vbMonday) + 1 ' 今週の月曜日を計算 <--- この部分が問題の箇所

  ' 元データシートの最終行を取得
  lastRowData = wsData.Cells(Rows.Count, "A").End(xlUp).Row

  ' データがある最終行が見出し行より小さい場合は処理を終了
  If lastRowData < DATA_START_ROW Then
    MsgBox "チェック対象のデータがありません。", vbInformation
    Exit Sub
  End If

  ' 元データをループして抽出条件を満たす行を探す
  totalSales = 0 ' 合計金額の初期化
  dataCount = 0 ' 件数の初期化

  For i = DATA_START_ROW To lastRowData

    ' 各列のデータを取得
    Dim currentDate As Date
    Dim currentRegion As String
    Dim currentCustomer As String
    Dim currentCategory As String
    Dim currentSales As Double

    ' エラー回避のため、On Error Resume Next で日付変換エラーなどを無視
    On Error Resume Next
    currentDate = wsData.Cells(i, "A").Value ' 日付
    currentRegion = wsData.Cells(i, "B").Value ' 地域
    currentCustomer = wsData.Cells(i, "C").Value ' 顧客名
    currentCategory = wsData.Cells(i, "D").Value ' 商品カテゴリ
    currentSales = wsData.Cells(i, "E").Value ' 売上金額
    On Error GoTo 0 ' エラーハンドリングを元に戻す

    '--- 抽出条件の判定 ---
    Dim condition1 As Boolean ' 日付条件
    Dim condition2 As Boolean ' 地域条件
    Dim condition3 As Boolean ' 顧客名条件
    Dim condition4 As Boolean ' 商品カテゴリ条件

    ' 1. 日付が今週の範囲内か判定 (日付データとして有効な場合のみ)
    If IsDate(currentDate) Then
       If currentDate >= startDate And currentDate <= endDate Then
         condition1 = True
       Else
         condition1 = False
       End If
    Else
      condition1 = False ' 日付データとして無効な場合は条件を満たさない
    End If


    ' 2. 地域が「関東」または「関西」か判定
    If currentRegion = "関東" Or currentRegion = "関西" Then
      condition2 = True
    Else
      condition2 = False
    End If

    ' 3. 顧客名が「〇〇商事」または「△△物産」か判定
    If currentCustomer = "〇〇商事" Or currentCustomer = "△△物産" Then
      condition3 = True
    Else
      condition3 = False
    End If

    ' 4. 商品カテゴリが「Aカテゴリ」か判定
    If currentCategory = "Aカテゴリ" Then
      condition4 = True
    Else
      condition4 = False
    End If

    ' 全ての条件を満たすか判定
    If condition1 And condition2 And condition3 And condition4 Then
      ' 条件を満たす行をレポートシートにコピー
      wsData.Rows(i).Copy wsReport.Rows(reportRow)

      ' 合計金額と件数を加算
      ' 売上金額が数値データとして有効な場合のみ加算
      If IsNumeric(currentSales) Then
        totalSales = totalSales + currentSales
      End If
      dataCount = dataCount + 1

      ' レポートシートの書き込み行を次に進める
      reportRow = reportRow + 1
    End If

  Next i ' 次の行へ

  ' 抽出データの最終行の次に集計結果を書き込み
  ' レポートシートにデータが貼り付けられたか確認 (見出し行の1行だけではないか)
  If reportRow > DATA_START_ROW Then ' 見出し行+1行以上のデータがある場合
    wsReport.Cells(reportRow, "A").Value = "合計"
    ' 数値として貼り付けるためにValueプロパティを使用
    wsReport.Cells(reportRow, "E").Value = totalSales ' E列に合計金額
    wsReport.Cells(reportRow + 1, "A").Value = "件数"
    ' 数値として貼り付けるためにValueプロパティを使用
    wsReport.Cells(reportRow + 1, "E").Value = dataCount ' E列に件数
    ' 必要に応じて、集計セルの書式設定なども追加できます
  Else
    ' 条件に合うデータが見つからなかった場合
    wsReport.Cells(reportRow, "A").Value = "条件に合うデータはありませんでした。"
  End If


  ' 処理完了メッセージ
  MsgBox "週次レポートの作成が完了しました。", vbInformation

End Sub

' Weekday関数の週の開始曜日に関する参考情報:
' vbSunday (1): 日曜日開始 (標準)
' vbMonday (2): 月曜日開始
' vbTuesday (3): 火曜日開始
' ...

(AIからの簡単な解説)

このコードは、まず全売上データシートと週次レポートシートを設定し、レポートシートをクリアします。
次に、今日の日付から今週の始まり(月曜日)と終わり(今日)の日付を計算します。
そして、全売上データシートのデータ行を1行ずつ見ていきます。それぞれの行が、あなたが指定した「日付が今週」「地域が『関東』または『関西』」「顧客名が『〇〇商事』または『△△物産』」「商品カテゴリが『Aカテゴリ』」という全ての条件を満たすかを判定します。
条件を満たす行が見つかったら、その行全体を週次レポートシートの次の空いている行にコピー&貼り付けます。同時に、その行の売上金額を合計値に加算し、件数もカウントアップします。
全ての行のチェックが終わったら、レポートシートに貼り付けたデータのすぐ下に、計算した合計金額と件数を書き込んで完成です。

コードを貼り付けて実行してみよう!

AIが生成してくれたコードを、あなたのExcelファイルで実行してみましょう。
  1. VBEを開く: Alt + F11キーを押してVBAエディター(VBE)を開きます。
  2. 標準モジュールの挿入: VBEのメニューから「挿入」>「標準モジュール」を選択します。
  3. コードの貼り付け: AIが生成したVBAコードを貼り付けます。
  4. シート名や条件の確認と修正:
    • コード内の Const DATA_SHEET_NAME = "全売上データ" と Const REPORT_SHEET_NAME = "週次レポート" が、あなたのファイルで使っているシート名と一致しているか確認し、必要であれば修正します。
    • 抽出条件(地域、顧客名、商品カテゴリ)を変更したい場合は、コード内の該当箇所(If currentRegion = "関東" Or currentRegion = "関西" Then ... など)を修正します。複数の条件を組み合わせる方法が、このコードで確認できますね。
    • 今週の定義(月曜始まりか、日曜始まりかなど)を変更したい場合は、Weekday関数の第2引数(vbMondayの部分)を変更することで調整できます。
    • 集計結果を表示する位置を変更したい場合は、コードの最後の集計結果を書き込む部分(wsReport.Cells(reportRow, "A").Value = "合計" など)を修正します。
  5. 実行: VBEのツールバーにある「実行」ボタン(緑色の再生マーク)をクリックするか、F5キーを押します。「Sub/ユーザーフォームの実行」ダイアログが表示されたら、「CreateWeeklyReport」が選択されていることを確認して「実行」をクリックします。

Excelシートに戻り、週次レポートシートを開いてみてください。条件に合ったデータだけが抽出され、合計金額と件数も自動で計算されて表示されているはずです。

数時間かかっていた作業が数秒に!

どうでしょう? 毎週数時間かけて手作業で行っていた、複雑な条件でのデータ抽出・集計・レポート作成作業が、VBAコードを実行したワンクリックで完了しました。
データの量が増えても、このコードがあれば作業時間はほとんど変わりません。常に最新のデータに基づいた、正確なレポートを瞬時に作成できます。

これはまさに、AIとVBAによる定型作業の「書かない自動化」の強力な事例です! あなたは、この自動化によって生まれた時間を、より創造的で価値の高い業務に使うことができるようになります。

この事例から学べること、そして応用

この事例から、以下のことを実感できたのではないでしょうか。
  • 複雑な条件でのデータ操作: 複数の条件を組み合わせたデータの抽出や、それに続く集計作業も自動化できること。
  • 定型業務の自動化: 毎週や毎月繰り返されるような、決まりきった手順の作業こそ、VBA自動化の最大の効果を発揮する対象であること。
  • AIの応用力: 具体的な手順(シートクリア、見出しコピー、ループ処理、条件判定、コピー&ペースト、集計、結果出力)をAIに指示することで、一連の複雑なマクロを作成できること。

今回行ったのは週次売上レポート作成ですが、この考え方は他の様々な定型レポート作成やデータ集計業務に応用できます。
  • 特定の期間の経費データの抽出と部署ごとの集計
  • 在庫リストから、特定の条件(例:在庫数が閾値を下回っている)を満たす商品を抽出し、発注リストを作成
  • アンケート結果から、特定の回答をしたグループのデータを集計・分析

など、あなたの業務に合わせてプロンプトを修正し、AIに新しいコードを生成してもらうことで、ほとんどの定型的なデータ処理を自動化できる可能性を秘めています。
AIとVBAの二刀流を使いこなすことで、あなたのExcel作業はさらに効率化され、より高度な分析や判断に時間を使えるようになるでしょう。

事例3:【AIデバッグ】動かないコードの原因をAIと一緒に見つける!

前章で、AIアシスタントに週次レポート作成のVBAコードを生成してもらいました。意気揚々とコードを実行したものの、「あれ?期待していた結果と違う…」そんな経験は、AIにコードを生成してもらいながら学ぶ過程で必ずと言っていいほど遭遇します。

しかし、心配はいりません。AIはコードを生成するだけでなく、あなたが書いた(あるいはAIが生成した)コードがなぜ動かないのか、どこがおかしいのかを一緒に見つけてくれる、これまた強力な「デバッグアシスタント」でもあるからです。

はじめに:完璧なコードは最初から生まれない

プロのプログラマーでも、一度で完璧に動作するコードを書くのは難しいものです。ましてや、AIが生成するコードも、あなたの意図やExcelファイルの具体的な状況を100%正確に把握できず、期待通りに動かないことがあります。

大切なのは、そこで立ち止まって諦めるのではなく、「なぜだろう?」と考えて、原因を探る「デバッグ」という作業を行うことです。そして、AI時代のデバッグは、一人で行う必要はありません。あなたのAIアシスタントが、その手助けをしてくれます。

【シナリオ】レポートが正しく作れない!なぜ?(事例2からの続き)

さて、事例2で週次レポートを作成するVBAコードをAIに生成してもらい、サンプルデータを使って実行してみました。しかし、あなたの期待とは裏腹に、レポートシートにはたった1件のデータしか抽出されず、合計金額も件数も正しくありませんでした。

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門

「あれ?プロンプトには、今週の主要顧客のAカテゴリ売上を全部抽出してって書いたはずなのに…」
「サンプルデータには、条件に合うデータが他にもいくつかあったはずだ…」

何かしらコードに問題があることは分かりますが、VBA初心者であるあなたは、コードのどこがおかしいのか、すぐには見当がつきません。エラーメッセージが表示されていないため、ExcelやVBAが「間違っている」と教えてくれるわけでもないからです。

こんな時こそ、AIアシスタントの出番です!

AIアシスタントに聞いてみよう!どこがおかしいの?

コードが期待通りに動かない場合、AIアシスタントに「デバッグ」をお願いすることができます。ポイントは、単に「動きません」と伝えるのではなく、以下の情報を添えることです。
  • 何をしたか: 実行したコード、またはコード全体。
  • 期待した結果: このコードを実行したら、本来どうなってほしかったのか。
  • 実際の結果: 実際にコードを実行したら、どうなったのか(具体的に)。
  • 自分で試したこと(もしあれば): 問題解決のために、自分で考えたり試したりしたことがあれば伝える。

これらの情報があると、AIはより的確に原因を分析し、修正案を提示してくれます。

プロンプト例(デバッグ依頼)

事例2で生成したコードと、期待外れの結果になった状況をAIアシスタントに伝えて、原因究明と修正をお願いしてみましょう。
前回のチャットで生成してもらった週次レポート作成のVBAコードを実行したのですが、期待通りの結果になりません。コードは以下の通りです。

[ここに、事例2でAIが生成したVBAコード全体を貼り付けます]

このコードを、添付した「全売上データ」シートと「週次レポート」シートが入ったExcelファイルで実行しました。(※注:実際の対話ではファイルを添付するか、データ内容を正確に伝えます)

期待した結果:
サンプルデータを見ると、日付が今週(コード実行日を含む直近7日間)、地域が「関東」または「関西」、顧客名が「〇〇商事」または「△△物産」、商品カテゴリが「Aカテゴリ」を満たす行が複数あるはずです。それらの行全てが「週次レポート」シートに抽出され、その合計金額と件数が正しく計算されるはずでした。

実際の結果:
しかし、「週次レポート」シートには、条件を満たすと思われるデータが1行しか抽出されず、合計金額も件数もその1行分のみになっていました。エラーメッセージは表示されませんでした。

このコードが期待通りに動かない原因を教えてください。また、どのように修正すれば正しく動作するようになりますか?
ポイント:
  • 問題のコード全体を必ず含めます。
  • 「期待した結果」と「実際の結果」を具体的に示し、どこがどのように違うのかを明確に伝えます。
  • エラーメッセージの有無も伝えると、AIが原因を推測しやすくなります。

AIアシスタントの分析と修正案

あなたのAIアシスタントは、貼り付けられたコードとあなたの説明を分析し、原因の可能性をいくつか提示してくれるでしょう。
今回の事例のように、エラーメッセージが出ない場合は、コードのロジック(処理の手順や判定条件)に誤りがある可能性が高いことを教えてくれるはずです。

そして、AIは今回の問題の核心部分、つまり日付の判定ロジックに注目するでしょう。

(AIからの分析例)
「ご提示いただいたコードと状況から、期待通りにデータが抽出されない原因は、日付の判定方法にある可能性が高いです。
コード内のこの部分をご覧ください。

VBA
startDate = endDate - Weekday(endDate, vbMonday) + 1 ' 今週の月曜日を計算
' ...中略...
If IsDate(currentDate) Then
   If currentDate >= startDate And currentDate <= endDate Then
     condition1 = True
   Else
     condition1 = False
   End If
End If

Weekday(endDate, vbMonday) は、指定した日付(endDate、つまり今日)が月曜日を週の始まりとしたときに何日目か(月曜が2、火曜が3、...、日曜が1)を返します。
startDate = endDate - Weekday(endDate, vbMonday) + 1 という計算では、もし今日が月曜日(Weekday = 2)の場合、startDate = 今日 - 2 + 1 = 今日 - 1日 となり、日付の範囲が今日から見て前の日曜日から今日までとなってしまいます。
これでは、プロンプトで意図した「コードを実行した日を含む直近7日間」や「今週のデータ(月曜始まり)」と一致しない場合があります。

プロンプトの「コードを実行した日を含む直近7日間」という条件を正確に満たすには、今日の日付から単純に6日前を計算して、その日から今日までを対象とするのが適切でしょう。」

(AIからの修正案例)
「上記を踏まえ、日付の判定ロジックを以下のように修正することを提案します。

コード内の以下の部分を、

startDate = endDate - Weekday(endDate, vbMonday) + 1 ' 今週の月曜日を計算



' コードを実行した日を含む直近7日間の始まりを計算
startDate = endDate - 6

に変更してください。

これにより、startDate は今日の日付からちょうど6日前となり、currentDate >= startDate And currentDate <= endDate の判定が「今日から見て、過去6日以内かつ今日までの日付」つまり「コード実行日を含む直近7日間」を正しく判断するようになります。」

修正コードを試してみよう

AIアシスタントが提案してくれた修正案を、VBAコードに適用してみましょう。

方法1:AIが教えてくれた修正箇所を手動でコードに反映させる場合
  1. VBEを開く: Alt + F11キーでVBEを開きます。
  2. コードの修正: 事例2で貼り付けたコードを開き、AIが指示した箇所のstartDateを計算している行を、修正案の行に置き換えます。
  3. 再実行: 修正したコードを保存し(VBEのフロッピーディスクアイコン)、Excelシートに戻って、再度マクロを実行します(Alt + F8でマクロ一覧から選択して実行、またはVBEからF5キー)。

方法2:AIが修正済みのコード全体を再度生成してくれた場合
  1. VBEを開く: Alt + F11キーでVBEを開きます。
  2. コードの全置換: 事例2で貼り付けたコードが表示されているモジュールを開きます。既存のコード全体を選択し(Ctrl + A)、全て削除します(Deleteキー)。
  3. 修正済みコードの貼り付け: AIが再度生成してくれた修正済みのVBAコード全体をコピーし、まっさらになったモジュール画面に貼り付けます(Ctrl + V)。
  4. 再実行: 貼り付けたコードを保存し、Excelシートに戻って、再度マクロを実行します(Alt + F8でマクロ一覧から選択して実行、またはVBEからF5キーを押します)。

どちらの方法でもコードは修正されます。もし方法1で修正箇所を間違えそうだと感じたら、迷わず方法2を選んでAIにコード全体を生成してもらいましょう。

正しいレポートができた!
コードを修正して再度実行すると、どうでしょう? 今度は、サンプルデータの中から条件(日付が今週、地域「関東」または「関西」、顧客名「〇〇商事」または「△△物産」、商品カテゴリ「Aカテゴリ」)をすべて満たすデータが正しく抽出され、合計金額と件数も正確に計算されてレポートシートに表示されているはずです。

画像で確認したかった期待通りの結果が得られたかと思います。

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門

AIデバッグから学ぶこと

この事例から、あなたは以下のことを学べたはずです。
  • コードは常に完璧とは限らない: AIが生成したコードも、デバッグが必要な場合があることを理解しました。
  • エラーが出なくてもデバッグは必要: コードが最後まで実行されても、結果が正しくない場合は、ロジックに誤りがあることを学びました。
  • AIはデバッグの協力者: 問題の状況を具体的に伝えることで、AIがコードを分析し、原因の特定や修正方法を提案してくれることを体験しました。
  • 原因特定のヒント: AIが「日付の計算がおかしい」のように具体的な箇所を指摘してくれることで、VBAコードのどこに注目すればよいかのヒントが得られます。

デバッグはプログラミングにおいて非常に重要なスキルです。AIアシスタントを上手に活用することで、VBAの知識が浅くても、コードの問題点を効率的に発見し、解決に導くことができるのです。AIと一緒にデバッグを繰り返すうちに、あなた自身のコードを読む力や問題解決能力も自然と向上していくでしょう。

【参考】事例2の完成コード

上記でデバッグを行い、正しく動作するようになった事例2のコード全体をここに改めて掲載します。
AIとの対話を通じて、コードがどのように改善されたかを確認してみてください。

Sub CreateWeeklyReport()

  Dim wsData As Worksheet ' 元データシート
  Dim wsReport As Worksheet ' レポート出力シート
  Dim lastRowData As Long ' 元データシートの最終行
  Dim i As Long ' ループ用変数
  Dim reportRow As Long ' レポートシートの書き込み行
  Dim totalSales As Double ' 合計売上金額
  Dim dataCount As Long ' データ件数
  Dim startDate As Date ' 集計開始日 (コード実行日を含む直近7日間の始まり)
  Dim endDate As Date ' 集計終了日 (今日)

  '--- 設定 ---
  Const DATA_SHEET_NAME As String = "全売上データ"
  Const REPORT_SHEET_NAME As String = "週次レポート"
  Const DATA_START_ROW As Long = 2 ' 元データの開始行 (見出しの次)
  '----------------

  ' シートを設定
  On Error Resume Next
  Set wsData = ThisWorkbook.Sheets(DATA_SHEET_NAME)
  Set wsReport = ThisWorkbook.Sheets(REPORT_SHEET_NAME)
  On Error GoTo 0

  ' シートが存在しない場合のエラー処理
  If wsData Is Nothing Then
    MsgBox DATA_SHEET_NAME & "というシートが見つかりません。", vbCritical
    Exit Sub
  End If
  If wsReport Is Nothing Then
    ' レポートシートが存在しない場合は新しく作成することも可能です
    MsgBox REPORT_SHEET_NAME & "というシートが見つかりません。作成してください。", vbCritical
    Exit Sub
  End If

  ' レポートシートの内容をクリア
  wsReport.Cells.ClearContents ' シート全体をクリア

  ' レポートシートに見出しをコピー
  ' 元データシートの1行目を見出しとしてコピー
  wsData.Rows(1).Copy wsReport.Rows(1)
  reportRow = 2 ' レポートシートの書き込み開始行

  ' 集計対象期間を設定 (コード実行日を含む直近7日間)
  endDate = Date ' 今日
  ' AIデバッグで修正された箇所: 今日から6日前の日付を開始日とする
  startDate = endDate - 6

  ' 元データシートの最終行を取得
  lastRowData = wsData.Cells(Rows.Count, "A").End(xlUp).Row

  ' データがある最終行が見出し行より小さい場合は処理を終了
  If lastRowData < DATA_START_ROW Then
    MsgBox "チェック対象のデータがありません。", vbInformation
    Exit Sub
  End If

  ' 元データをループして抽出条件を満たす行を探す
  totalSales = 0 ' 合計金額の初期化
  dataCount = 0 ' 件数の初期化

  For i = DATA_START_ROW To lastRowData

    ' 各列のデータを取得
    Dim currentDate As Date
    Dim currentRegion As String
    Dim currentCustomer As String
    Dim currentCategory As String
    Dim currentSales As Double

    ' エラー回避のため、On Error Resume Next で日付変換エラーなどを無視
    On Error Resume Next
    ' 日付はValueではなくValue2で取得するとシリアル値として扱いやすい場合がある
    currentDate = wsData.Cells(i, "A").Value2 ' 日付
    currentRegion = wsData.Cells(i, "B").Value ' 地域
    currentCustomer = wsData.Cells(i, "C").Value ' 顧客名
    currentCategory = wsData.Cells(i, "D").Value ' 商品カテゴリ
    currentSales = wsData.Cells(i, "E").Value ' 売上金額
    On Error GoTo 0 ' エラーハンドリングを元に戻す

    '--- 抽出条件の判定 ---
    Dim condition1 As Boolean ' 日付条件
    Dim condition2 As Boolean ' 地域条件
    Dim condition3 As Boolean ' 顧客名条件
    Dim condition4 As Boolean ' 商品カテゴリ条件

    ' 1. 日付が指定期間内か判定 (日付データとして有効な場合のみ)
    ' シリアル値として比較
    If IsDate(currentDate) Then
       ' startDate <= currentDate <= endDate の条件で判定
       If currentDate >= startDate And currentDate <= endDate Then
         condition1 = True
       Else
         condition1 = False
       End If
    Else
      condition1 = False ' 日付データとして無効な場合は条件を満たさない
    End If


    ' 2. 地域が「関東」または「関西」か判定
    If currentRegion = "関東" Or currentRegion = "関西" Then
      condition2 = True
    Else
      condition2 = False
    End If

    ' 3. 顧客名が「〇〇商事」または「△△物産」か判定
    If currentCustomer = "〇〇商事" Or currentCustomer = "△△物産" Then
      condition3 = True
    Else
      condition3 = False
    End If

    ' 4. 商品カテゴリが「Aカテゴリ」か判定
    If currentCategory = "Aカテゴリ" Then
      condition4 = True
    Else
      condition4 = False
    End If

    ' 全ての条件を満たすか判定
    If condition1 And condition2 And condition3 And condition4 Then
      ' 条件を満たす行をレポートシートにコピー
      wsData.Rows(i).Copy wsReport.Rows(reportRow)

      ' 合計金額と件数を加算
      ' 売上金額が数値データとして有効な場合のみ加算
      If IsNumeric(currentSales) Then
        totalSales = totalSales + currentSales
      End If
      dataCount = dataCount + 1

      ' レポートシートの書き込み行を次に進める
      reportRow = reportRow + 1
    End If

  Next i ' 次の行へ

  ' 抽出データの最終行の次に集計結果を書き込み
  ' レポートシートにデータが貼り付けられたか確認 (見出し行の1行だけではないか)
  If reportRow > DATA_START_ROW Then ' 見出し行+1行以上のデータがある場合
    wsReport.Cells(reportRow, "A").Value = "合計"
    ' 数値として貼り付けるためにValueプロパティを使用
    wsReport.Cells(reportRow, "E").Value = totalSales ' E列に合計金額
    wsReport.Cells(reportRow + 1, "A").Value = "件数"
    ' 数値として貼り付けるためにValueプロパティを使用
    wsReport.Cells(reportRow + 1, "E").Value = dataCount ' E列に件数
    ' 必要に応じて、集計セルの書式設定なども追加できます
  Else
    ' 条件に合うデータが見つからなかった場合
    wsReport.Cells(reportRow, "A").Value = "条件に合うデータはありませんでした。"
  End If


  ' 処理完了メッセージ
  MsgBox "週次レポートの作成が完了しました。", vbInformation

End Sub

' ※このコードではIsInArray関数は使用していませんが、
'  事例1のようにリストとの照合が必要な場合は、事例1のコードから
'  IsInArray関数部分をコピーしてこのモジュールに貼り付けて使用できます。


事例4:【定型作業自動化】クリック一つでチーム全員の日報フォーマットを自動生成!

毎日や毎週、必ず行うExcel作業の中に、「決まったフォーマットのファイルやシートを準備する」という作業はないでしょうか? 例えば、日報や週報のフォーマット作成、会議議事録のテンプレート準備などです。内容は日々変わりますが、形式はいつも同じ。このような定型作業こそ、AIとVBAで自動化するのに最適です。特に、それが「複数の対象(例:チームメンバー全員)に対して行う」作業であれば、自動化の効果は絶大です。

【シナリオ】毎朝のファイル作成、社員数分繰り返す苦行…


あなたは、担当するチームメンバー全員分の「日報フォーマット付きExcelファイル」を毎朝作成し、共有フォルダに格納する業務を任されています。

日報のフォーマット自体は、先ほどの事例で見たように、新しいExcelブックに今日の日付、氏名、業務内容の項目などを設定するものです。

しかし、あなたのチームには多くのメンバーがいます。あなたは、以下のような手順を毎朝、社員の人数分だけ繰り返す必要があります。

新しいExcelブックを開く。
シート名を今日の日付に変更する。
日報のフォーマットを作成する(タイトル入力、セル結合、項目名入力、罫線、列幅調整など)。
フォーマット内の氏名欄に、そのファイルの対象となる社員の名前を入力する。
「社員名_日報_今日の日付の8桁数字.xlsx」という特定のファイル名規則に従って、ファイルを保存する。
この作業を、社員一人あたり数分かかったとしても、社員数が多ければ毎朝10分、20分、あるいはそれ以上の時間を取られてしまいます。

あなたは、この「社員数分繰り返すファイル作成と命名規則に沿った保存」という地味で時間のかかる作業に、大きな「苦しみ」を感じています。

手作業でのファイル作成、その「苦しみ」とは?


社員数分のファイル作成は、まさに非効率の典型です。あなたは毎朝、このような「苦しみ」を味わっているのではないでしょうか。

繰り返しの負担: 同じ手順を社員数分だけ繰り返すのは、単調で精神的な負担が大きいです。
作業時間のロス: 社員数に比例して作業時間が増加します。この準備作業に時間を取られ、本来の業務開始が遅れてしまいます。
ミスの発生: ファイル名の「社員名」や「日付(8桁数字)」を間違えたり、フォーマット内の氏名欄に入力する名前を間違えたりといったヒューマンエラーが発生しやすく、後で修正が必要になることがあります。
ファイル管理の手間: 正しいファイル名で保存されているか、全員分作成できたかなどの確認作業も必要になります。
この「社員数分だけ繰り返すファイル作成と正確なファイル名での保存」という「苦しみ」から解放されたいと強く願っているはずです。

AIアシスタントに相談してみよう!


あなたのAIアシスタントとVBAの二刀流を使えば、この「社員数分ファイル作成」の作業を劇的に効率化できます。「社員一覧」シートを基に、ワンクリックでチーム全員分の日報ファイルが自動で作成・保存される未来を実現しましょう。

プロンプトを考える際は、「社員一覧」シートのどこに社員名が記載されているか、そして作成したい日報ファイルのフォーマット内容(変更後の仕様)、そして社員名と日付を含めたファイル名の規則を正確に伝えます。

必要な情報は以下の通りです。

社員名リストがあるシート名(例: 「社員一覧」)
社員名が記載されている列と、データが始まる行(例: 「社員一覧」シートのA列、2行目から)
新しく作成する日報ブックのフォーマット内容
シート名の命名規則(今日の日付形式)
A1セル、B1セルに入力する内容と表示形式
A3セルに入力する内容(「氏名」)
B3セルからD3セルを結合して、読み込んだ社員名を入力
A5セル、B5セルに入力する内容(「今日の業務内容」見出し)
6行目に入力する業務内容の項目名(例: 「日付」「業務内容」「時間(h)」「備考」)
罫線を引きたい範囲とその種類(項目名を含む6行目から下)
列幅を調整したい列とその方法
作成するファイル名の命名規則(「社員名_日報_今日の日付の8桁数字.xlsx」)
ファイル名に含める「今日の日付の8桁数字」の具体的な形式(YYYYMMDD)
保存場所(マクロファイルと同じフォルダなど)
保存後の処理(ブックを閉じる)
これらの情報を整理して、AIにプロンプトを作成します。

プロンプト例


あなたのAIアシスタントに、以下のように話しかけてみましょう。

Excel VBAコードを作成してください。
シート名「社員一覧」のA列に社員名リストがあります。2行目からデータが始まります。
この「社員一覧」に記載されている社員一人につき、以下の内容で個別の新しいExcelブックを自動で作成したいです。

新しいブックの最初のシートの名前を今日の日付(YYYY-MM-DD形式、例:2025-05-19)に設定してください。
そのシートのA1セルに「日報」、B1セルに今日の日付を「YYYY年M月D日」の形式で入力してください。

**A3セルに、「氏名」と入力してください。**
**B3セルからD3セルを結合し、**「社員一覧」シートから読み込んだ現在の社員名を入力してください。

A5セルとB5セルを結合し、「今日の業務内容」と入力してください。

**6行目には、以下の項目名を入力してください。**
**A6セルに「日付」**
**B6セルに「業務内容」**
**C6セルに「時間(h)」**
**D6セルに「備考」**

**A6セルからD15セルまでの範囲に、細い実線の罫線(外枠と内側全て)を引いてください。**

A列とB列の幅を、内容に合わせて自動調整してください。

作成したブックは、マクロを実行したExcelファイルと同じフォルダに、**「社員名_日報_今日の日付の8桁数字.xlsx」**というファイル名で自動保存してください。
ファイル名の「社員名」部分は「社員一覧」シートから読み込んだ社員名とし、「今日の日付の8桁数字」は今日の日付を「YYYYMMDD」形式(例:20250519)としたものを使用してください。
ファイル名の例:山田太郎_日報_20250519.xlsx

ファイルを保存したら、作成した新しいブックを閉じてください。
「社員一覧」シートのデータの最終行まで処理を繰り返してください。
コードにはコメントを入れて、処理内容が分かるようにしてください。
ポイント:

変更された氏名欄(A3セルとB3:D3結合)の仕様を具体的に伝えます。
6行目に入力したい項目名とそのセル位置を具体的に指示します。
罫線の範囲が6行目から始まることを再確認します。
その他のポイントは変更ありません。

AIアシスタントからの回答(VBAコード例と解説)


AIはあなたのプロンプトを理解し、以下のようなVBAコードと解説を生成してくれるでしょう。変更されたフォーマット内容が反映されています。


(AIからの簡単な解説)
このコードは、まず「社員一覧」シートから社員名リストを取得します。
そして、社員リストを上から順にループして処理を行います。
ループの中では、新しいExcelブックを作成し、シート名を今日の日付に変更します。
次に、あなたが指示した新しいフォーマットに合わせて、A1/B1セルにタイトルと日付、A3セルに「氏名」、B3からD3セルを結合して読み込んだ社員名を入力します。A5/B5セルに「今日の業務内容」の見出しを入力し、6行目には指定された項目名(日付、業務内容、時間(h)、備考)を入力します。
項目名を含む6行目からD15までの範囲に罫線を引き、A列とB列の幅を自動調整します。
ファイル名は、読み込んだ社員名と今日の日付(YYYYMMDD形式)を使って自動で組み立て、マクロが保存されているフォルダに保存し、ブックを閉じます。
この一連の処理を、社員一覧シートの社員リストの最後まで繰り返します。

コードを貼り付けて実行してみよう!


AIが生成してくれたチーム全員分の日報フォーマット自動生成コードを、あなたのExcelファイルに貼り付けて実行してみましょう。このコードは、実行元のExcelファイル(このVBAコードが書かれているファイル)と同じフォルダに新しい日報ファイルを作成します。

準備:

日報ファイルを作成したいExcelブック(このVBAコードを貼り付けるブック)を用意します。
そのブックの中に、社員名リストが入力されたシートを作成します。シート名を「社員一覧」とし、例えばA列の2行目から社員名をリストアップしてください。(1行目は見出しとしてください)
実行:

VBEを開く: Alt + F11キーでVBEを開きます。
標準モジュールの挿入: 「挿入」>「標準モジュール」を選択します。
コードの貼り付け: AIが生成したVBAコードを貼り付けます。
設定の確認: コード内の Const STAFF_SHEET_NAME As String = "社員一覧" や Const STAFF_NAME_COLUMN As String = "A"、 Const STAFF_START_ROW As Long = 2 が、あなたの「社員一覧」シートの状況と一致しているか確認し、必要であれば修正してください。
実行: VBEでコードが表示されている状態でF5キーを押すか、Excelに戻ってAlt + F8でマクロ一覧を開き、「CreateDailyReportsForTeam」を選択して実行します。
実行後、マクロが保存されているフォルダを開いてみてください。社員一人ひとりの名前が付いた「社員名_日報_今日の日付の8桁数字.xlsx」という新しいファイルが、社員の人数分だけできているはずです。それぞれのファイルを開くと、その社員の名前が入力され、項目名と罫線も設定された日報フォーマットが完成しているのが確認できます。

毎朝の作業がクリック一つに!


どうでしょう? これまで社員数分だけ手作業で繰り返していた、ファイルの作成、フォーマット設定(氏名欄の結合や項目名入力を含む)、氏名入力、特定のファイル名での保存といった煩雑な作業が、このVBAコードを実行する「ワンクリック」だけで完了するようになりました。

毎朝の準備作業がゼロになり、すぐにチームメンバーに日報ファイルの使用を開始してもらうことができます。ファイル名の付け間違いや、うっかり誰かの分を作成し忘れるといったミスも防げます。フォーマットも常に統一されたものが作成されます。

これは、AIとVBAによる「書かない自動化」が、特定のリストを基に複数の対象に繰り返す定型作業にどれだけ大きな効果をもたらすかを示す、より進んだ例です。

この事例から学べること、そして応用


この事例から、あなたは以下のことを学べたはずです。

リストを使った繰り返し処理(ループ): 特定のリスト(ここでは社員名リスト)の各項目に対して、同じ一連の処理(ここでは日報ファイル作成)を自動で繰り返す方法。
他のシートのデータを読み込む: マクロを実行しているシートだけでなく、同じブック内の別のシートからデータを読み込んで利用する方法。
ファイル名の動的な生成: 読み込んだデータ(社員名)や今日の日付を使って、VBAコードの中でファイル名を自動で組み立てる方法。
複数ファイルの自動作成: 単一ファイルの操作にとどまらず、複数のファイルをVBAで自動生成できること。
より複雑なフォーマット設定: セルの結合範囲や入力項目を細かく指定して自動化する方法。
今回行ったのはチーム全員分の日報ファイル作成でしたが、この考え方は他の様々な繰り返し発生するファイル作成業務に応用できます。

顧客リストを基に、顧客ごとの請求書やDMのひな形ファイルを自動生成し、顧客名や住所を自動入力
プロジェクトリストを基に、プロジェクトごとの報告書テンプレートファイルを自動生成し、プロジェクト名を自動入力
など、あなたの業務の中で、「このリストの項目一つずつに対して、同じようなファイルを作成し、内容の一部をリストから転記しているな」と感じるものがあれば、ぜひAIアシスタントに相談して、その自動化に挑戦してみてください。

第4章まとめ:AI×VBAの実力を体感!Excel業務を変える4つの実践事例

第4章では、具体的なExcel業務の「困った」を題材に、AIとVBAの「二刀流」でどのように課題を解決し、作業を劇的に効率化できるかを追体験してきました。データチェックからレポート作成、さらには複数ファイルの自動生成まで、様々な事例を通じて「書かない自動化」の威力を実感していただけたことと思います。まさに、AI×VBAの実力を体感する章となりました。

改めて、各事例でどのような自動化が可能になったか振り返ってみましょう。
  • 事例1(データ整形): 手作業では時間と見落としが発生しがちだった入力規則チェックが、AIが生成したVBAコードで瞬時に完了できるようになりました。特定の条件に合わないデータを自動で見つけて色をつける、といった整形作業の自動化です。
  • 事例2(条件判定・抽出・集計): 複雑な複数の条件を組み合わせたデータ抽出や、それに続く集計作業といった、定型的なレポート作成業務が自動化されました。日付や条件リストを変更すれば、様々な集計レポートに応用できます。
  • 事例3(AIデバッグ): コードが期待通りに動かない場合に、AIアシスタントに相談して原因を特定し、修正する方法を学びました。AIは単なるコード生成ツールではなく、問題解決を助けてくれる強力な相棒であることを実感できたはずです。デバッグは決して難しい作業ではなく、AIと一緒に乗り越えられることを知りました。
  • 事例4(定型作業自動化): 「社員一覧」のようなリストを基に、社員一人ひとりに個別のファイルを作成し、フォーマットを設定して保存するという、繰り返し発生するファイル作成作業が自動化されました。複数のファイルやシートを扱う複雑な処理も、AIを使えば実現できることを示しました。

これらの事例は、あなたのExcel作業で日々直面する様々な「困った」のほんの一例にすぎません。しかし、これらの成功体験を通じて、あなたの「こんな作業も自動化できるのでは?」という想像力は大きく膨らんだのではないでしょうか。

AI×VBAで効率化を進める上での注意点と重要ポイント

この章で得られた成功体験を、あなたの実際の業務に活かしていくために、いくつか重要なポイントと注意点があります。これらを意識することで、AI×VBAによる自動化をさらに効果的に進めることができます。

【実践に活かすための5つのポイント】

  1. プロンプト力が自動化の質を決める
  2. コードは読む・修正する覚悟を持つ
  3. 小さな成功体験からステップアップする
  4. 業務理解が最も重要
  5. データ・ファイル管理の注意

これらのポイントについて、もう少し詳しく見ていきましょう。
  1. プロンプト力が自動化の質を決める
    AIに期待通りのVBAコードを生成してもらうには、あなたの「質問力」、つまりプロンプトの質が極めて重要です。事例で見たように、「何を」「どうしたいのか」、シート名、列、条件、期待する結果などを具体的に、そして分かりやすく伝えることが、AIが適切なコードを生成するための鍵となります。第3章で学んだプロンプトのテクニックを、ぜひ実践で試してみてください。
  2. コードは「読む」、そして「修正する」覚悟を持つ
    本書のテーマは「書かない自動化」ですが、これは「一切コードを見ない」という意味ではありません。AIが生成したコードをVBEに貼り付けて実行するだけでなく、それが何をしているコードなのか(超簡易解説レベルでOK)、そして必要に応じて修正する方法を知っておくことが重要です。事例3で体験したように、コードが期待通りに動かない場合は、AIと一緒にコードを「読んで」原因を探り、「修正する」必要があります。コード全体を理解する必要はありませんが、AIの解説を頼りに、処理の主要な部分だけでも読む習慣をつけましょう。
  3. 小さな成功体験からステップアップする
    最初からあなたの業務で最も複雑な作業の自動化に挑戦する必要はありません。まずは事例1のような簡単なデータチェックや整形など、比較的手軽に自動化できる作業から取り組みましょう。小さな成功体験を積み重ねることで、AIとVBAを使うことへの自信がつきます。
  4. 業務理解が最も重要
    AIは万能ではありません。あなたのExcelファイルの具体的な構造や、業務の細かなルール、例外処理などをAIは知りません。あなたの業務内容や自動化したい手順を正確に理解しているのは、あなた自身です。AIへのプロンプトを作成するのも、生成されたコードが正しいか確認するのも、最終的にはあなたの業務理解に基づいています。AIを使いこなすには、まずあなたの「業務ありき」であることを忘れないでください。
  5. データ・ファイル管理の注意
    VBAコードは、Excelファイルの内容を直接操作します。特に、多数のファイルを生成したり、既存のデータを書き換えたりするコードを実行する際は、予期せぬ結果に備えて必ず元のファイルのバックアップを取るようにしてください。また、機密情報を含むデータを扱う場合は、AIにコードを共有する際のセキュリティについても考慮が必要です(これについては本書の別の章で詳しく触れる可能性があります)。

次のステップへ
第4章を通じて、AIとVBAがあなたのExcel作業の強力な味方となることを実感できたはずです。しかし、AI×VBAの学習過程では、今回事例3で体験したように、コードが動かない、エラーが出る、結果がおかしいといった様々なトラブルに遭遇する可能性があります。

次の第5章では、AI×VBAの学習や実践でつまずきやすいポイントに焦点を当て、それらのトラブルにAIを頼りながらどのように対処していくかを具体的に学んでいきます。
第4章で得た自信と経験を胸に、AIと共にExcel自動化の道をさらに進んで、あなた自身の業務改革を実現していってください。


※本記事の作成にあたっては、生成AI(ChatGPT、Gemini、Claude)を活用し、文章および引用データの作成を行っています。最終的な内容は人間による確認・編集を経て掲載しています。





同じテーマ「AI×VBAで“書かない自動化”」の記事

AI時代のExcel革命:AI×VBAで“書かない自動化”超入門
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
第6章:AIとVBAを学び続ける!あなたの「超効率化」を止めないヒント
第7章:さらなる高みへ!AI×VBA応用テクニックと未来への備え
おわりに:AI×VBAはあなたの未来を変える強力な武器
付録:AI×VBA実践リソース集


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