スポンサーリンク

Excelブック内の全シートを,1ファイルずつに分けて一括保存するバッチ (シート単位で自動ファイル分割し,1シートごとに一斉ファイル出力)

単一のExcelブック内に,大量のワークシートが存在するとする。


シートがあまりにも多すぎて,ブックのサイズが何メガにも膨れ上がる。

そして,「もはや1ファイルで管理しきれない。

シートごとに別ファイルに分けよう」となる。


そういう場合,各シートを

「自動的に個別のファイルに分けてくれる」ツールがあると便利だ。

100シートあれば,100個のファイルに分割してくれる・・・というわけ。



下記のバッチで,すぐに実行できる。


以下のコードをメモ帳にコピペし,「シートごとに分割.bat」で保存。

そして,シートごとに分割したいExcelファイルを

このバッチにドロップすればよい。

@if(0)==(0) ECHO OFF

cscript.exe //nologo //E:JScript "%~f0" %*

@pause
GOTO :EOF
@end



/*

	ドロップしたExcelファイルの全シートを,
	1シートずつ個別のファイルに保存し直すバッチ

*/


// 引数取得
if( WScript.Arguments.length == 0 )
{
	WScript.Echo("引数がありません。");
	WScript.Quit();
}
var filename = WScript.Arguments.Unnamed(0);
var ws = WScript.CreateObject("WScript.Shell");
var cwd = ws.CurrentDirectory;
//var filepath = cwd + "\\" + filename;
var filepath = filename;



// Excelブックを開く
var excel = WScript.CreateObject("Excel.Application");
excel.Visible = true;
excel.Workbooks.Open( filepath );
var book = excel.Workbooks( excel.Workbooks.Count ); // ワークブックを取得
var xlMaximized = -4137;
excel.ActiveWindow.WindowState = xlMaximized; // 最大化




// 全シートをスキャンして,シート名を調査
var sheets = book.WorkSheets;
var e = new Enumerator( sheets );
var arr_sheets = [];
for( ; ! e.atEnd() ;  e.moveNext() )
{
	// シートを取得
	var sheet = e.item();
	
	// 保持
	arr_sheets.push( sheet );
	
}


// 取得済みの全シートについて
for( var i = 0; i < arr_sheets.length; i ++ ){

	// 新規ワークブックを作成
	excel.Workbooks.Add();
	var new_book = excel.Workbooks( excel.Workbooks.Count ); // ワークブックを取得

	// シートを先頭にコピー挿入
	//arr_sheets[i].Copy( new_book.Worksheets( new_book.Worksheets.Count ) );
	arr_sheets[i].Copy( new_book.Worksheets( 1 ) );
	
	// 不要シートを消す(Sheet1~Sheet3)
	new_book.Worksheets( 4 ).Delete();
	new_book.Worksheets( 3 ).Delete();
	new_book.Worksheets( 2 ).Delete();

	// 新規ファイル保存。ファイル名はシート名
	var new_filepath = cwd + "\\" + arr_sheets[i].Name + ".xlsx";
	WScript.Echo( "新規ブックのパス:" + new_filepath );
	new_book.SaveAs( new_filepath );
	
	// 閉じる
	new_book.Close();

}


このソースは,MS-DOS(コマンドプロンプト)バッチの中に,WSH/JScriptのコードを埋め込んで記述してある。


Excelファイルをドロップすると,バッチの存在するフォルダ内に,

各シートごとに分割されたエクセルが一斉に生成・保存される。


参考にしたページ:

JScript/WSH で,Excelファイルを読み書きしよう
http://language-and-engineering.hatenablog.jp/entry/20090717/p1


Excelブックの「シート目次」を,自動的に作成するバッチ (WSH/JScriptで,各シートへのリンク付きの目次を自動生成)
http://language-and-engineering.hatenablog.jp/entry/20110921/p1


BATとWSHのコードを1ファイルに混在させるためのshebang記法(複雑なバッチを1ファイルで実現)
http://computer-technology.hateblo.jp/entry/20131025/p1

関連する記事:

WSH/JScriptで,Excelファイルを読み書きする際のテンプレート (シート上の全行を読み書きするコードのひな型) - 主に言語とシステム開発に関して
http://language-and-engineering.hatenablog.jp/entry/20140214/p1


ドキュメント作成を楽にするための,Excel VBA 頻出8パターン - 主に言語とシステム開発に関して
http://language-and-engineering.hatenablog.jp/entry/20090401/p1


Excelシートを読み取って,INSERT文SQLを生成するバッチ (Kingsoft SpreadsheetをWSH/JScriptで自動操作) - 主に言語とシステム開発に関して
http://language-and-engineering.hatenablog.jp/entry/20121218/p1


Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み) - 主に言語とシステム開発に関して
http://language-and-engineering.hatenablog.jp/entry/20090731/p1