SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作

Webページに含まれるURLを抽出し、Excelにまとめて保存する

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作 (1)

ダウンロード source.zip (4.1 KB)

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のウィンドウ状態を示すプロパティです。このプロパティには、xlNormalxlMaximizedxlMinimizedの3つの状態を指定することができます。それぞれ、通常、最大化、最小化のウィンドウ状態になります。この値は、次のような数値になっています。

XlWindowState - Excelのウィンドウ状態
状態数値
xlNormal-4143
xlMaximized-4137
xlMinimized-4140

 これらの値は、MicroSoftのWebサイトから調べることができます。

Excelのプロパティ値
 次のページで、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へデータを取り込めます。

次のページ
Excelの操作2~ファイルの保存~

この記事は参考になりましたか?

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1964 2008/01/09 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー