ChatGPT を使った Excel VBA マクロの作成

はじめに:初めての AI 生成 VBA マクロ

ChatGPT は、簡単な英語の説明から完全で機能する VBA マクロを生成できます。マクロを実行するには、Excel を開き、Alt + F11 で VBA エディタを開き、新しいモジュールを挿入(挿入 > 標準モジュール)し、コードを貼り付けて F5 で実行します。最初のプロンプトはシンプルでテスト可能なものにします——例えば「選択範囲の背景色を水色に変更する VBA マクロを作成してください」。これにより、複雑な自動化に取り組む前に、生成されたコードが自分の環境で動作することを確認できます。

ワークブックは常にマクロ有効ファイル(.xlsm)として保存し、通常の .xlsx ではないことに注意してください。標準ワークブックは保存時にすべての VBA コードを削除します。リボンの下にセキュリティ警告バーが表示された場合は、「コンテンツの有効化」をクリックしてマクロの実行を許可します。ChatGPT 生成コードについては、マクロが期待通りに動作すると確信できるまで、テスト用コピーで実行してください。

生産性マクロ:今日から使える実例

マクロ 1:データテーブルの自動書式設定

プロンプト:「現在の選択範囲に対して、見出し行を太字にし、すべてのデータセルに下罫線を追加し、列幅を自動調整し、先頭行を固定する VBA マクロを作成してください。」

生成されたコード:

Sub FormatDataTable()
    Dim rng As Range
    Set rng = Selection
    
    ' 見出し行の書式設定
    With rng.Rows(1)
        .Font.Bold = True
        .Interior.Color = RGB(68, 114, 196)
        .Font.Color = RGB(255, 255, 255)
    End With
    
    ' すべてのセルに罫線を追加
    With rng.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .Color = RGB(180, 180, 180)
    End With
    
    ' 列幅の自動調整
    rng.EntireColumn.AutoFit
    
    ' 先頭行の固定
    ActiveWindow.SplitRow = 1
    ActiveWindow.FreezePanes = True
    
    MsgBox "テーブルの書式設定が完了しました!", vbInformation
End Sub

このマクロは安全で元に戻せ(実行後に Ctrl+Z で元に戻せます)、基本的な VBA パターン(Range オブジェクト、効率的なプロパティ設定のための With ブロック、MsgBox によるユーザーフィードバック)を示しています。

マクロ 2:各ワークシートを個別の PDF としてエクスポート

プロンプト:「アクティブなワークブックのすべてのワークシートを、ワークブックと同じフォルダに個別の PDF ファイルとしてエクスポートする VBA マクロを作成してください。ファイル名は 'ワークブック名_シート名.pdf' の形式で、非表示シートはスキップしてください。」

生成されたコード:

Sub ExportSheetsAsPDF()
    Dim ws As Worksheet
    Dim folderPath As String
    Dim pdfName As String
    
    folderPath = ThisWorkbook.Path & "\"
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then
            pdfName = folderPath & _
                      Replace(ThisWorkbook.Name, ".xlsm", "") & _
                      "_" & ws.Name & ".pdf"
            
            ws.ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:=pdfName, _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True
            
            Debug.Print "エクスポート済み: " & pdfName
        End If
    Next ws
    
    MsgBox "エクスポート完了!イミディエイト ウィンドウ(Ctrl+G)で詳細を確認してください。", vbInformation
End Sub

このマクロは、Excel の「ファイル > 名前を付けて保存 > PDF」と同じエンジンである ExportAsFixedFormat を使用しています。Worksheets コレクションをループし、非表示シートをスキップし、文字列連結で動的にファイル名を構築します。Debug.Print ステートメントでイミディエイト ウィンドウに出力を確認できます。

マクロ 3:Excel データから Outlook でメール送信

プロンプト:「A 列(A2 から開始)からメールアドレス、B 列から件名、C 列から本文を読み取る VBA マクロを作成してください。各行について Outlook 経由でメールを送信します。A 列が空になったら停止します。送信間隔は 2 秒にしてください。」

生成されたコード:

