• Excelで Chartオブジェクトだけ画像ファイルに保存

    xlsシート内にあるグラフだけを画像ファイルに保存したい。
    ※グラフシートでなく。

    リファレンスを調べるとChartオブジェクトにSaveAsメソッドがあるようなので、html形式で保存したらいけそうだなーと思ったが、やってみるとエラーになってしまいお手上げ(詳細割愛)。

    どうしたものかな、とgoogle先生で検索を繰り返したら、またもや2chのスレッドに答えそのものを発見。
    あなどれんな~。

    Exportメソッドというものがあるらしい。
    形式も指定できるが、省略してもファイル名の拡張子から適宜判断してくれる。便利。
    gif/png/jpgはいけた。

    ■export_chart.js

    var app = new ActiveXObject("Excel.Application");

    try {

    var book = app.Workbooks.Open( xlsブックのフルパス, true );
    var sh = book.Sheets( 1 );

    var co = sh.ChartObjects( 1 );
    var ch = co.Chart;
    ch.Export( 出力画像ファイルのフルパス );

    } catch( ex ) {
    throw ex;
    } finally {
    app.Quit();
    }

    ■試した環境
    Excel 2003 SP3 + XP Prof SP2(ja)
    Excel 2007 SP1 + Vista Ultimate SP1 x64(ja)

  • jscriptで utf8なファイル出力

    ADODB.Streamを使うと、SJIS以外のエンコードに変換可能。
    て、ことが以下のURLに書いてある。
    ADODB.Stream を使ったファイルの読み書き - by AOK
    こんな方法があるとはな~。

    こっちはさらに、utf-8出力時のBOMをどう除去するか、という話
    JavaScriptでファイルの書き込みをUTF-8で行う(htaまたは、wsh用) - jiroの日記
    ADODB.Streamを2つ使い、Positionを移動することでBOMをskipして出力。なるほどなー。

    とりあえずSJIS出力で我慢しといて、iconvで変換するか、とか考えたけど、最初からutf-8で書き出せれば便利だ。


    /* ADODB.Stream - SaveOptionsEnum */
    var adSaveCreateOverWrite = 2;

    /* ADODB.Stream - StreamTypeEnum */
    var adTypeBinary = 1;
    var adTypeText = 2;

    /* ADODB.Stream - StreamWriteEnum */
    var adWriteChar = 0;
    var adWriteLine = 1;

    var st = new ActiveXObject("ADODB.Stream");
    st.type = adTypeText;
    st.charset = "utf-8";
    st.open();

    st.WriteText( なにか出力 , adWriteLine );

    st.Position = 0;
    st.Type = adTypeBinary;
    st.Position = 3; ←utf8なら3
    var bin = st.Read();
    st.Close();

    var stw = new ActiveXObject("ADODB.Stream");
    stw.Type = adTypeBinary;
    stw.Open();
    stw.Write( bin );
    stw.SaveToFile( 出力ファイル , adSaveCreateOverWrite );
    stw.Close();


  • VBAで Outlookの予定表フォルダを取得する

    folders.png
    ※VBAで、といいつつJScript。

    既定の予定表は、こんな感じでFolderオブジェクトを得られる(JScript)

    var app = new ActiveXObject("Outlook.Application");
    var ns = app.GetNamespace("MAPI");
    var folder = ns.GetDefaultFolder(olFolderCalendar);

    ※olFolderCalendarは9

    ここの環境は、以前、別のOffice環境から移行してきたデータファイルがあるため、左のように複数の予定表フォルダがある。これに対応するFolderオブジェクトを取得したい。(で、配下の予定表アイテムを列挙、といきたい)

    FolderのEntryIDが事前に分かっていれば、NameSpaceから取得できるようなんだけど・・・。

    「おれおれフォルダ→予定表」にあたるFolderオブジェクトのFolderPathは
     "\\おれおれフォルダ\予定表"
    になることがわかったので、ルートから順番に辿ってパスで判断することに。



    ■folders.js

    /**
     * Enum folders(and its itemtype) of Outlook(!=express).
     *
     * usage:
     *   cscript.exe folders.js
     *
     * Tried env.
     *   Outlook 2003 SP3 + XP Prof SP2(ja)
     *   Outlook 2007 SP1 + Vista Ultimate SP1 x64(ja)
     */

    if( !WScript.FullName.match( /cscript\.exe$/i ) )
    {
        WScript.echo( "run me under cscript.exe");
        WScript.Quit();
    }

    var app = new ActiveXObject("Outlook.Application");
    var ns = app.GetNamespace("MAPI");

    traverse( ns );

    function    traverse( folder )
    {
        if( folder.FolderPath )
        {
            WScript.echo( folder.FolderPath + ": " + folder.DefaultItemType );
        }
        else
        {
            WScript.echo( folder );
        }

        var folders = folder.Folders;
        for( var i = 1 ; i <= folders.Count ; i++ )
        {
            traverse( folders(i) );
        }
    }


  • WSHで CUI実行かどうか判断する

    ちょっとしたスクリプトにおいて、WScript.Echoなどで結果をstdoutにずらずら出力したいときがある。
    で、このスクリプトをエクスプローラからダブルクリックで実行してしまいMsgBoxが延々と出てきてしまうと悲しい。ので、実行時にチェックしてコマンドプロンプト(cscript.exe)から実行されたかどうか判断したい。

    改めて検索してみたら、
    @IT:運用 Windows管理者のためのWindows Script Host入門 第4回 WScriptオブジェクトの詳細(2) 4.スクリプトの実行制御とホスト情報の取得
    実行ファイル名でチェックしてるサンプルが。

    今までこんなん↓してた(JScript)

    try {
    WScript.StdErr.WriteBlankLines(1);
    } catch( ex ) {
    WScript.echo( "run me under cscript.exe");
    WScript.Quit();
    }
    うーん。
    cscript.exe経由で実行の場合に、StdErrが汚れるし。。


  • CF 8GBな X40に Vista SP1統合セットアップ

    2009/02/13:このX40はSSDに換装しました

    ~以下の内容は単に僕がやってみたことの記録であり、どのような保証もしません。これを参考にした結果どのような被害/損害が発生しても当方は責任を負いかねます。全て自己責任で。~

    先週、VistaのSP1が一般の人にもダウンロードできるようになりました。
    デスクトップ機はHDDに余裕があるので、スタンドアロン版で余裕のupdate完。

    問題は、「Thinkpad X40のHDDをCFに換装してVista」でセットアップしたCF 8GBなX40。
    スタンドアロン版は無理そうだったので、Windows Updateからチャレンジするもあえなく容量不足で途中終了。中国語/韓国語フォント&辞書を地味に削除してあがいてみたものの、約1GBの空き容量では足りないらしい。

    ということで、SP1統合したインストールメディアを作ることにした。
    ちなみに、権利のある人は、MSDNからSP1統合済みインストールイメージをDLするのが吉。今回の場合、インストール先が8GBと狭いのでvLiteによるダイエットも兼ねてセットアップディスクを作成した。

    パソコン初心者の為のガイド - Windows Vista SP1 統合 -」を見ながら進める。
    このページには途中で失敗したこととかを書く。


    前提条件

    • X40以外に使える作業環境は、Vista Ultimate x64(Phenom 9600)なデスクトップ機。
    • X40にインストールしたのはVista Ultimate x86版
    • インストール先のディスク容量は8GB

    SP1適用済みなVista環境を作る

    • 先にスタンドアロン版SP1をダウンロードして、ISOイメージにしておく
      • 後でVistaをセットアップした仮想マシンにマウントしたいから
    • デスクトップPCにVitrual Server 2005R2 SP1をインストールしてあったのでこれを使った。
      • 1GBのメモリと、32GBの仮想ディスクを割り当てて仮想マシンを作成
      • 32bit版VistaのインストールDVDイメージをマウントして、仮想マシンの電源オン
      • 普通にインストールする
        • 異常に時間がかかるが根気よく待つ。
    • セットアップ完了後に現れる最初のユーザを作成する画面で「CTRL+SHIFT+F3」
      • 仮想マシンが再起動する
    • 再起動後、デスクトップが立ち上がる。sysprepのダイアログが表示されてる。
      • うちの環境の場合、AMD-Vを有効にしていると、本当に遅くて一生終わらない感じがしたので、AMD-Vを無効に。まだまだ遅いがいくらかマシに。
      • 仮想マシンの「ハードウェア依存の仮想化機能を有効にする」チェックをオフに。
        • オフにするためには仮想マシンの電源を落とさなければならない。勇気をもっていきなり「電源オフ」にした。
        • で、チェックをオフにして再起動。
      • それでも、このデスクトップが異常に遅くて、とても先にすすめない。ので、背景を単色にしたり、Windows Defenderを止めたりと、少しあがく。
    • SP1スタンドアロン版を仮想CDから実行する。
      • ここも時間がかかるが、じっと待つ
    • SP1の適用が完了したら、ファイル名を指定して実行、からvsp1clnを実行する。
      • 続行するか問われるので迷わずyを入力
    • SP1クリーナが終了したら、放置し続けたsysprepのダイアログの「一般化する」のチェックをオンにしてOKボタン
    • 一般化処理が進行し、いきなり再起動する。上述のURLに「Vistaが起動しないよう注意」と書いてあるのに従って、OSが立ち上がる前に仮想マシンのBIOS画面でいきなり電源断。

    SP1適用済みVistaのimage抽出

    • imagexというコマンドを利用するために、Windows AIKを導入した
    • ダウンロードしたのはWindows AIKのインストールイメージなので、これをVista x64でマウントしてセットアップ
    • セットアップが済んだら、「Windows PE Tools コマンド プロンプト」を起動
      • 以下のコマンドを実行して、Windows PEの起動イメージを作成
        copype.cmd x86 c:\winpe_x86
        oscdimg -n -bc:\winpe_x86\etfsboot.com c:\winpe_x86\ISO c:\winpe_x86\winpe_x86.iso
      • ここで、参考URLだとimagex.exeを起動イメージに含めているのだけど、どこかで間違えたのか期待した結果にならず何度か繰り返す。
        • 結局、後々image抽出の際、ネットワーク経由で母艦の方に保存するので、imagex.exeもネットワーク経由でコピーすることにした。
        • 抽出イメージの保存先フォルダを作り、ネットワーク共有に。
        • 前述のとおり、imagexを含めたPE起動イメージがうまく作れなかったので、"C:\Program Files\Windows AIK\Tools\x86\imagex.exe"を抽出イメージの保存先フォルダにコピーして置いておいた。
    • 仮想マシンをさらに1つ増やす
      • 空の仮想ディスクをIDE0のプライマリに、仮想Vista32の仮想ディスクをIDE0のセカンダリに
        • 誤ってゲストVistaを起動しないように、というつもりだったのだけど、意味なかったかも。。
      • CD/DVDに、Windows PEの起動イメージをマウント
      • メモリに「1GB」を割り付け
        • [失敗]Windows AIKのドキュメントを見れば書いてあるのだけど、RAMディスク上で実行するタイプのWindows PEは512MB以上のメモリが必要だそうだ。なぜかケチって256MBしか割り当てないでいたら、必要なサービスがロードされないでネットワークが使えずにはまった。。
    • 増やした仮想マシンでWindows PEを実行
      • ここは、単に仮想Vista32の仮想ディスクに対してimagexを実行できればよいはずなので、仮想マシンが既にあるなら、PEでなくてもいいのかも。
      • コマンドプロンプトがぽつんと表示されて起動完了
    • 抽出後イメージの保存先としてネットワークドライブをマウント
      • 母艦のディスクをマウントする。
        net use z: 母艦のネットワーク共有
      • ID/PASSを聞かれるので入力する。
      • IDには「コンピュータ名\ID」。最初IDだけ入力していて、マウントできなかった。。
    • 先にコピーしておいたimgexを実行
      imagex /compress none /flags "Ultimate" /capture c: z:\install.wim "Windows Vista Ultimate w SP1"
      • ここで、image_pathに「x:」を指定しまい失敗。xドライブはPEの実行環境
      • 今回は、仮想環境の動作がどうも遅い、ということでcompressはナシとした。vLiteでダイエットもする予定なので、これでいいだろう。
      • ここでも、じっと待つ

    統合セットアップイメージを作る

    • vLite - Windows Vista configuration toolからvLiteをダウンロードして母艦にインストール
      • vLiteのバージョンは1.1.1
    • 「Vistaのインストレーションファイルが置かれているフォルダ・ドライブ」を問われる。x86版vistaのDVDのパスを指定した。
      • 書き込み可能な場所にコピーするよ、と言われるので保存場所を指定してやる。以降、このフォルダをvLite作業用フォルダとして話を進める。
      • DVDの中身がコピーされる
    • ここで一旦vLiteを終了させる
      • imagexで抽出したinstall.wimを、vLite作業用フォルダ\sources\にコピーする。Vista32ビット版のDVDから取り出したinstall.wimが置かれているが上書き
    • 改めて、vLiteを起動
      • 「Vistaのインストレーションファイルが置かれているフォルダ・ドライブ」には、vLite作業用フォルダを指定する
    • 「統合」タブ
      • Hotfix、ドライバ、言語とも、特に追加するものはないので、何もしない
    • 「コンポーネント」タブ
      • 「互換性」ダイアログに対して「Aero Glass」「Internel Explorer」「推奨」をONにした
      • で、使わないコンポーネントを削除対象にしていく
      • 壁紙、サンプルピクチャ、スピーチ、自然言語処理、ゲーム、Tablet PC、MCE、ムービーメーカー、Helpあたりをバシバシ落とす
      • [失敗]X40の内蔵グラフィックだとDWMなAeroは使えない。だったら、と考えて、コンポーネントを削除したら、Windows Server 2003みたいな画面(XPでいえばLuna切った状態)になってしまって、あまりに面白みがなかったので、セットアップをやりなおす羽目になってしまった。
        • 半透明にはならないけど、黒いタスクバー/スタートメニューは好きなのです。
      • [失敗]日本語しか使わないんだし、ということで「簡体中国語」「韓国語」「繁体中国語」を落としたら日本語入力できなくてセットアップをやり直す羽目になってしまった。
        • 上記3言語で0.8GBに目がくらんで失敗。どれかは落してもいいのかもしれないが、組み合わせを検証する気にはなれない。
    • 「Tweaks」「無人」タブ
      • 適宜
    • あとは、ISOイメージを作成し、DVDに焼く

    やっと実機にインストール

    • 焼いたDVDから起動して普通にセットアップ完
    • 長い戦いもようやく終幕
    • Thinkpad X40のHDDをCFに換装してVista」と同様に、ページファイル、復元ポイント、を落とした。
    • vLiteで先にダイエットすると、ちびちび削除しなくていいのが楽だー。
    • RAMディスク(RamPhantom2)、アンチウイルス(NOD32アンチウイルス V2.7)、Firefox、Googleツールバー、TortoiseSVN、を入れた状態で残容量2.89GB。これだけ空いてたらOfficeもいけそう。

    おわり

    • 今回のSP1適用で3回セットアップした。CFの寿命が心配。。
    • ブックマーク、メール、RSSリーダーをネットワークサービスに移行してるとこういうとき楽だなー。
    • 結論は、SP1込みのセットアップメディアをMSDNかDSP版で入手した方がいいよ、ということです。