既に開いている excel ファイルに GAMS から結果を出力する方法

GAMS で gdxxwr を利用し,結果を excel ファイルに出力することがよくありますが、gdxxwr で excel に出力するにはその excel ファイルが閉じていないといけないです。ただ、GAMS を実行するたびにいちいち excel ファイルを閉じるのは面倒なのですが、以下のページに自動で「excel ファイルを閉じる→excel ファイルに出力する→excelファイルを開く」という動作をさせるためのコードがのっています。

Yet Another Math Programming Consultant: Writing Excel files in GAMS

上のページに載っているサンプルのコードは少しわかりにくく、しかも実行可能なものではないので、少し修正したサンプルをつくりました。

結構、便利だと思います。

$title 既に開いている excel ファイルに結果を出力するためのコード
display "com: 既に開いている excel ファイルに結果を出力するためのコード";
$ontext 
Time-stamp:     <2011-10-15 19:08:15 Shiro Takeda>
First-written:  <2011/10/15>

・GAMS で gdxxwr を利用し,結果を excel ファイルに出力することがよくある.
・ただし,gdxxwr で excel に出力するには excel ファイルが閉じていないといけない.
・既に開いている excel ファイルを一度閉じて,結果を export し,再び開くというプ ログラム.

$offtext

set   i Sample index / 1*100 /
    j Sample index / 1*20 /;

parameter a Sample parameter;

a(i,j) = uniform(0,1);

display a;

*  results.xls が開いていたら,一度閉じる.
$call =xlstalk.exe -C results.xls

*  cmd.txt に以下の内容を出力.
$onecho > cmd.txt
i=results.gdx o=results.xls par=a rng=foo!A1 rdim=1 cdim=1
$offecho

*  a を results.gdx に出力:
execute_unload "results.gdx", a;

*  cmd.txt の中身を引数として,gdxxwr.exe を実行する. @filename は
*  filename というファイルの中身を引数とするということ.また,= 付きでコマン
*  ドを呼び出すのは,コマンドが終了するまで待ってから次に進むということ.
execute '=gdxxrw @cmd.txt';

*  results.xls を再び開く. shellexecute file は,file に関連付けられたアプ
*  リケーションを自動で選択し開くということ.
execute 'shellexecute "results.xls"';

* --------------------
* Local Variables:
* mode: gams
* fill-column: 80
* End: