JScriptで家計簿シートを年別ファイル分割:改
目次
▶︎
all
running...
はじめに
JScript/WSH で,Excelファイルを読み書きしよう
で個々のシートをファイル別に分割するJScriptを知った。
これは家計簿(sample.xlsx)の年毎にシートをファイル分割できるのではと思い、実践。
地味に手間取る始末。5時間ぐらいか…
Batch
- 前半はほぼ、上記のサイトのコピペなのだけれど、後半にserach関数を追加して正規表現でシート検索して、ファイルを分割している。
- searchに引数として文字を入れるとその文字ごとにシートを探してファイル分割してくれる。
- なお、ファイル名は引数の名前が使われる。
エクセルシート分割バッチ.bat
@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 = false; excel.DisplayAlerts = false; 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); } var previous = ''; // 取得済みの全シートについて for (var i = 0; i < arr_sheets.length; i++) { // searchに文字を入れるとその単語のシートごとにファイル分割。 search('2020'); } previous = ''; for (i = 0; i < arr_sheets.length; i++) { search('2021'); } WScript.Quit(); function search(search_string) { var new_filepath = cwd + '\\' + search_string + '.xlsx'; var new_book; var regexp = new RegExp(String(search_string)); if (regexp.test(arr_sheets[i].Name)) { if (!(search_string === previous)) { // 新規ワークブックを作成 excel.Workbooks.Add(); new_book = excel.Workbooks(excel.Workbooks.Count); // ワークブックを取得 } else { excel.Workbooks.Open(new_filepath); new_book = excel.Workbooks(excel.Workbooks.Count); // ワークブックを取得 } // シートを先頭にコピー挿入 arr_sheets[i].Copy(new_book.Worksheets(1)); // 新規ファイル保存。ファイル名はシート名 WScript.Echo('新規ブックのパス:' + new_filepath); new_book.SaveAs(new_filepath); // 閉じる new_book.Close(); previous = search_string; } }
JScriptの部分だけシンタックスハイライトVer.
- 見づらいので、別途シンタックスハイライト適用版を記載した
/* ドロップした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 = false; excel.DisplayAlerts = false; 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); } var previous = ''; // 取得済みの全シートについて for (var i = 0; i < arr_sheets.length; i++) { // searchに文字を入れるとその単語のシートごとにファイル分割。 search('2020'); } previous = ''; for (i = 0; i < arr_sheets.length; i++) { search('2021'); } WScript.Quit(); function search(search_string) { var new_filepath = cwd + '\\' + search_string + '.xlsx'; var new_book; var regexp = new RegExp(String(search_string)); if (regexp.test(arr_sheets[i].Name)) { if (!(search_string === previous)) { // 新規ワークブックを作成 excel.Workbooks.Add(); new_book = excel.Workbooks(excel.Workbooks.Count); // ワークブックを取得 } else { excel.Workbooks.Open(new_filepath); new_book = excel.Workbooks(excel.Workbooks.Count); // ワークブックを取得 } // シートを先頭にコピー挿入 arr_sheets[i].Copy(new_book.Worksheets(1)); // 新規ファイル保存。ファイル名はシート名 WScript.Echo('新規ブックのパス:' + new_filepath); new_book.SaveAs(new_filepath); // 閉じる new_book.Close(); previous = search_string; } }
余談: バッチによるバックアップを考える
このサイトを参考に、バックアップをする方法を学ぶ。
-
コピーコマンド
robocopy
Robust File Copyの略であり、堅固(robust)で確実なファイルコピーという意味
robocopy
<コピーしたいフォルダー> <第2引数にはコピー先のフォルダー> (<オプション:*.xls等の拡張子 >) -
%cd%
: バッチがある現在の場所のフォルダー。
もしデスクトップにバッチファイルを置いたら、%cd% = C:\Users\<user>\Desktop
例: エクセルファイルのみをバックアップ
excel-backup.bat
@echo off robocopy %cd% c:\ドキュメント\家計簿\家計簿バックアップ *.xls *.xlsx pause
参考サイト
・ JScript/WSH で,Excelファイルを読み書きしよう
コメント
コメントを投稿