電子書籍の厳選無料作品が豊富!

naritanです。

マクロでシート上のデータを編集して帳票を出力しているExcelがあります。
そのExcelに対して、DBから取得したデータをシートに挿入して、ASPから
帳票出力マクロを実行させたいと思っています。

しかし、ExcelブックにDBから取得したデータを挿入すると、
スクリプトがタイムアウトになってしまいます。

DBから取得した1カラムだけ挿入すると上手くできるのですが、
27カラム(1レコード)を挿入するとスクリプトタイムアウトになってしまいます。になってしまうのでしょうか?

環境は、WinNtWS4.0 + Access2000 + PWS + Excel2000です。

以下に、その部分のソースを載せます。
----------------------------------------------------------------------Set Exl = Server.CreateObject("Excel.Application")
Set ExlBook = Exl.Workbooks.Open ("g:\hw_manage\Pc\5.xls")
Set ExlSheet = ExlBook.Sheets("一覧")

ExlSheet.Activate

with ExlSheet

i = 4

'//DB取得値(RsPrint)がEOFになるまでExcelにデータ挿入
Do until RsPrint.EOF
.Range("A" & i).value = RsPrint("STAT_FG")
.Range("B" & i).value = RsPrint("MAKER_NM")
.Range("C" & i).value = RsPrint("MODEL_NM")
.Range("D" & i).value = RsPrint("CPU")

~省略~

i = i + 1
Loop
end with
----------------------------------------------------------------------

A 回答 (3件)

タイムアウトということから考えると、スクリプトの実行時間が長すぎるということですよね。


ということは、スクリプトの実行時間を減らすことを考える必要があります。

ソースの中で、Server.CreateObject、Workbooks.Openがありますが、このあたりは、非常に時間のかかるコマンドだと思います。
実際このあたりでタイムアウトしてそうだということですので、このあたりを直す必要があります。(ソースがコピー&ペーストかどうかはわかりませんが、5.xlsのファイルもネットワーク上にありそうですね。それだと余計に時間がかかりますね)

せめて、Excelの起動を、セッション開始時かアプリケーションの開始時にすることはできませんか?それでも、Do・・・Loopでタイムアウトしそうですが・・・(Excelのオブジェクト操作は、割と重いように私は感じています。)

あとは、タイムアウトの時間を延ばすことですが、レスポンスが悪いままなので、操作ユーザーは、トラブルなのかと心配になり、困ることになりそうですが、大丈夫でしょうか?

もうひとつ思いつきました。
少し難しいですが、Excelにデータを挿入する機能を持った、非同期処理のできるActiveXコンポーネントを作成し、それをASPから呼ぶというのはどうですか?それなら、操作ユーザーも待ちませんし、ASPタイムアウトもなし。ただし、操作終了と、Excelでの処理は非同期ですので、すぐにそのファイルを開いても、操作は終了していませんが・・・

目的がわからないで、なんともいえませんが、どうしてもExcelのファイルでなければならない理由がなければ、CSVファイルに出して、Excelに読ませるようにするほうが、よいような気がします。
    • good
    • 0
この回答へのお礼

丁寧なご回答、ありがとうございます。

実は、つい先程、解決致しました。

原因は、Excelブックにあったみたいです。
試しに、モジュールを新規Excelにエクスポートして実行してみたところ、
サクサクッと処理が終了しました。もちろん、ExcelのVBAも正常に動作しています。

いろいろとお手数をお掛けしました。
ありがとうございました。

お礼日時:2001/06/15 17:30

補足から...



 多分Excelのオブジェクトの解放関連に問題がある様に思えます。
 作成したオブジェクトはしっかり解放していますか?

 それを先に確認して見て下さい。
 マニュアル等では、自動的に解放と読める部分もありますが、タイミングによっては、解放を行ってくれないので、プログラムでしっかり解放してあげましょう。

 それをやってから...。
 Excelファイルの解放後に、少々時間を置くようにして見て下さい。直に取得すると、エラーになりやすいので......ね。

この回答への補足

ご回答ありがとうございます。

オブジェクトの解放はちゃんと行っているのですが、
VBみたいに、エラー時にON ERROR GOTOで解放処理に飛ばす事ってできるのですか?
リファレンスを見たところ、VBSにはON ERROR RESUMU NEXTしかなかったものですから・・・

補足日時:2001/06/15 08:57
    • good
    • 0

 どのタイミングでタイムアウトになるのですか?



 挿入した時? 挿入の結果待ち? 次の挿入を行う時? 2カラムではうまくいくの?(どこからエラーになるの?)


 そもそも、Excelを使用している意味がわかりません。ASPで運用してるのですよね??
 だったら、全部ASP上で行えばいいのでは?
 今一度、Excelを使用する意味を考えてみて下さい。

私なら、データ加工までは全部Access2000+ASPだけで構築して、Excelは使用しない様にします。理由は、連携等は問題発生時にエラーの特定が難しいので...ね。
 また、グラフの作成の必要があれば、グラフのコントロールをASPから使用すればいいのですし...。
 どうしても、Excelを使用しなければならないのなら、別にISAPI等のアプリケーションを作成してしまって、安全に動作させる事を考えます。ね。

この回答への補足

ご回答ありがとうございます。

タイムアウトになるのは、EXCEL.EXEのプロセスが残っていることから、
EXCEL起動後の何処かだと思います。

処理の流れとしては、
画面でデータ抽出条件を指定して、印刷ボタンをクリックして、ONCLICKメソッドでJAVASCRIPTに処理を移し、FORMをSUBMITして同画面を再読込し、EXCEL起動ロジックが実行される。
というものなのですが、印刷ボタンをクリックしても、接続している状態のままが面は変わらず、そのままタイムアウトしてしまっています。
画面が変わらないにも関わらず、EXCELが起動しているらしく、
プロセスに残ってしまっています。

EXCELを使用している意味は、既存EXCELのマクロが複雑に作られており、
1からACCESS等でリメイクするのも時間がかかると思ったからです。

試しに、既存EXCELのVBAをASPにINCLUDEして実行してみたのですが、
やはり、VBSではサポートされていないメソッドが多々あるらしく、
その部分を補正していくのも時間がかかると思い、諦めました。

補足日時:2001/06/14 14:06
    • good
    • 0
この回答へのお礼

naritanです。
補足に補足致します。

再度、各行にresponse.writeを書き、
タイムアウトのタイミングを調べてみた結果、
Set ExlBook = Exl.Workbooks.Open ("g:\hw_manage\Pc\5.xls")
の直前に書いたresponse.writeまで表示されましたので、
上記の行でタイムアウトしているみたいです。

お礼日時:2001/06/14 15:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!