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)

まとめ(完成プログラム)

 完成したプログラムは以下の通りです。前回よりも長くなっていますが、やっていることはそれほど難しくはありません。

「ExcelのURLを、IEでスライドショー表示」全文
<meta http-equiv="Content-type" 
      content="text/html; charset=Shift_JIS">
<html>
<head>
<title>ExcelのURLを、IEでスライドショー表示</title>

<script language="JavaScript">
//<!--
    //==== ユーザー変数の初期化 ======================================
    //
    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;

    // 待機処理用変数
    var Timeout = 10 * 1000;  // 最大タイムアウト時間(10秒)
    var WaitTime = 500;       // 待機時間
    var WaitCnt = 0;          // 待機カウント

    var chkFunc;        // 待機処理確認用関数
    var encFunc;        // 待機処理終了時実行用関数

    // スライドショー用変数
    var nowViewNo = 0;          // 現在の表示ページ番号
    var sldShwStopFlg = false;  // スライドショー停止フラグ

//====================================================================
    //========================================
    //
    //    初期化
    //
    //========================================
    //    引数 :なし
    //    返り値:なし
    //    仕様 :ウィンドウのサイズを変更したり
    //            ファイルを読み込んだりする。

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;
    }

    //==== URL読み込み ===============================================
    //
    IE.Navigate( csvArry[nowViewNo][datUrl] );

    //==== 終了処理 ==================================================
    //
    wait(
    function f0() {
        // 待機処理終了条件
        if ( ! IE.Busy ) return true;
        return false;
    },
    function f1() {
        // 終了時実行処理
        IE.Document.focus();
        focus();
    }
    );
}

//====================================================================
    //========================================
    //
    //    待機処理
    //
    //========================================
    //    引数 :チェック用関数、終了時実行関数
    //    返り値:なし
    //    仕様 :待機処理を行う。

function wait( cFunc, eFunc ) {
    if ( cFunc ) { chkFunc = cFunc; }
    if ( eFunc ) { objFunc = eFunc; }
    if ( chkFunc && chkFunc() ) {
        WaitCnt = 0;
        if ( objFunc ) objFunc();
        return;
    }
    if ( WaitCnt > Timeout ) {
        WaitCnt = 0;
        return;
    }
    WaitCnt += WaitTime;
    setTimeout( "wait()", WaitTime );
}

//====================================================================
    //========================================
    //
    //    ファイル読み込み
    //
    //========================================
    //    引数 :ファイルの絶対パス
    //    返り値:読み込んだテキスト
    //    仕様 :テキストファイルを開いて読み込む。

function getFile( path ) {
    //==== エラー対策 ================================================
    //
    if ( fs.FileExists( path ) == 0 ) 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 ) {
    }
}

//====================================================================
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//====================================================================
    //========================================
    //
    //    進む
    //
    //========================================
    //    引数 :なし
    //    返り値:なし
    //    仕様 :ページを1ページ進める。

function goPage () {
    //==== 進行処理 ==================================================
    //
    nowViewNo = ( nowViewNo + 1 ) % csvArry.length;
    f.dataNow.value = ( nowViewNo + 1 );
    f.url.value = csvArry[nowViewNo][datUrl];
    IE.Navigate( csvArry[nowViewNo][datUrl] );
}

//====================================================================
    //========================================
    //
    //    戻る
    //
    //========================================
    //    引数 :なし
    //    返り値:なし
    //    仕様 :ページを1ページ戻す。

function backPage () {
    //==== 後退処理 ==================================================
    //
    nowViewNo --;
    if ( nowViewNo < 0 ) nowViewNo = csvArry.length - 1;
    f.dataNow.value = ( nowViewNo + 1 );
    f.url.value = csvArry[nowViewNo][datUrl];
    IE.Navigate( csvArry[nowViewNo][datUrl] );
}

//====================================================================
    //========================================
    //
    //    スライドショー開始
    //
    //========================================
    //    引数 :なし
    //    返り値:なし
    //    仕様 :スライドショーを実行する。

function doSldShw () {
    //==== スライドショー実行 ======================================
    //
    document.getElementById("ssStat").innerText =
        "スライドショー実行中";
    goPage();

    wait(
    function f0() {
        //==== 読み込み待機 ==========================================
        //
        if ( ( ! IE.Busy && WaitCnt >= 2000 ) || WaitCnt >= 4000 )
            return true;
        return false;
    },
    function f1() {
        //==== ページ進行 ============================================
        //
        if ( sldShwStopFlg ) {
            sldShwStopFlg = false;
            return;
        }
        doSldShw();
    }
    );
}

//====================================================================
    //========================================
    //
    //    スライドショー停止
    //
    //========================================
    //    引数 :なし
    //    返り値:なし
    //    仕様 :スライドショーを停止する。

function stopSldShw () {
    //==== スライドショー停止 ======================================
    //
    document.getElementById("ssStat").innerText =
        "スライドショー停止";
    sldShwStopFlg = true;
}

//====================================================================
//-->
</script>

</head>
<body onLoad="initWin();">

<form name="f">
<input type="txt" name="dataNow" value="0" size=5> / 
<input type="txt" name="dataSum" value="0" size=5> 
<input type="txt" name="url" value="" size=80><br>
<input type="button" value="≪ 戻る" onClick="backPage()">
<input type="button" value="停止 ■" onClick="stopSldShw()">
<input type="button" value="スライドショー ≫" onClick="doSldShw()">
<input type="button" value="進む ≫" onClick="goPage()">
 <span id="ssStat"></span>
</form>

</body>
</html>

 以下、作成したアプリケーションの簡単な操作マニュアルを書いておきます。

  1. Explorer上で「web_slide_show.hta」をダブルクリックして、ウィンドウを起動する。
  2. [スライドショー]ボタンを押すと、スライドショーを実行する。
  3. [停止]ボタンを押すと、スライドショーを停止する。
  4. [前へ][戻る]ボタンで1ページずつ進行させることが可能。
  5. 終了する際は、ウィンドウ右上の[×]ボタンをクリックしてアプリケーションを終了する。

 厳密なエラー回避処理は行っていないので、本格的に利用する際は、各処理にエラー時の処理を追加するとよいでしょう。

おわりに

 IEやExcelは、日常的によく使うアプリケーションです。この2つのアプリケーションを連携させると、いろいろなことができます。前回のように情報収集にも使えますし、今回のように情報を閲覧するのにも使えます。アイデア次第でどんどん活用することができます。

 次回は、前回と今回のプログラムを応用して、実用的で便利なアプリケーションを作成しましょう。今回の連載の総まとめです。それでは次回をお楽しみに。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー