見出し画像

Excel 選択した.xlsxファイルを一つのファイルにまとめる

選択した「.xlsx」ファイルを一つのファイルにマージするコードです。


Sub xlsxMergeScript()
   Dim OpenFiles As Variant
   '複数選択可能のダイアログボックスを開く
   OpenFiles = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx", MultiSelect:=True)
   If IsArray(OpenFiles) = False Then Exit Sub
   If UBound(OpenFiles) = 1 Then
       MsgBox "選択されたファイルが単一のファイルです。" & vbNewLine & OpenFiles(1) & _
           vbNewLine & "単一のファイルではスクリプトを実行しません。", vbCritical
       Exit Sub
   End If
   'Application~は決まり文句
   With Application
       .ScreenUpdating = False
       .EnableEvents = False
       .Calculation = xlCalculationManual
   End With
   Dim Mergebook As Workbook
   Dim wc As Integer
   '新しいブックを開く、何のシートを持ってきたのか表すのがList、データをひとまとめにしたのがMerge
   Workbooks.Add
   With ActiveSheet
       .Name = "List"
       .Copy After:=Sheets("List")
   End With
   ActiveSheet.Name = "Merge"
   Set Mergebook = ActiveWorkbook
   wc = Mergebook.Worksheets.Count
   '
   Dim targetBookName As String, ws As Worksheet, i As Integer
   Dim regionValues As Variant, MergeEndRow As Integer: MergeEndRow = 1
   Dim ListValues As Variant, ListRows As Integer: ListRows = 1
   ReDim ListValues(3)
   On Error GoTo PasswordError
   For i = LBound(OpenFiles) To UBound(OpenFiles)
       Workbooks.Open Filename:=OpenFiles(i), Password:=vbNullString
       targetBookName = Dir(OpenFiles(i))
       With Workbooks(targetBookName)
           ListValues(0) = OpenFiles(i)
           ListValues(1) = Dir(OpenFiles(i))
           For Each ws In .Worksheets
               ListValues(2) = ws.Name
               regionValues = ActiveSheet.Range("A1").CurrentRegion
               With Mergebook
                   With .Sheets("List")
                       .Range(.Cells(ListRows, 1), .Cells(ListRows, 3)) = ListValues
                       ListRows = ListRows + 1
                   End With
                   With .Sheets("Merge")
                       .Range(.Cells(MergeEndRow, 1), .Cells(MergeEndRow + UBound(regionValues, 1) - 1, UBound(regionValues, 2))) = regionValues
                       MergeEndRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                   End With
               End With
               ws.Move After:=Mergebook.Sheets(wc)
               wc = wc + 1
           Next ws
       End With
   Next i
   Mergebook.Sheets("List").Select
   Set Mergebook = Nothing
   With Application
       .ScreenUpdating = True
       .EnableEvents = True
       .Calculation = xlCalculationAutomatic
   End With
   Exit Sub
PasswordError:
   MsgBox Dir(OpenFiles(i)) & vbNewLine & "パスワード付ファイルのため、作業を継続できませんでした。"
   Application.DisplayAlerts = False
   Mergebook.Close
   Set Mergebook = Nothing
   With Application
       .ScreenUpdating = True
       .EnableEvents = True
       .Calculation = xlCalculationAutomatic
       .DisplayAlerts = True
   End With
End Sub

おお!できたできた。カツオ初めてのnoteでコードです。Cool!!

あんま解説する気はないですが、せっかく最初のほうでわくわく感あるので少し書こうかな。

Application.GetOpenFilenameはダイアログボックス開いてファイルを選択できます。オプションでxlsxファイル抽出する設定にしていますがそこ変えることでcsvファイルとかにも対応できるので応用は可能です。

ファイルの選択が単一のファイルだと作業はやりません。複数のときのみ作業します。

作業を開始したら新しいブックをつくって
「Merge」と「List」ってシートを作ります。
Mergeには開いたエクセルファイルの全シートのデータをダーっと並べていきます。
Listには開いたシートのもとの場所、ファイルの名前、シートの名前を記録していきます。

このマクロの弱点

Password付ファイルには対応していないです。それに当たったら作業全中断する仕組みにしました。
またMergeにデータまとめていくときも

regionValues = ActiveSheet.Range("A1").CurrentRegion

この関係でうまくいかない可能性あり。ここ解決できたらなあ。

この記事が気に入ったらサポートをしてみませんか?