Sub SendBulkEmails()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim i As Long
    Dim lastRow As Long
    
    On Error Resume Next
    Set OutApp = GetObject(, "Outlook.Application")
    If OutApp Is Nothing Then
        Set OutApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To lastRow
        If Cells(i, 1).Value = "" Then Exit For
        
        Set OutMail = OutApp.CreateItem(0)
        With OutMail
            .To = Cells(i, 1).Value
            .Subject = Cells(i, 2).Value
            .Body = Cells(i, 3).Value
            .Send
        End With
        
        Application.Wait Now + TimeValue("00:00:02")
    Next i
    
    Set OutMail = Nothing
    Set OutApp = Nothing
    MsgBox "すべてのメールが送信されました!", vbInformation
End Sub

Application.Wait 行は送信間に 2 秒の遅延を強制し、一括送信時の Outlook のレート制限やスパムフィルターのトリガーを回避します。On Error Resume Next と Nothing チェックによるエラー処理は、Outlook がまだ起動していない場合を適切に処理します。

より良い VBA コードのためのプロンプトエンジニアリング

ChatGPT 生成 VBA の品質は、リクエストの伝え方に大きく依存します。この構造化アプローチを使用してください:

  1. トリガーを定義:「ボタンクリック時に実行」vs「ワークブック開封時に自動実行」vs「選択範囲に対して実行」。
  2. データの場所を指定:「A 列の A2 から顧客名、B 列にメールアドレスがあります。」
  3. 正確な結果を記述:「各行について、顧客名の新しいワークシートを作成し、そのデータをコピーします。」
  4. エラー処理要件を記述:「メールアドレスが欠落している行はエラーを表示せずにスキップします。」
  5. 制約条件を明記:「ワークブックには 50,000 行あります。速度を最適化してください」または「Windows 上の Excel 2016 で動作する必要があります。」

プロのヒント:複雑なマクロでは、リクエストを小さな部分に分割します。最初にメインループ構造を要求し、次に各サブルーチンを個別に要求します。ChatGPT にコメントを追加しながら書くように依頼してください——これによりデバッグが大幅に容易になります。

AI 生成 VBA コードのデバッグ

AI 生成マクロが初回で完璧に動作することは稀です。以下は体系的なデバッグワークフローです:

  1. まずコンパイル:VBA エディタで、デバッグ > VBAProject のコンパイル を選択します。これにより、実行前に構文エラー、未宣言変数、欠落した参照を検出します。
  2. Option Explicit を追加:生成されたコードのモジュール先頭に Option Explicit がない場合は追加します。これにより変数宣言が強制され、変数名のタイプミスを検出します。
  3. ブレークポイントを使用:行の左余白をクリックしてブレークポイントを設定し、F8 で 1 行ずつステップ実行します。変数にカーソルを合わせると現在の値が表示されます。
  4. Debug.Print 文を追加:戦略的なポイントに Debug.Print "行: " & i & " 値: " & Cells(i,1).Value を挿入して実行フローを追跡します。
  5. エラーを ChatGPT に貼り戻す:正確なエラーメッセージと行番号をコピーし、「12 行目で 'Runtime error 1004: Application-defined or object-defined error' が発生しました。以下が完全なコードです。原因は何ですか?」と質問します。AI は具体的なエラーフィードバックを与えられると自己修正できることがよくあります。

AI 生成マクロのセキュリティ考慮事項

VBA マクロはファイルシステム、レジストリ、ネットワークに完全にアクセスできます。AI 生成コードはインターネットからダウンロードしたコードと同じ注意を払って扱ってください:

再利用可能な VBA ツールキットの構築

最も信頼性の高い AI 生成マクロを個人用マクロブック(Personal.xlsb)に保存します。この非表示のワークブックは Excel を開くたびに読み込まれ、すべてのワークブックでマクロを利用できるようにします。作成するには、任意の簡単なマクロを記録し、保存先として「個人用マクロブック」を選択します。その後、VBA エディタを開き、VBAProject (PERSONAL.XLSB) を見つけて、厳選したマクロを含むモジュールを追加します。

マクロを機能別にモジュールに整理します:書式設定用、データエクスポート用、メール自動化用、ワークシート管理用。カスタムリボンタブ(ファイル > オプション > リボンのユーザー設定)を追加し、よく使うマクロにボタンを割り当ててワンクリックでアクセスできるようにします。時間の経過とともに、このツールキットは数十の手動手順を置き換え、Excel プロジェクト全体の一貫性を確保します。

この記事について質問や誤りを見つけましたか?