ChatGPTでVBAを自動生成する方法|社内SE向け実践テンプレート10選とエラー対処

AIツール活用

VBAを書こうとするたびに、「あの構文どう書くんだっけ」「Microsoftのリファレンスを調べながら1時間…」という経験、社内SEなら身に覚えがあるのではないでしょうか。

自分もかつてはそうでした。月次レポートのマクロを一本組むだけで半日かかっていた時期があります。それがChatGPTを使い始めてから、「日本語で処理を説明してコードをもらう」 という流れに切り替わり、開発時間が体感で3分の1以下になりました。

この記事では、実務で使い回せるVBAテンプレート10本と、ChatGPTに精度の高いコードを出力させるプロンプトの書き方、よくあるエラーの対処法をまとめます。VBAが苦手な方でも、コピペして動かせる内容にしています。


ChatGPTでVBAはどこまで作れるか

「ChatGPTに頼んでも、簡単な処理しか作れないんじゃないか」と思っていたころ、試しに複雑な条件分岐を含む集計マクロを依頼したら、ほぼそのまま動くコードが返ってきて驚いた記憶があります。

現在のChatGPT(GPT-5.3)は、以下のようなVBAを問題なく生成できます。

  • 複数シートをまたぐデータ集計
  • 空白・重複の検出と削除
  • 外部CSVの取り込みと整形
  • フォルダ内のExcelファイル一括処理
  • OutlookメールのVBA送信
  • 条件付き書式の自動設定

ポイントは「何をしたいか」を日本語で具体的に伝えること。曖昧な指示だと汎用的なコードが返ってくるだけで、実務に使えるものにはなりません。プロンプトの書き方は後半で詳しく説明します。

注意:ChatGPTに社内の実データや個人情報を貼り付けるのは避けてください。処理の説明はダミーデータや構造だけ伝えれば十分です。ChatGPTへの入力内容はモデルの学習に使用される場合があります(Enterprise/Team契約を除く)。


実務でそのまま使えるVBAテンプレート10選

以下のコードはすべてExcelのVBAエディタ(Alt + F11)に貼り付けて動作確認済みの形式です。必要に応じてシート名・セル範囲・ファイルパスを書き換えて使ってください。

① 最終行まで自動集計

A列のデータがどこまで続くかを自動判定し、合計をB1セルに出力します。データ量が毎月変わるレポートで特に便利です。

Sub 合計計算()
    Dim lastRow As Long
    ' A列の最終行を取得(空白セルがあると途中で止まるため、Rows.Countから逆引き)
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    ' A1からlastRowまでの合計をB1に出力
    Range("B1").Value = WorksheetFunction.Sum(Range("A1:A" & lastRow))
End Sub

② 空白行の一括削除

A列が空白の行を下から順番に削除します。上から削除すると行番号がずれるため、必ず下から処理するのが鉄則です。

Sub 空白行削除()
    Dim i As Long
    ' 最終行から1行目に向かって逆順にループ
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
        If Cells(i, 1).Value = "" Then Rows(i).Delete
    Next i
End Sub

③ 重複データの削除

A1:A100の範囲で重複を削除します。Header:=xlYesは1行目をヘッダーとして扱う指定です。ヘッダーがない場合はxlNoに変更してください。

Sub 重複削除()
    ' Columns:=1 は「1列目(A列)を基準に重複判定」の意味
    Range("A1:A100").RemoveDuplicates Columns:=1, Header:=xlYes
End Sub

④ 条件抽出(オートフィルタ)

A列の値が100以上の行だけを表示します。Criteria1の条件式は変更可能です(例:"=東京"で特定の文字列を絞り込むことも可能)。

Sub 条件フィルタ()
    ' Field:=1 はオートフィルタをかける列番号(1=A列)
    Range("A1").AutoFilter Field:=1, Criteria1:=">=100"
End Sub

⑤ 外部CSVの取り込み

指定パスのCSVをExcelで開きます。開いたあとの整形処理(列幅調整・型変換など)は別途マクロを組む必要があります。パスの\\\でエスケープしてください。

Sub CSV取込()
    ' ファイルパスは実際の保存場所に変更すること
    Workbooks.Open Filename:="C:\\Users\\username\\Desktop\\data.csv"
End Sub

⑥ シート名の一括作成

A1:A10に入力されたテキストをそれぞれのシート名として新規シートを追加します。月次レポートのシートを一気に作るときに便利です。

