フォルダ内にある大量のエクセルファイルを一つのシートにつなげるのは人間のやる仕事じゃない。。。
というわけで、全部自動で一括結合するプログラムを書いてみました!
方法としては以下のような感じです。
- エクセルファイルを全部CSV形式のファイルに変換して保存
- CSVファイルをすべてコマンド処理でコピペしてまとめる
エクセル開いてVBAでっていう方法もありますが、エクセルを一々開く必要があって面倒な上に、エクセルでの作業と競合する可能性があるので作業の妨げになることがあります。
そのため、ここでは、エクセルVBAは使用せずVBSで実行する方法を書きました。この方法ならエクセルを開く必要もなく、VBSファイルをダブルクリックするだけなので、手軽に実行できます。
①エクセルファイルをCSVに変換
下記のコードをメモ帳などに貼り付け、「xlsx_to_csv.vbs」のような適当なファイル名で保存します。
○○○.vbsというように拡張子さえ、vbsであればファイル名は何でも大丈夫です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Option Explicit '変数宣言を強制する Dim bk, xls, f, gf, fso, varArr, varRes varArr = Array("xls","xlsx","xlsm") 'エクセルファイル拡張子を配列に格納 Set fso = CreateObject("Scripting.FileSystemObject") Set gf = fso.GetFolder(fso.GetParentFolderName(WScript.ScriptFullName)) Set xls = CreateObject("Excel.Application") xls.Application.DisplayAlerts = False xls.Visible = False For Each f In gf.Files 'フォルダ内のすべてのファイルに対して処理実行 'ファイルの拡張子とエクセルファイル拡張子の一致チェック varRes = Filter(varArr, LCase(fso.GetExtensionName(f.Name))) 'エクセルファイル拡張子と一致する場合>>CSVに変換処理実行 If Ubound(varRes) <> -1 Then Set bk = xls.Workbooks.Open(gf & "\" & f.Name) bk.SaveAs gf & "\" & fso.GetBaseName(f.Name) & ".csv", 6 bk.Close Set bk = Nothing End If Next 'すべて忘れてメモリ解放 xls.Quit Set xls = Nothing Set gf = Nothing Set fso = Nothing MsgBox("Complete!!") |
②CSVファイルを一括コピペしてall.csvファイルにまとめる
下記のコードをメモ帳などに貼り付け、「merge_csv.bat」のような適当なファイル名で保存します。
○○○.batというように拡張子さえ、batであればファイル名は何でも大丈夫です。
1 |
copy *.csv all.csv |
「.bat」ファイルを実行できない環境もあるかもしれません。
その場合は下記コードをメモ帳などに貼り付け、「merge_csv.vbs」のような適当なファイル名で保存して利用してください。
1 2 |
Set objShell = CreateObject("WScript.Shell") objShell.Run "cmd /c copy *.csv all.csv",0,true |
上記スクリプト内でcmdのcだけ半角に修正してお使いください。
(なぜか501エラーが出て投稿できないので・・・)
③実行する
- 結合したいエクセルファイル
- xlsx_to_csv.vbs
- merge_csv.bat
上記のものだけを一つのフォルダにまとめます。
xlsx_to_csv.vbsをダブルクリック⇒完了メッセージが出る。
merge_csv.batをダブルクリック⇒all.csvが生成される。
以上でエクセルファイルが全部all.csvに自動的にコピペされるはずです。
この方法のメリット
この方法ではデータの一部が欠損したりするようなエラーが起きにくいメリットがあります。
また、エクセルを開かずにファイルを結合できるため、VBAマクロで処理する場合より高速ですし、処理中もエクセルでの作業を中断しなくて済みます。
注意点
注意してほしいのは、エクセルファイル内に複数のシートがある場合には、そのエクセルファイルを保存した時に開いていたシートのみがall.csvにまとめられ、他のシートは無視される点です。
あと、最終的に結合して生成するのはCSVファイルですので、もちろん書式とかは無視されます。
今回想定しているのは、経理システムとかから吐き出したデータを一つのファイルに結合するような状況ですので、上記のような部分は簡便的に処理しています。
コメント