SHOEISHA iD

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

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

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

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

Webページから抽出したURLを、IEでスライドショー表示する

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

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

初期化1 - IEの起動とExcelデータの読み込み

 既に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としてここでは処理を追加しておきました。

 また、ここで利用しているgetFiledelFileは、この次の章で作成して解説します。その名の通り、ファイルを読み込む関数と削除する関数です。作成したCSVファイルは、一時的に利用するファイルなので削除しておきます。他の用途で利用したい場合は、delFileの行をコメントアウトして下さい。

 続いて、テキスト形式で読み込んだデータを二次元配列化します。その前に、少しだけおまじないをしておきます。\rの除去と、末尾の\nの除去です。保存されるCSVファイルはWindowsの一般的なテキストファイルですので\r\n区切りです。そのため、ここで\rを削除しておきます。さらに、ファイルの末尾にも改行が付いていますので、正規表現で\n$と指定して、末尾の改行を削っておきます。

 後は、読み込んだデータをcsvArryに二次元配列として格納していきます。読み込んだ後は、入力欄にデータ数やURLを代入します。ここまでが初期化処理の前半部分になります。ここで一休みして、getFiledelFileの実装を行います。

初期化2 - ファイルの読み込み、削除関数

 さて、先ほどソースコードの中に書いてはいたけど実装していなかったgetFiledelFileの二つの関数です。それほど難しいものではないので、プログラムを先に示して解説を行います。

ファイルの読み込み、削除関数
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関数で行います。

 それぞれの処理をいちいち書いていると面倒ですので、ここでは関数として一まとめにしています。

次のページ
初期化3 - 待機処理

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー