JScriptで家計簿シートを年別ファイル分割:改

no title

目次

▶︎
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ファイルを読み書きしよう





⇧目次へ戻る

コメント

このブログの人気の投稿

プロフィール

windows10でブルートゥース残量を5秒間確認するバッチ