残業を減らす!Officeテクニック

既存Excelマクロを触らずに改修!? 該当シートをCopilotに見せてコードを書き換える

既存マクロを、コードを読み解かずに改修する

 以前の記事では、[マクロの記録]で作成したコードをCopilotに修正してもらい、複数のシートを1枚ずつPDFファイルとして保存できるようにしました。

[マクロの記録]で記録したマクロを元にCopilotに繰り返しの処理を追加してもらい、シートを1枚ずつPDFファイルとして保存するように修正したコード

 正常に動いているマクロでも、実際に使っていると運用方法が変わることがあります。今回は、「必要な支社だけPDFファイルとして出力したい」「ファイル名に請求月も入れたい」という要望が加わったとします。

 自分でVBAを書き換えるなら、どの部分でシートを判定しているのか、ファイル名をどこで指定しているのかを調べる必要があります。しかし、既存コードを丸ごとCopilotに渡して修正版を作ってもらえば、1行ずつコードを修正する必要はありません。

 さらに今回は、ExcelのCopilotを使います。開いているデータの内容を参照できるため、[設定]シートの列構成まで細かくプロンプトへ書かずに相談してみましょう。

[設定]シートを見てもらって改修を依頼する

 [設定]シートには、「支社」「対象シート」「請求月」「出力」の各列が用意されています。[出力]列にはチェックボックスがあり、PDFファイルとして保存したい支社だけONにできるようになっています。

[設定]シートには、「支社」列(A列)、「対象シート」列(B列)、「請求月」列(C列)、「出力」列(D列)が用意されている。「出力」列がONのシートを対象にして、「支社名_請求月.pdf」の形式の名前でPDFファイルを出力したい

 既存のコードはExcelのCopilotにコピー&ペーストしますが、「A列が支社名」「B列が対象シート」といった情報まではプロンプトに含めません。[設定]シートを確認してもらい、「何を基準に処理するのか」「どのような結果にしたいのか」を伝えます。

 一方、正常に動いている処理まで変更されないよう、「保存先を選択する処理」と「PDF出力の設定」は必要がなければ変更しないことも指定します。

以下のマクロは正常に動いています。

Sub PDF出力()

Dim ws As Worksheet

Dim SavePath As String

Dim fd As FileDialog

' フォルダー選択ダイアログを表示

Set fd = Application.FileDialog(msoFileDialogFolderPicker)

If fd.Show <> -1 Then Exit Sub

SavePath = fd.SelectedItems(1)

' すべてのワークシートを順番に処理

For Each ws In ThisWorkbook.Worksheets

' 表示中かつ「設定」シート以外を対象

If ws.Visible = xlSheetVisible And ws.Name <> "設定" Then

ws.ExportAsFixedFormat _

Type:=xlTypePDF, _

Filename:=SavePath & "¥" & ws.Name & ".pdf", _

Quality:=xlQualityStandard, _

IncludeDocProperties:=True, _

IgnorePrintAreas:=False, _

OpenAfterPublish:=False

End If

Next ws

End Sub

[設定]シートの内容を確認して、PDFファイルの出力対象やファイル名を[設定]シートの内容から判断するように改修してください。以下の要件を踏まえて、修正後のコードを全文で出力してください。

・[出力]のチェックボックスがONになっている行だけを対象にして、指定されているワークシートをPDFファイルとして保存する

・PDFファイル名には「支社」列と「請求月」列を使い、「支社名_請求月.pdf」とする

・現在の保存先を選択する処理とPDF出力の設定は、必要がなければ変更しない

上記のプロンプトを送信すると、コードが出力される。変数の宣言を強制する「Option Explicit」も冒頭に追加されている

 [設定]シートの実際の構造を参照しない場合、「1行目が見出しで2行目以降がデータ」と仮定したコードになることもあります。今回生成されたコードはどうでしょうか。

Option Explicit

Sub PDF出力()

    Dim wsSetting As Worksheet
    Dim wsTarget As Worksheet
    Dim SavePath As String
    Dim FileName As String
    Dim BranchName As String
    Dim TargetSheetName As String
    Dim BillingMonth As String
    Dim LastRow As Long
    Dim RowNo As Long
    Dim fd As FileDialog

    Set wsSetting = ThisWorkbook.Worksheets("設定")

    ' フォルダー選択ダイアログを表示
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)

    If fd.Show <> -1 Then Exit Sub

    SavePath = fd.SelectedItems(1)

    ' 設定シートの最終行を取得
    LastRow = wsSetting.Cells(wsSetting.Rows.Count, "A").End(xlUp).Row

    ' 設定シートを順番に処理
    For RowNo = 4 To LastRow

        ' [出力]がON(TRUE)の行だけを対象
        If wsSetting.Cells(RowNo, "D").Value = True Then

            BranchName = Trim$(CStr(wsSetting.Cells(RowNo, "A").Value))
            TargetSheetName = Trim$(CStr(wsSetting.Cells(RowNo, "B").Value))
            BillingMonth = Trim$(CStr(wsSetting.Cells(RowNo, "C").Value))

            Set wsTarget = Nothing

            On Error Resume Next
            Set wsTarget = ThisWorkbook.Worksheets(TargetSheetName)
            On Error GoTo 0

            If Not wsTarget Is Nothing Then

                ' ファイル名:支社_請求月.pdf
                FileName = BranchName & "_" & BillingMonth & ".pdf"

                wsTarget.ExportAsFixedFormat _
                    Type:=xlTypePDF, _
                    Filename:=SavePath & "\" & FileName, _
                    Quality:=xlQualityStandard, _
                    IncludeDocProperties:=True, _
                    IgnorePrintAreas:=False, _
                    OpenAfterPublish:=False

            Else
                MsgBox "対象シート「" & TargetSheetName & _
                       "」が見つかりません。" & vbCrLf & _
                       "設定シートの" & RowNo & "行目を確認してください。", _
                       vbExclamation
            End If

        End If

    Next RowNo

    MsgBox "PDFファイルの出力が完了しました。", vbInformation

End Sub

 注目したいのは、変数「RowNo」のループが「4」、つまり実際にデータが始まる4行目からになっていることです。[出力]列のTRUE/FALSE、各列の値、ファイル名の組み立ても[設定]シートの構成に沿っています。既存の保存先を選択する処理やPDFファイルとして保存する処理は、そのまま利用されています。

 指示していないメッセージボックス表示の処理が追加されていますが、今回のPDF出力の結果には影響しないため、そのまま採用します。

生成されたコードに丸ごと置き換えて確認する

 修正版のコードが生成されたら、既存のマクロを1行ずつ修正する必要はありません。Visual Basic Editorで元のコードを修正版へ置き換えます。

 現状の[設定]シートでは、東京、大阪、福岡のチェックがONになっているので、3支社のPDFファイルが「東京_202609.pdf」のようなファイル名で出力されれば成功です。

生成されたコードで置き換えて、実行する
処理完了を伝えるメッセージボックスが表示され、該当の3支社のPDFファイルが出力された

 この後、チェックのON/OFFを切り替えたり、「請求月」を変更したりして、想定どおりに動作するか確認する必要があります。Copilotが生成したコードでもデバッグは欠かせませんが、それは人間がコードを修正した場合でも同じです。

 既存マクロを改修する時は、コードをCopilotに渡して修正内容を細かく指示するだけでなく、処理の判断材料になるシートも参照してもらう方法があります。「何を変えたいか」「何を変えたくないか」を伝え、ファイルの内容も踏まえてコードを作り直してもらう。こうした使い方なら、VBAの細かな修正箇所を自分で特定しなくても、現在の運用に合わせて既存マクロを改修できます。