フォルダ内の全ブック全シートを1ブックに束ねるExcelマクロ
Excelファイル何十個に含まれてる全シートを1ファイルにまとめるという退屈極まりない作業を、しかも反復して行う羽目になりました。レシートでも食っていた方がマシです。
首を吊る前にExcelマクロにチャレンジしてみました。
以下のマクロを起動すると、マクロと同じフォルダにある1つ目のExcelファイルに他の全ブック・全シートをコピーして、『別名で保存』ダイアログを開きます。
ファイル名の順番にブックを開いて、シートの並びはそのままで1ブック目の末尾に移動させてるだけです。やってることは移動ですが、全てのシートを移動させると元のブックは保存せずに閉じられるので、元のブックには影響ありません。
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での配列の使い方は、下記ページを参考にさせていただきました。
余談
コメント「対象が無かったらやめます」のところは、当初は If (UBound(filePathList) = 0) Then
というふうにしようとしました。「変数 filePathList
がカラだったら」という判定をしたかったからです。
でも、要素数を確保してない配列に対して UBound()
すると インデックスが有効範囲にありません
エラーになってしまいました。こういうのはできないのかとググってみたところ……。
[Excel VBA]動的配列の初期化チェック – Tech Storage
[ExcelVBA][サンプルコード] 動的配列が空かどうか判定する - Javaのサンプルコード置いときますね
Variant型の動的配列で初期化済みかどうかを判定する方法 | プログラミングテクニック集キヤミー
大変そうなのでやめました。結局、対象が無いかどうかを判定したいだけなので、カウンタに使ってる変数がゼロかどうかを見るようになったのです。