初期化1 - IEの起動とExcelデータの読み込み
既にIEとExcelの操作については前回説明していますので、さくさくとコーディングを進めていきましょう。まずは、初期化の最初の部分として、IEの起動とExcelデータの読み込みを行います。
まずは以下にプログラムを示し、その解説を行っていきます。
//==== ユーザー変数の初期化 ======================================
//
var xlPath = "save.xls"; // Excelファイルのファイル名
var csvPath = "save.csv"; // CSVファイルのファイル名
// 自身のウィンドウ
var thisWinX = 100; // X位置
var thisWinY = 100; // Y位置
var thisWinW = 640; // 横幅
var thisWinH = 120; // 高さ
// 表示用ウィンドウ
var viewWinX = thisWinX; // X位置
var viewWinY = thisWinY + thisWinH; // Y位置
var viewWinW = thisWinW; // 横幅
var viewWinH = 480; // 高さ
//==== 共有変数の初期化 ==========================================
//
// XlWindowState - Excelのウィンドウ状態
var xlNormal = -4143;
var xlMaximized = -4137;
var xlMinimized = -4140;
// XlFileFormat - Excelのファイルフォーマット
var xlCSV = 6;
var IE; // IEオブジェクト
var fs; // ファイルシステムオブジェクト
var csvArry; // CSV配列
// データの値
datName = 0;
datUrl = 1;
datMax = 2;
function initWin () {
//==== 変数を初期化 ==============================================
//
var myPath; // スクリプトのパス
var myFolder; // フォルダ名
var XL; // Excelオブジェクト
var book; // Excelのワークブック
var sheet; // Excelのワークシート
var csvStr; // CSV読み込み用テキスト
var tmpArry, tmpArry2; // 仮置き用配列
var i, j; // カウンター用変数
//==== ウィンドウサイズの調整 ===================================
//
moveTo( thisWinX, thisWinY );
resizeTo( thisWinW, thisWinH );
//==== IEを初期化 =================================================
//
// IEのオブジェクトを初期化
IE = new ActiveXObject( "InternetExplorer.Application" );
// IEのウィンドウの設定
IE.Left = viewWinX;
IE.Top = viewWinY;
IE.Width = viewWinW;
IE.Height = viewWinH;
IE.Visible = true;
//==== パスを初期化 ===============================================
//
// スクリプトのパスを取得
myPath = unescape( location.href ).replace( "file:///", "" )
.replace( /\//g, "\\" );
// ファイルシステムオブジェクトを初期化
fs = new ActiveXObject( "Scripting.FileSystemObject" );
// フォルダ名の取得
myFolder = fs.GetParentFolderName( myPath ) + "\\";
//==== Excelを初期化 ==============================================
//
// Excelのオブジェクトを初期化
XL = new ActiveXObject( "Excel.Application" );
// Excelのウィンドウの設定
XL.WindowState = xlMinimized;
XL.Visible = true;
// ファイルを開く
book = XL.WorkBooks.Open( myFolder + xlPath );
// 操作先シートを決定する
sheet = book.worksheets(1);
sheet.Activate;
//==== ExcelをCSVで保存 ===========================================
//
// ダイアログを表示させないようにする
XL.DisplayAlerts = false;
// 保存
book.SaveAs( myFolder + csvPath, xlCSV );
// Excel終了
XL.Quit();
//==== CSVの読み込み ==============================================
//
// CSVファイルの読み込み
csvStr = getFile( myFolder + csvPath );
delFile( myFolder + csvPath );
if ( csvStr.length == 1 ) {
alert("リストが存在しません。\nアプリケーションを終了します。");
IE.Quit();
close();
return;
}
// 改行コードで配列化
csvStr = csvStr.replace( /\r/g, "" );
csvStr = csvStr.replace( /\n$/, "" );
tmpArry = csvStr.split( "\n" );
// CSV用配列の初期化
csvArry = new Array( tmpArry.length );
// 二次元配列に格納
for ( i = 0; i < tmpArry.length; i ++ ) {
// カンマ区切りで配列化
tmpArry2 = tmpArry[i].split( "," );
// 配列の初期化
csvArry[i] = new Array( tmpArry2.length );
// 二次元配列にデータを格納
for ( j = 0; j < tmpArry2.length; j ++ ) {
csvArry[i][j] = tmpArry2[j];
}
}
//==== 読み込みファイル数反映 ====================================
//
if ( csvArry[0].length == datMax ) {
f.dataNow.value = ( nowViewNo + 1 );
f.dataSum.value = csvArry.length;
f.url.value = csvArry[nowViewNo][datUrl];
} else {
alert( "リストが不正です。\nアプリケーションを終了します。" );
IE.Quit();
close();
return;
}
:
:
initWinの途中までです。既に前回解説を行っている部分は飛ばします。
今回は「ExcelをCSVで保存」以下を説明します。SaveAsのパラメーターとして、xlCSVを指定して、ExcelのデータをCSVで保存しています。このパラメーターは、前回xlWorkbookNormalと指定して、Excelのワークブック形式で保存したのと同じ処理です。
では、なぜ、ここでわざわざCSVにして保存しているのでしょうか? それは、Excelを使ったデータの読み書きが遅いからです。リストが少ない内はよいですが、大量のデータを扱う場合は、いったんCSV形式にして保存して、テキストファイルとして読み込み、その文字列を配列化した方が高速にデータを扱えます。今回のようにデータが少ない場合はそれほど影響がありませんが、Tipsとしてここでは処理を追加しておきました。
また、ここで利用しているgetFile、delFileは、この次の章で作成して解説します。その名の通り、ファイルを読み込む関数と削除する関数です。作成したCSVファイルは、一時的に利用するファイルなので削除しておきます。他の用途で利用したい場合は、delFileの行をコメントアウトして下さい。
続いて、テキスト形式で読み込んだデータを二次元配列化します。その前に、少しだけおまじないをしておきます。\rの除去と、末尾の\nの除去です。保存されるCSVファイルはWindowsの一般的なテキストファイルですので\r\n区切りです。そのため、ここで\rを削除しておきます。さらに、ファイルの末尾にも改行が付いていますので、正規表現で\n$と指定して、末尾の改行を削っておきます。
後は、読み込んだデータをcsvArryに二次元配列として格納していきます。読み込んだ後は、入力欄にデータ数やURLを代入します。ここまでが初期化処理の前半部分になります。ここで一休みして、getFileとdelFileの実装を行います。
初期化2 - ファイルの読み込み、削除関数
さて、先ほどソースコードの中に書いてはいたけど実装していなかったgetFileとdelFileの二つの関数です。それほど難しいものではないので、プログラムを先に示して解説を行います。
function getFile( path ) { //==== エラー対策 ================================================ // if ( ! fs.FileExists( path ) ) return ""; // ファイルが存在しない //==== 変数の初期化 ============================================== // var resStr = ""; var stream; //==== ファイルの読み込み ======================================== // try { stream = fs.OpenTextFile( path, 1 ); resStr = stream.ReadAll(); stream.Close(); } catch ( e ) { } return resStr; } function delFile( path ) { //==== ファイルの削除 ============================================ // try { fs.DeleteFile( path ); } catch ( e ) { } }
fsは、先ほどのinitWinの中で初期化しているファイルシステムオブジェクトです。ここでは、その関数を使って、ファイル操作を行っています。以下、それぞれの関数について、簡単に解説を行っていきます。名前の通りの動作をする関数なので、特別難しいところはないと思います。
FileExistsは、ファイルの存在確認をする関数です。OpenTextFileは、ファイルの読み込みを行うための関数です。この関数で作成したオブジェクトに対してReadAll関数を実行すると、ファイルの中身がテキストとして返ってきます。ファイルの削除はDeleteFile関数で行います。
それぞれの処理をいちいち書いていると面倒ですので、ここでは関数として一まとめにしています。