Sub シート一括作成()
    Dim cell As Range
    For Each cell In Range("A1:A10")
        ' セルが空白の場合はスキップ
        If cell.Value <> "" Then
            Sheets.Add(After:=Sheets(Sheets.Count)).Name = cell.Value
        End If
    Next cell
End Sub

元のコードとの差分:元コードは空白セルでシート名を作ろうとしてエラーになるケースがあったため、空白スキップの条件を追加しました。またAfter:=Sheets(Sheets.Count)を指定することで、既存シートの末尾に追加されるよう修正しています。


⑦ フォルダ内のExcelファイル一括処理

指定フォルダ内の.xlsxファイルをすべて開いてループします。実際の業務では「開いたファイルから特定のセルを読む」「集計シートに転記する」などの処理をループ内に追加して使います。

Sub ファイル一括処理()
    Dim filePath As String
    Dim fileName As String
    Dim wb As Workbook

    filePath = "C:\\Users\\username\\Desktop\\data\\"  ' 末尾の\は必須
    fileName = Dir(filePath & "*.xlsx")

    Do While fileName <> ""
        Set wb = Workbooks.Open(filePath & fileName)
        ' ここに各ファイルへの処理を追加する
        ' 例:wb.Sheets(1).Range("A1").Value を取得して集計 など
        wb.Close SaveChanges:=False  ' 処理後は閉じる(保存なし)
        fileName = Dir()  ' 次のファイルへ
    Loop
End Sub

⑧ OutlookメールのVBA送信

VBAからOutlookを操作してメールを送信します。Outlookが起動・サインイン済みであることが前提です。社内レポートを自動配信する際に活用できます。

Sub メール送信()
    Dim olApp As Object
    Dim mail As Object

    ' Outlookアプリケーションオブジェクトを生成
    Set olApp = CreateObject("Outlook.Application")
    ' 新規メールアイテムを作成(0 = olMailItem)
    Set mail = olApp.CreateItem(0)

    With mail
        .To = "recipient@example.com"       ' 宛先
        .CC = ""                             ' CC(不要なら削除)
        .Subject = "月次レポート送付"        ' 件名
        .Body = "お疲れ様です。" & vbCrLf & "今月分のレポートを送付します。"
        .Attachments.Add "C:\\report\\月次レポート.xlsx"  ' 添付ファイル
        .Send
    End With

    Set mail = Nothing
    Set olApp = Nothing
    MsgBox "メールを送信しました。"
End Sub

注意.Sendの代わりに.Displayにするとメール画面が開き、送信前に内容を確認できます。本番運用前は.Displayでテストすることをお勧めします。


⑨ 列幅の自動調整

Sub 列幅自動調整()
    ' A列のみ調整する場合
    Columns("A:A").AutoFit

    ' シート全体の列幅を一括調整する場合
    ' Cells.EntireColumn.AutoFit
End Sub

⑩ 指定文字の一括置換

シート全体の文字列を置換します。LookAt:=xlPartは部分一致、xlWholeは完全一致です。大量データへの一括適用前に、小さいデータで動作確認することをお勧めします。

Sub 文字列一括置換()
    ' 「旧システム」という文字列を「新システム」に一括置換
    Cells.Replace _
        What:="旧システム", _
        Replacement:="新システム", _
        LookAt:=xlPart, _
        MatchCase:=False  ' 大文字小文字を区別しない
End Sub

ChatGPTで精度の高いVBAを出力させるプロンプトの書き方

ChatGPTに「VBAを書いて」と伝えるだけでは、汎用的なコードしか返ってきません。実務に使えるコードを得るには、処理の対象・条件・出力先の3点を明示するのがポイントです。

❌ 精度が低いプロンプト例

「空白行を削除するVBAを書いて」

これだと「どのシート?」「どの列?」「シート全体?」が不明なため、使えないコードが返ってくることがあります。

✅ 精度が高いプロンプト例

「Sheet1のA列を基準に、A列が空白の行をすべて削除するVBAを書いてください。
データは2行目から始まり、1行目はヘッダーなので削除しないでください。
処理中は画面の再描画を止めて高速化してください。」

このように「シート名・対象列・ヘッダーの有無・高速化の要否」まで伝えると、そのまま使えるコードが返ってくる確率が大きく上がります。

