Excelの操作1~起動とファイルのオープン~
いよいよExcelの操作です。ここではExcelの起動と、ファイルのオープンを行います。ここまで読んで来た人は予想が付いていると思いますが、Excelの操作にもnew ActiveXObjectを使います。
//==== 変数を初期化 ==================================================== // var xlPath = "save.xls"; // Excelファイルのファイル名 // XlWindowState - Excelのウィンドウ状態 var xlNormal = -4143; var xlMaximized = -4137; var xlMinimized = -4140; var XL; // Excelオブジェクト var book; // Excelのワークブック var sheet; // Excelのワークシート //==== Excelを初期化 =================================================== // // Excelのオブジェクトを初期化 XL = new ActiveXObject( "Excel.Application" ); // Excelのウィンドウの設定 XL.Visible = true; XL.WindowState = xlNormal; XL.Left = 420; XL.Top = 100; XL.Width = 320; XL.Height = 480; // ファイルを開く book = XL.WorkBooks.Open( myFolder + xlPath ); // 操作先シートを決定する sheet = book.worksheets(1); sheet.Activate;
まずはActiveXObjectとして、Excel.Applicationを初期化します。次の「Excelのウィンドウの設定」では、Excelのプロパティに値を代入することで表示の設定を行っています。ここで、1つだけ見慣れないものが出てきます。xlNormalです。変数の初期化を見ると、-4143となっています。この説明を少し行っておきます。
ExcelのプロパティWindowStateは、Excelのウィンドウ状態を示すプロパティです。このプロパティには、xlNormal、xlMaximized、xlMinimizedの3つの状態を指定することができます。それぞれ、通常、最大化、最小化のウィンドウ状態になります。この値は、次のような数値になっています。
| 状態 | 数値 |
| xlNormal | -4143 |
| xlMaximized | -4137 |
| xlMinimized | -4140 |
これらの値は、MicroSoftのWebサイトから調べることができます。
XlWindowStateと書いてある場所をクリックします。xlNormalなどの文字列を検索してもヒットしないので、XlWindowStateで検索してください。これ以外の値についても、同じページにまとまっています。また、Excelの操作に関しては、以下のURLも参考にしてください。
次にファイルを開きます。WorkBooks.Openにパスを指定すれば、ワークブック(Excelのファイル)を開くことができます。次に、ワークブックの中から操作対象のワークシートを指定します。これはworksheets関数で、何番目のワークシートかを指定します。最後に、操作するワークシートをアクティブにしています。
ここまでで、IEとExcelのウィンドウがそれぞれ開きます。次は、IEとExcelの連携を行っていきます。
IEとExcelの連携
ここまで来れば、後は通常のJavaScriptのプログラムとそれほど変わりません。それでは、IEに読み込ませたWebページのURLをExcelに取り込んでいくプログラムを書いていきましょう。
//==== 変数を初期化 ==================================================== // var rowNoMax = 10000; // 横列最大値 var colNo = 1; // 縦列 var rowNo = 1; // 横列 var cellStr = ""; // セルの文字列 var i; // カウンター用変数 var aArry; // 配列用変数 var aArryLen; // 配列数用変数 //==== Excelの入力位置を走査 =========================================== // // 空行を探して、そこを入力開始位置にする // for ( rowNo = 1; rowNo < rowNoMax; rowNo ++ ) { // セルの文字列を取得 cellStr = sheet.Cells( rowNo, colNo ); // 空のセルを見つけたら抜ける if ( "" + cellStr == "undefined" ) { break; } } //==== Excelのwait関数を使って待機処理 ================================= // for ( i = 0; i < 1000; i ++ ) { if ( IE.Busy ) { XL.wait(3); } else { break; } } //==== IEからURLを取得してExcelのセルに書き込み ======================== // // Aタグの配列を取得する aArry = IE.Document.getElementsByTagName( "a" ); aArryLen = aArry.length; for ( i = 0; i < aArryLen; i ++ ) { // 空のリンクは飛ばす if ( aArry[i].innerText == "" || aArry[i].href == "" ) continue; // Wikipediaなどの文字化け対策 var urlStr = aArry[i].href; var chkStr0 = aArry[i].href; var chkStr1 = encodeURI( aArry[i].href ); if ( chkStr0 != chkStr1 ) { urlStr = aArry[i].outerHTML.replace( /.*href="/, "" ) .replace( /".*/, "" ); } // Aタグ内の文字列とリンク先のURLをセルに代入 sheet.Cells( rowNo, colNo ) = aArry[i].innerText; sheet.Cells( rowNo, colNo + 1 ) = urlStr; // 操作位置を1行下に移動する rowNo ++; }
まずは「Excelの入力位置を走査」の部分です。今回のアプリケーションでは、取得したURLは、Excelのリストの末尾に追加します。そのため、末尾がどこにあるのかを検索しなければなりません。空の行が見つかるまでセルを確認するようにしています。rowNo < rowNoMaxと最大数を指定していますが、この部分はなくても構いません(デバッグ用の処置です。リストの数が多くなると、処理が重くなるので、適当な場所で終えるために入れています)。
ここで注目すべき点はsheet.Cells( rowNo, colNo )の部分です。ワークシートのCells関数を使うことで、各セルにアクセスすることができます。第1引数が行数で、第2引数が列数になります。いずれも1から始まります。このように値を取得する以外にも、値を代入してセルにデータを入力することもできます。
次は、IEの読み込み待機処理です。この待機処理は、Excelのwait関数を使って行います。IEの読み込みが終了すると、このループ処理から離脱します。
最後は、IEからURLを取得してExcelのセルに書き込む処理です。まずはAタグのリストを配列として取得します。次の、この配列から得たリンク名とURLをExcelに代入していきます。この代入には、先ほど使ったのと同じCells関数を利用します。この時、少しだけ特殊な処理を行っています。
それは「Wikipediaなどの文字化け対策」です。WikipediaなどのURLでは、IEで末尾が文字化けしてしまいます。そのため、文字化けしている可能性のあるURLに出会った場合は、outerHTMLからURLの文字列を直接取得するように回避処理を行っています。相対パスで書かれている場合はちょっと困るのですが、絶対パスの場合は問題ありません。Googleの検索結果などの上位には、Wikipediaがくるケースが多いので、こういった処理を行っておくと便利です。
これで、IEからExcelへデータを取り込めます。
