こうこく
作 ▸
改 ▸

フォルダ内の全ブック全シートを1ブックに束ねるExcelマクロ

Excelファイル何十個に含まれてる全シートを1ファイルにまとめるという退屈極まりない作業を、しかも反復して行う羽目になりました。レシートでも食っていた方がマシです。

首を吊る前にExcelマクロにチャレンジしてみました。

以下のマクロを起動すると、マクロと同じフォルダにある1つ目のExcelファイルに他の全ブック・全シートをコピーして、『別名で保存』ダイアログを開きます。

ファイル名の順番にブックを開いて、シートの並びはそのままで1ブック目の末尾に移動させてるだけです。やってることは移動ですが、全てのシートを移動させると元のブックは保存せずに閉じられるので、元のブックには影響ありません。

Excel VBA
Sub フォルダ内の全ブックを1ブック化するマクロ()
	Dim filePathList() As String
    Dim fileName As Variant
    Dim i As Integer: i = 0
    
    '同フォルダ内のExcelファイルを走査してリストを作ります
    fileName = Dir(ThisWorkbook.Path & "\" & "*.xls*")
    Do While fileName <> ""
        If (fileName <> ThisWorkbook.Name) Then '自分は含めない
            ReDim Preserve filePathList(i)
            filePathList(i) = ThisWorkbook.Path & "\" & fileName 'フルパスで
            i = i + 1
        End If
        fileName = Dir()
    Loop
    
    '対象が無かったらやめます
    If (i = 0) Then
        Exit Sub
    End If
    
    '1つ目のブックに全部移動します
    Dim filePath As String
    Dim targetBook As Workbook
    Dim tmpBook As Workbook
    For i = LBound(filePathList) To UBound(filePathList)
        filePath = filePathList(i)
        If (i = 0) Then
            Set targetBook = Workbooks.Open(filePath)
        Else
            Set tmpBook = Workbooks.Open(filePath)
            Sheets().Move After:=targetBook.Sheets(targetBook.Sheets.Count) '末尾に移動
        End If
    Next i

    '別名保存ダイアログを開きます
	Application.GetSaveAsFilename
End Sub

この例では別名保存ですが、ファイル名があらかじめ決まってて固定なら、Workbook.SaveAs() を使えば充分です。

Dir() の使い方は、下記ページを参考にさせていただきました。

Office TANAKA - Excel VBAファイルの操作[ファイルの一覧を取得する]

VBAでの配列の使い方は、下記ページを参考にさせていただきました。

VBA基本(配列変数の利用)

余談

コメント「対象が無かったらやめます」のところは、当初は If (UBound(filePathList) = 0) Then というふうにしようとしました。「変数 filePathList がカラだったら」という判定をしたかったからです。

でも、要素数を確保してない配列に対して UBound() すると インデックスが有効範囲にありません エラーになってしまいました。こういうのはできないのかとググってみたところ……。

[Excel VBA]動的配列の初期化チェック – Tech Storage

[ExcelVBA][サンプルコード] 動的配列が空かどうか判定する - Javaのサンプルコード置いときますね

Variant型の動的配列で初期化済みかどうかを判定する方法 | プログラミングテクニック集キヤミー

大変そうなのでやめました。結局、対象が無いかどうかを判定したいだけなので、カウンタに使ってる変数がゼロかどうかを見るようになったのです。

この記事に何かあればこちらまで (非公開)