ChatGPTに伝えると効果的な追加情報

  • Excelのバージョン(Microsoft 365、Excel 2019 など)
  • データ件数の目安(数百行か、数万行か)
  • エラーが起きたときの対処方法(メッセージを出すか、ログに書き出すか)
  • 処理後の確認方法(ダイアログを出すか、ログシートに記録するか)

よくあるエラーと対処法

エラー① マクロが動かない・途中で止まる

主な原因と確認ポイント:

  • シート名の不一致:コード内のSheets("Sheet1")が実際のシート名と違う。シート名は日本語でも可だが、スペースや全角・半角の違いに注意
  • セル範囲の指定ミスRange("A1:A100")と書いたが実際のデータが200行ある、など
  • 変数の型ミス:日付や数値を文字列型の変数に入れようとしてエラーになるケースがある

デバッグ方法:

' Debug.Printでイミディエイトウィンドウに値を出力して確認
Debug.Print "lastRow = " & lastRow
Debug.Print "対象セル値 = " & Cells(i, 1).Value

VBAエディタで Ctrl + G を押すとイミディエイトウィンドウが開き、Debug.Printの出力を確認できます。ステップ実行(F8キー)で1行ずつ動作を追うのも有効です。


エラー② 処理が遅い・Excelがフリーズする

数千行以上のデータを処理すると、画面の再描画や自動計算が都度走って極端に遅くなることがあります。以下を処理の先頭と末尾に追加するだけで、体感で5〜10倍速くなるケースがあります。

Sub 高速化サンプル()
    ' 処理前:画面更新・自動計算・イベントを停止
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' ===== ここにメインの処理を書く =====

    ' 処理後:必ず元に戻す(戻さないとExcel全体の動作がおかしくなる)
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub

注意:処理中にエラーが発生すると「戻す処理」が実行されないまま終わることがあります。On Error GoToでエラーハンドラを設定し、エラー時も必ず元に戻すようにしておくと安全です。


エラー③ Outlookメールが送信できない

以下の順番で確認してください。

  1. Outlookが起動・サインイン済みか:VBAからOutlookを操作する際、Outlookのプロセスが動いていることが前提
  2. セキュリティ設定の確認:Outlookのセキュリティポリシーによっては、外部プログラムからのメール送信がブロックされる場合がある。IT管理者に確認を
  3. 参照設定の追加(早期バインディングを使う場合):VBAエディタの「ツール」→「参照設定」でMicrosoft Outlook XX.X Object Libraryにチェックを入れると、入力補完が効いて開発しやすくなる

VBAをChatGPTで作るときの注意点

社内データの取り扱い

ChatGPTへの入力内容は、プランによってはモデルの学習に使用される可能性があります。業務データ・顧客情報・個人情報は絶対に貼り付けないこと。処理の内容だけダミーデータで伝えれば、正確なコードを作るうえで十分です。

実行前のバックアップ

VBAは元に戻せない操作(行削除・データ上書きなど)を実行します。本番データに対して初めて動かすときは、必ずファイルのコピーを取ってから実行してください。

生成コードのチェック

ChatGPTが出力したコードは、そのまま実行する前に一度読み通す習慣をつけてください。稀に意図しない範囲に操作が及ぶコードが出てくることがあります。特に「全セルを対象とする処理(Cells.Replaceなど)」は影響範囲が広いため注意が必要です。


まとめ|VBAはChatGPTと組み合わせて使うのが現実解

ChatGPTを使い始めてから、VBA開発での「調べる時間」がほぼゼロになりました。構文を覚えなくていいので、「何をしたいか」を考えることに集中できます。

ただし、ChatGPTが出したコードをそのまま動かせばいい、というわけではありません。コードの意味をある程度理解したうえで、自分の環境に合わせて修正する力は引き続き必要です。この記事のテンプレートを読み解いていくことが、その第一歩になればと思います。

まずはシンプルな自動化(空白削除や集計)から試してみて、動作を確認しながら少しずつ複雑な処理へと広げていくのがお勧めです。


関連記事:ChatGPTで業務効率化する方法|社内SEがすぐ使える具体例5選

関連記事:社内SE専用AIアシスタントの作り方|GPTsでマニュアル検索を効率化する

関連記事:ChatGPTでExcel業務を自動化する方法|社内SEが使える関数・VBA活用例

タイトルとURLをコピーしました