tomyamaのブログ

日記・雑記。

Windowsの操作を自動化する

Windows Scripting Host

 

Windowsの操作を何らかの方法で記述できるツールは幾つもあると思うのですが、今日は少し枯れた技術を紹介したいと思います。

 

Microsoftが開発したWindows Scripting Host(WSH)という実行環境で、言語は標準で「VBScript」と「JScript」が使えます。

VBScriptは「Visual Basic」、JScriptはほぼ「JavaScript」と同じ文法で記述できます。

 

以下は、昔に書いたJScriptのサンプルスクリプトです。

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( "" );
}

↓実行時の動作イメージです。

JScriptでEXCELを操作するデモンストレーション

excel_new_workbook.js』のデモ



WSHは、Excelに入力してグラフを描かせたりしたいときに使っています。

 

一度記述すれば、あとは実行したいときに呼び出すだけ。

どのツールを使うにしても、操作を記述するにはなんらかのコンピュータ言語を覚える必要があります。しかし、意外と難しくないですし、書いたスクリプトなりプログラムが、あっと言う間に仕事を片付けてくれるのは愉快なものです。