Windows Scripting Host
Windowsの操作を何らかの方法で記述できるツールは幾つもあると思うのですが、今日は少し枯れた技術を紹介したいと思います。
Microsoftが開発したWindows Scripting Host(WSH)という実行環境で、言語は標準で「VBScript」と「JScript」が使えます。
VBScriptは「Visual Basic」、JScriptはほぼ「JavaScript」と同じ文法で記述できます。
Excel文書を新規作成して、PDFに印刷して、文書を保存して終了します。
適当なフォルダに置いて、ダブルクリックで実行してみて下さい。(WSHで実行)
環境にもよりますが、30秒くらいで終わると思います。
[excel_new_workbook.js]
/**************************************************
* excel_new_workbook.js
*
* - $HeadURL$
*
* - Version: $Revision: 73 $
* - $Date:: 2020-01-17 23:10:38 +0900#$
* - Author: tomyama 2009-2020
* - Only for personal use !
**************************************************/
//**Start Encode**
/* A marker for "screnc" commands. */
/* The lower part of this mark is encoded. *//*** 定数定義: begin ***/
var strExcelBookName = "Book1.xlsx";
var strExcelSheetName = "Sheet1";
var strExcelGraphName = "年間販売数グラフ";
var strExcelPdfName = "Book1.pdf";var lnLeft = 1;
var lnRight = 2;
var lnTop = 3;
var lnBottom = 4;var lnStyle_normal = 1;
var lnStyle_double = -4119;var lnWeight_medium = -4138;
var clPattern_solid = 1;
var clColor_green = 35; /* 薄緑色 */
var clColor_yellow = 36; /* 薄黄色 */var xlPaperA3 = 8; /* 用紙サイズ: A3 */
var xlPaperA4 = 9; /* 用紙サイズ: A4 */var xlPortrait = 1; /* 印刷の向き: 縦 */
var xlLandscape = 2; /* 印刷の向き: 横 *//***
* xlPasteType クラス
***/
//var xlPasteAll = -4104; /* (既定)すべて */
//var xlPasteFormulas = -4123; /* 数式 */
//var xlPasteValues = -4163; /* 値 */
var xlPasteFormats = -4122; /* 書式 */
//var xlPasteComments = -4144; /* コメント */
//var xlPasteValidation = 6; /* 入力規則 2002以降(※) */
//var xlPasteAllExceptBorders = 7; /* 罫線を除く全て */
//var xlPasteColumnWidths = 8; /* 列幅 2002以降(※) */
//var xlPasteFormulasAndNumberFormats = 11; /* 数式と数値の書式 2002以降 */
//var xlPasteValuesAndNumberFormats = 12; /* 値と数値の書式 2002以降 */
//var xlPasteAllUsingSourceTheme = 13; /* コピー元のテーマを使用してすべて貼り付け 2007以降 */
//var xlPasteAllMergingConditionalFormats = 14; /* すべての結合されている条件付き書式 2010以降 *//***
* xlReferenceStyle
***/
var xlA1 = 1;
var xlR1C1 = -4150;/*** 定数定義: end ***/
var strScriptPath = WScript.ScriptFullName;
//WScript.Echo( "Path: " + strScriptPath );
var strScriptDir = strScriptPath.replace( /\\[^\\]+$/, "" );
//WScript.Echo( "Dir : " + strScriptDir );var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
/*** エクセル関連のインスタンスを作成する ***/
var objExcel = WScript.CreateObject( "Excel.Application" );
objExcel.Visible = true; /* エクセルを可視化 */
objExcel.SheetsInNewWorkbook = 1; /* ブックに含むシートの数を指定する */
var objEWB = objExcel.Workbooks.Add(); /* ブックを追加する */
var objEWS = objExcel.ActiveSheet; /* シートへの参照を取得する */
objEWS.Name = strExcelSheetName; /* シートに名前を付ける */var objSts = new StatusLine();
objSts.Create( objEWS );/*** ブックに名前を付けて保存する ***/
var strExlBookName = strScriptDir + "\\" + strExcelBookName;
if( objFso.FileExists( strExlBookName ) ){
objFso.DeleteFile( strExlBookName );
}
objEWB.SaveAs( strExlBookName );/*** セルに値と式を入力する ***/
objSts.SetCell( "A7" );
objSts.Msg( "セルに値と式を入力しています…" );objEWS.Range("A1").Value = "項目\n(Item)";
objEWS.Range("A1").Characters(1, 2).PhoneticCharacters = "こうもく";objEWS.Range("B1").Value = "フリガナ\n(Phonetic)";
objEWS.Range("B1").Characters(1, 1).PhoneticCharacters = "ふりがな";objEWS.Range("C1").Value = "値\n(Value)";
objEWS.Range("C1").Characters(1, 1).PhoneticCharacters = "あたい";objEWS.Range("D1").Value = "整数値\n(Integer)";
objEWS.Range("D1").Characters(1, 3).PhoneticCharacters = "せいすうち";objEWS.Range("A2").Value = "数字";
objEWS.Range("A2").Characters(1, 2).PhoneticCharacters = "すうじ";
objEWS.Range("B2").Value = "=PHONETIC($A2)";
objEWS.Range("C2").Value = "123";
objEWS.Range("D2").Value = "=$C2";objEWS.Range("A3").Value = "数字似の文字列";
objEWS.Range("A3").Characters(1, 2).PhoneticCharacters = "すうじ";
objEWS.Range("A3").Characters(3, 1).PhoneticCharacters = "に";
objEWS.Range("A3").Characters(5, 3).PhoneticCharacters = "もじれつ";
objEWS.Range("B3").Value = "=PHONETIC($A3)";
objEWS.Range("C3").Value = "'123";
objEWS.Range("D3").Value = "=VALUE($C3)";objEWS.Range("A4").Value = "乱数";
objEWS.Range("A4").Characters(1, 2).PhoneticCharacters = "らんすう";
objEWS.Range("B4").Value = "=PHONETIC($A4)";
objEWS.Range("C4").Value = "=RAND()"; /* 乱数 */
objEWS.Range("D4").Value = "=ROUND($C4*1000,0)"; /* 四捨五入 */objEWS.Range("C5").Value = "合計";
objEWS.Range("C5").Characters(1, 2).PhoneticCharacters = "ごうけい";
objEWS.Range("C5").Font.Bold = true; /* 太字 */
objEWS.Range("C5").HorizontalAlignment = 4; /* 横位置: 右揃え */
objEWS.Range("D5").Value = "=SUM(D$2:D$4)";
/*** 書式設定 ***/
objSts.Msg( "書式設定中…" );objEWS.Cells.Select;
objExcel.Selection.Font.Name = "MS ゴシック";
objExcel.Selection.Font.Size = 14;var objRange;
objEWS.Range("A1:D1").Select;
objRange = objExcel.Selection;
objRange.Font.Bold = true; /* 太字 */
objRange.HorizontalAlignment = 3; /* 横位置: 3=中央揃え */
objRange.VerticalAlignment = 1; /* 縦位置: 1=上詰め */
objRange.WrapText = true; /* 文字列を折り返して表示する */
objRange.Orientation = 0;
objRange.AddIndent = false;
objRange.IndentLevel = 0;
objRange.ShrinkToFit = false;
objRange.ReadingOrder = 1; /* xlContext */
objRange.MergeCells = false;objEWS.Range("B4").NumberFormatLocal = "0.0000_ "; /* 小数点以下は4桁にする */
objEWS.Columns("A:A").ColumnWidth = 20; /* セルの幅を調整 */
objEWS.Columns("B:B").ColumnWidth = 25; /* セルの幅を調整 */
objEWS.Columns("D:D").ColumnWidth = 50; /* 一旦幅を拡げてから… */
objEWS.Columns("D:D").EntireColumn.AutoFit(); /* 縮める */
objEWS.Columns("C:C").ColumnWidth = objEWS.Columns("D:D").ColumnWidth;objEWS.Rows("5:5").RowHeight = 30; /* セルの高さを調整 */
/*** 罫線を引く ***/
objSts.Msg( "罫線を引いています…" );objEWS.Range("A1:D4").Select;
objRange = objExcel.Selection;
objRange.Borders(lnLeft ).LineStyle = lnStyle_normal;
objRange.Borders(lnRight ).LineStyle = lnStyle_normal;
objRange.Borders(lnTop ).LineStyle = lnStyle_normal;
objRange.Borders(lnBottom).LineStyle = lnStyle_normal;objEWS.Range("A1:D1").Borders(lnBottom).LineStyle = lnStyle_double;
objEWS.Range("D1:D4").Borders(lnLeft ).LineStyle = lnStyle_double;objEWS.Range("A1:A4").Borders(lnLeft ).Weight = lnWeight_medium;
objEWS.Range("D1:D4").Borders(lnRight ).Weight = lnWeight_medium;
objEWS.Range("A1:D1").Borders(lnTop ).Weight = lnWeight_medium;
objEWS.Range("A4:D4").Borders(lnBottom).Weight = lnWeight_medium;/*** セルの背景に色を塗る ***/
objSts.Msg( "セルの背景に色を塗っています…" );objEWS.Range("D1:D4").Interior.ColorIndex = clColor_yellow;
objEWS.Range("D1:D4").Interior.Pattern = clPattern_solid;objEWS.Range("A1:D1").Interior.ColorIndex = clColor_green;
objEWS.Range("A1:D1").Interior.Pattern = clPattern_solid;/*** 印刷指定 ***/
objSts.Msg( "印刷設定中…" );objEWS.PageSetup.PrintArea = "$A:$D"; /* 印刷範囲を指定 */
/*** 印刷用紙の設定 ***/
objSts.Msg( "印刷設定: 印刷用紙の設定中…" );
objEWS.PageSetup.PaperSize = xlPaperA4; /* 印刷用紙を指定 */
objEWS.PageSetup.Orientation = xlPortrait; /* 印刷の向き: 縦 */
//objEWS.PageSetup.Orientation = xlLandscape; /* 印刷の向き: 横 */
//objEWS.PageSetup.Zoom = 100; /* ズーム倍率を指定して印刷 */
objEWS.PageSetup.Zoom = false; /* 指定したページ数に合わせて印刷 */objEWS.PageSetup.FitToPagesWide = 1; /* 横方向の印刷ページ数 */
objEWS.PageSetup.FitToPagesTall = false; /* 縦方向の印刷ページ数は指定しない *//*** ヘッダーとフッターを設定 ***/
objSts.Msg( "印刷設定: ヘッダーとフッターを設定中…" );/* &F: ブック名, &A: シート名, &D: 現在の日付, &T: 現在の時刻, &P: ページ, &N: 総ページ数 */
objEWS.PageSetup.LeftHeader = "BookName: \"&F\" [ SheetName: \"&A\" ]"; /* ヘッダー(左) */
objEWS.PageSetup.CenterHeader = ""; /* ヘッダー(中) */
objEWS.PageSetup.RightHeader = "&D &T"; /* ヘッダー(右) */
objEWS.PageSetup.LeftFooter = ""; /* フッター(左) */
objEWS.PageSetup.CenterFooter = "( &P / &N )"; /* フッター(中) */
objEWS.PageSetup.RightFooter = ""; /* フッター(右) *//*** グラフを描いてみます。 ***/
objSts.SetCell( "A6" );
objSts.Msg( "グラフを描いてみます。" );
objEWS.Columns("B:C").ColumnWidth = 16;
objEWS.Range("A7" ).Value = "製品名";
objEWS.Range("A8" ).Value = "フレーム";
objEWS.Range("A9" ).Value = "サドル";
objEWS.Range("A10").Value = "ブレーキレバー";
objEWS.Range("A11").Value = "チェーン";
objEWS.Range("B7" ).Value = "2014";
objEWS.Range("B8" ).Value = "2500";
objEWS.Range("B9" ).Value = "3000";
objEWS.Range("B10").Value = "3420";
objEWS.Range("B11").Value = "2760";
objEWS.Range("C7" ).Value = "2015";
objEWS.Range("C8" ).Value = "3000";
objEWS.Range("C9" ).Value = "3500";
objEWS.Range("C10").Value = "3920";
objEWS.Range("C11").Value = "3260";
objEWS.Range("A7:C11").Select;
objRange = objExcel.Selection;
objRange.Borders(lnLeft ).LineStyle = lnStyle_normal;
objRange.Borders(lnRight ).LineStyle = lnStyle_normal;
objRange.Borders(lnTop ).LineStyle = lnStyle_normal;
objRange.Borders(lnBottom).LineStyle = lnStyle_normal;
objEWS.Range("A7:C7").Borders(lnBottom).LineStyle = lnStyle_double;
objEWS.Range("A7:A11").Borders(lnRight).LineStyle = lnStyle_double;
objEWS.Range("B7:C7" ).NumberFormatLocal = "0\"年\""; /* この数値は年を意味する */
objEWS.Range("B8:C11").NumberFormatLocal = "#,##0_ \"個\""; /* 3桁ごとにカンマで区切る */
objEWS.Range("A7:C7").Select;
objRange = objExcel.Selection;
objRange.Font.Bold = true; /* 太字 */
objRange.HorizontalAlignment = 3; /* 横位置: 3=中央揃え */
objRange.VerticalAlignment = 1; /* 縦位置: 1=上詰め */
objRange.Interior.ColorIndex = clColor_green;
objRange.Interior.Pattern = clPattern_solid;
/* ここからグラフ描画 */
var objChart = objEWS.ChartObjects();
var objGraph = objChart.Add( 0, 250, 400, 300 );
objGraph.name = strExcelGraphName;
//objChart.Select( true ); /* 引数は省略も可能 */
//objEWS.Range("A7:C11").Select;
//objRange = objExcel.Selection;
objGraph.Chart.SetSourceData( objEWS.Range("B8:C11") );
objGraph.Chart.SeriesCollection(1).XValues = ( objEWS.Range("A8:C11") );
objGraph.Chart.SeriesCollection(1).Name = "=" + objEWS.Range("B7").Address( true, true, xlR1C1, true );
objGraph.Chart.SeriesCollection(2).Name = "=" + objEWS.Range("C7").Address( true, true, xlR1C1, true );
objGraph.Chart.HasTitle = true;
objGraph.Chart.ChartTitle.Characters.Text = "年間販売数";
//objGraph.legend.position = "right";
//objGraph.legend.format.fill.setSolidColor( "white" );
//objGraph.dataLabels.format.font.size = 15;
//objGraph.dataLabels.format.font.color = "black";/*** 既存のグラフにデータ系列を追加してみます。 ***/
objSts.Msg( "既存のグラフにデータ系列を追加してみます。" );
objEWS.Range("C7:C11").Copy();
objEWS.Range("D7:D11").PasteSpecial( xlPasteFormats ); /* 書式のみコピー */
objEWS.Range("D7" ).Value = "2016";
objEWS.Range("D8" ).Value = "4000";
objEWS.Range("D9" ).Value = "4500";
objEWS.Range("D10").Value = "4920";
objEWS.Range("D11").Value = "4260";
var objExistsGraph = objEWS.ChartObjects( strExcelGraphName );
var newSeries = objExistsGraph.Chart.SeriesCollection.add( objEWS.Range("D8:D11") );
newSeries.Name = "=" + objEWS.Range("D7").Address( true, true, xlR1C1, true );/*** PDF印刷 ***/
objSts.Msg( "PDF印刷中…" );
var strPdfFilePath = strScriptDir + "\\" + strExcelPdfName;
if( objFso.FileExists( strPdfFilePath ) ){
objFso.DeleteFile( strPdfFilePath );
}
///* ExportAsFixedFormat( Type,
// FileName,
// Quality,
// IncludeDocProperties,
// IgnorePrintAreas,
// From,
// To,
// OpenAfterPublish,
// FixedFormatExtClassPtr ); */
objEWB.ExportAsFixedFormat( 0, strPdfFilePath, 0, false, false );objSts.Msg( "待機中…" );
WScript.Sleep( 2000 ); /* 2秒間表示して… */
objSts.Clear();
objEWB.Save(); /* ブックを保存する */
objExcel.Quit(); /* エクセルを終了させる */objEWS = null;
objEWB = null;
objExcel = null;objSts = null;
objFso = null;WScript.Quit();
/*** ↑スクリプトのメイン処理はここまで ***//*** ↓シンプルなクラスを定義するサンプルコード ***/
/* コンストラクタ */
function StatusLine()
{
/* Method */
this.Create = _st_create;
this.SetCell = _st_setCell;
this.Msg = _st_msg;
this.Clear = _st_clearMsg;/* Property */
this.objEWS = null;
this.CellPos = "";
}function _st_create( objEWS )
{
this.objEWS = objEWS;
}function _st_setCell( strCell )
{
var strLastMsg = "";
if( this.CellPos != "" ){
strLastMsg = this.objEWS.Range( this.CellPos ).Value;
this.Clear();
}
this.CellPos = strCell;
this.Msg( strLastMsg );
}function _st_msg( strMsg )
{
this.objEWS.Range( this.CellPos ).Value = strMsg;
}function _st_clearMsg()
{
this.Msg( "" );
}
↓実行時の動作イメージです。
WSHは、Excelに入力してグラフを描かせたりしたいときに使っています。
一度記述すれば、あとは実行したいときに呼び出すだけ。
どのツールを使うにしても、操作を記述するにはなんらかのコンピュータ言語を覚える必要があります。しかし、意外と難しくないですし、書いたスクリプトなりプログラムが、あっと言う間に仕事を片付けてくれるのは愉快なものです。
関連ページ