🐕

[ChatGPT]複数のExcelブックから特定のシートを1ブックにをマージするコード書かせてみた

2024/05/23に公開

概要

ChatGPTが進化を遂げている(応答精度が高くなってる)のをひしひし感じてきたので、簡単なツール作ってもらう投稿です

作るもの

  • 複数のExcelブックから特定のシートを1ブックにをマージするExcelマクロツール

プロンプト

あなたはシニアVBAプログラマです。

私は、VBAで複数のエクセルブックの中にある、特定の名前のシートを1つのエクセルブックにマージするツールを作りたいと思っています。
要件をお伝えするのでソースコードを書いてくれませんか?

## ファイル

①エクセルマクロブック「merge_excelbook.xlsm」


## 前提条件

①にはシート「index」があります。


## 処理フロー

- ①内の関数「collectTargetSheet」
  - マージ対象のエクセルファイルを選択させるダイヤログを表示させます
    - 拡張子は「.xlsx」「.xls」に絞らせます
    - ファイルは複数選択することが可能です
  - 選択したファイルを順番に繰り返し処理します
    - ファイル内のシート名を、①のシート「index」に転記する
      - ①シート「index」のA2にファイル名を転記
      - ①シート「index」のB2にファイルのフルパスを転記
      - ①シート「index」のC2にシート名を転記
      - ①シート「index」のC2にプルダウンで「◯」「ー」が選択できるようにする

- ①内の関数「merge」
  - 新しいワークブック(T)を作成する
  - ①シート「index」の[C2]が「◯」の場合、セル[B3]から下方向に記載されているファイルのフルパス情報を順番に読み込みます
    - 読み込んだファイルのフルパスを開く
    - 同じ行のセル[C]に記載されているシートをワークブック(T)にコピーする


以上です。

これらの処理を書いて下さい。


アウトプット


Option Explicit


Sub collectTargetSheet()
    Dim fd As FileDialog
    Dim FileChosen As Boolean
    Dim FilePath As Variant
    Dim wb As Workbook
    Dim wsIndex As Worksheet
    Dim ws As Worksheet
    Dim NextRow As Long

    ' シート「index」を取得
    Set wsIndex = ThisWorkbook.Sheets("index")
    
    ' 「index」シートをクリア
    wsIndex.Cells.Clear
    
    ' ヘッダーを追加
    wsIndex.Range("A1").Value = "ファイル名"
    wsIndex.Range("B1").Value = "フルパス"
    wsIndex.Range("C1").Value = "シート名"
    wsIndex.Range("D1").Value = "選択"
    
    ' ファイルダイアログを作成
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    fd.Title = "マージ対象のエクセルファイルを選択してください"
    fd.Filters.Clear
    fd.Filters.Add "Excel Files", "*.xls; *.xlsx"
    fd.AllowMultiSelect = True
    
    FileChosen = fd.Show
    
    If FileChosen Then
        NextRow = 2 ' データの書き込み開始行
        For Each FilePath In fd.SelectedItems
            Set wb = Workbooks.Open(FilePath)
            For Each ws In wb.Sheets
                wsIndex.Cells(NextRow, 1).Value = wb.Name
                wsIndex.Cells(NextRow, 2).Value = wb.FullName
                wsIndex.Cells(NextRow, 3).Value = ws.Name
                
                ' プルダウンリストを追加
                With wsIndex.Cells(NextRow, 4).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                        xlBetween, Formula1:="◯,-"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .ShowInput = True
                    .ShowError = True
                End With
                
                NextRow = NextRow + 1
            Next ws
            wb.Close SaveChanges:=False
        Next FilePath
    Else
        MsgBox "ファイルが選択されませんでした。", vbExclamation
    End If
End Sub


Sub merge()
    Dim wsIndex As Worksheet
    Dim NewWorkbook As Workbook
    Dim SourceWorkbook As Workbook
    Dim SourceSheet As Worksheet
    Dim i As Long
    Dim LastRow As Long
    Dim SourceFilePath As String
    Dim SourceSheetName As String

    ' 新しいワークブックを作成
    Set NewWorkbook = Workbooks.Add
    
    ' シート「index」を取得
    Set wsIndex = ThisWorkbook.Sheets("index")
    
    ' 「index」シートの最終行を取得
    LastRow = wsIndex.Cells(wsIndex.Rows.Count, 2).End(xlUp).Row
    
    ' 「index」シートの情報を基にシートをマージ
    For i = 3 To LastRow
        ' プルダウンリストで「◯」が選択されているか確認
        If wsIndex.Cells(i, 4).Value = "◯" Then
            SourceFilePath = wsIndex.Cells(i, 2).Value
            SourceSheetName = wsIndex.Cells(i, 3).Value
            
            ' ソースブックを開く
            Set SourceWorkbook = Workbooks.Open(SourceFilePath)
            
            ' ソースシートをコピー
            Set SourceSheet = SourceWorkbook.Sheets(SourceSheetName)
            SourceSheet.Copy After:=NewWorkbook.Sheets(NewWorkbook.Sheets.Count)
            
            ' ソースブックを閉じる
            SourceWorkbook.Close SaveChanges:=False
        End If
    Next i
    
    MsgBox "シートのマージが完了しました!", vbInformation
End Sub


  • シート「index」を作成したExcelマクロファイルにこちらのコードを貼り付けるだけでOK

成果物

所感

思った以上に正確に書いてくれました。

以上です。

GitHubで編集を提案

Discussion