HTA か IE11(要設定) で動作する Excel.Application の処理を JavaScript で記述したサンプル

JavaScript で記述しているのは、jQuery を使用したいからです。Excel 部分以外であれば他の用途にそのまま利用できるように考えています。

twitter-bootstrap を使用して簡単で美しい見栄えが利用できます。

Excel.Application を JavaScript で利用する際は、Microsoft が認識しているバグがあるので、サンプルのような終わり方をする必要があります。そうしなければ、メモリに Excel のプロセスが残ってしまう事を避けられません。Microsoft は、VBScript を使えば問題無いと書いていますが、IE11 でそもそも VBScript を使うのはいろいろ制限や工夫が必要な上に他へのリソースの流用ができないので、このようなアプローチが必要かもしれません。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta charset="sjift_jis">
<title>Excel の処理</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css" />
<script>

	// ****************************
	// HTA の時のみ使用
	// ****************************
	//top.moveTo( 300, 150 );
	//top.resizeTo( 800, 600 );

	var WshShell = new ActiveXObject("WScript.Shell");
	var FilePath = "";

	$(function(){

		$("#action").on("click", function(){

			// ****************************
			// Excel.Application を解放する為に
			// ローカル変数を使用しています
			// ****************************
			var Excel = null;
			var Book = null;
			var Worksheet = null;

			Excel = new ActiveXObject("Excel.Application");

			// ****************************
			// 保存ダイアログを前面に
			// 表示する為の処理です
			// ****************************
			Excel.Visible = true;
			Excel.WindowState = 2;	// Minimize
			Excel.WindowState = 1;	// Maximize
			Excel.Visible = false;

			// ****************************
			// 警告を出さないようにする
			// 使用すると上書きの警告が
			// 出なくなります
			// ****************************
			// Excel.DisplayAlerts = false;

			// ****************************
			// ブック追加
			// ****************************
			Excel.Workbooks.Add();

			// ****************************
			// 追加したブックを取得
			// ****************************
			Book = Excel.Workbooks( Excel.Workbooks.Count );

			// ****************************
			// 現状、ブックにはシート一つ
			// という前提で処理していますが
			// 必要であれば、Book.Worksheets.Count
			// で現在のシートの数を取得できます
			// ****************************
			Worksheet = Book.Worksheets( 1 );
			Worksheet.Activate();

			// ****************************
			// シート名設定
			// ****************************
			Worksheet.Name = "新しい情報";

			// ****************************
			// 参照
			// 最後の 1 は、使用するフィルター
			// の番号です
			// ****************************
			FilePath = Excel.GetSaveAsFilename( "excel_001","Excel ファイル (*.xlsx), *.xlsx", 1)
			if ( FilePath == false ) {
				// ****************************
				// 保存していないので
				// 保存した事にして閉じます
				// ****************************
				Book.Saved = true;
				Book.Close();
				Excel.Quit();
				Excel = null;

				alert( "Excel ファイルの保存選択がキャンセルされました" );

				window.setTimeout("Cleanup();",1);
				return;
			}

			// ****************************
			// セルへセット
			// ****************************
			// タイトル部分の参照
			$("#tbl th").each(function(idx){
				Worksheet.Cells(1, idx+1) = $(this).text();
			});

			// 行一覧の参照
			$("#tbl tr").each(function(row){
				$(this).find("td").each(function(idx){
					Worksheet.Cells(row, idx+1) = $(this).text();
				});
			});

			// ****************************
			// セルをデータに合わせて
			// 整理して左上を選択
			// ****************************
			Worksheet.Columns("A:C").Select();
			Worksheet.Columns("A:C").EntireColumn.AutoFit();
			Worksheet.Range("A1").Select();

			// ****************************
			// 保存
			// 拡張子を .xls で保存するには
			// Call ExcelBook.SaveAs( FilePath, 56 ) とします
			// ****************************

			try {
				Book.SaveAs( FilePath );
			}
			catch (e) {
				console.dir(e);
				alert("Book.SaveAs でエラーが発生しました");
			}

			// ****************************
			// Excel をアプリケーションとして終了
			// ****************************
			Excel.Quit();
			Excel = null;
			idTmr = window.setTimeout("Cleanup();",1);

			alert("処理が終了しました \n\n 保存したブックを開きます");

			WshShell.Run( "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " + FilePath );

		});

	});

function Cleanup() {
	CollectGarbage();
}
</script>

<style>
html,body {
	/* height: 100%; */
}

.entry td {
	padding: 6px;
}

/* ****************************
テーブル内のデータを選択不可
( ダブルクリック対応 )
******************************/
#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}

#tbl th {
	cursor: default;
}

#tbl td {
	cursor: default;
	color: black;
}

</style>

</head>
<body>
<div class="main">

<table class="entry ml-3 mt-3">
	<tr>
		<td>
			<input id="action" type="button" value="Excel.Application の実行" class="form-control btn btn-primary">
		</td>
	</tr>
</table>


<table class="table ml-3 mt-2" id="data" style='width:400px;'>

	<tbody id="tbl">

		<tr>
			<th>コード</th>	<th>開始日</th>	<th>終了日</th>
		</tr>

		<tr>
			<td>FIRST</td><td>2018/04/01</td><td>2018/06/30</td>
		</tr><tr>
			<td>SECOND</td><td>2018/07/01</td><td>2018/09/30</td>
		</tr><tr>
			<td>THIRD</td><td>2018/10/01</td><td>2018/12/31</td>
		</tr><tr>
			<td>FOURTH</td><td>2019/01/01</td><td>2019/03/31</td>
		</tr>

	</tbody>

</table>


</div>
</body>
</html>


関連する記事

🔻 IE11 の設定と VBScript でのサンプルです
IE11 で Excel のブックにアクセスする / JavaScript を使用して Excel のブックのセルにデータをセットして更新