• ベストアンサー

Excelでのデータ挿入が上手くできない

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

質問者が選んだベストアンサー

  • ベストアンサー
  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

タイムアウトということから考えると、スクリプトの実行時間が長すぎるということですよね。 ということは、スクリプトの実行時間を減らすことを考える必要があります。 ソースの中で、Server.CreateObject、Workbooks.Openがありますが、このあたりは、非常に時間のかかるコマンドだと思います。 実際このあたりでタイムアウトしてそうだということですので、このあたりを直す必要があります。(ソースがコピー&ペーストかどうかはわかりませんが、5.xlsのファイルもネットワーク上にありそうですね。それだと余計に時間がかかりますね) せめて、Excelの起動を、セッション開始時かアプリケーションの開始時にすることはできませんか?それでも、Do・・・Loopでタイムアウトしそうですが・・・(Excelのオブジェクト操作は、割と重いように私は感じています。) あとは、タイムアウトの時間を延ばすことですが、レスポンスが悪いままなので、操作ユーザーは、トラブルなのかと心配になり、困ることになりそうですが、大丈夫でしょうか? もうひとつ思いつきました。 少し難しいですが、Excelにデータを挿入する機能を持った、非同期処理のできるActiveXコンポーネントを作成し、それをASPから呼ぶというのはどうですか?それなら、操作ユーザーも待ちませんし、ASPタイムアウトもなし。ただし、操作終了と、Excelでの処理は非同期ですので、すぐにそのファイルを開いても、操作は終了していませんが・・・ 目的がわからないで、なんともいえませんが、どうしてもExcelのファイルでなければならない理由がなければ、CSVファイルに出して、Excelに読ませるようにするほうが、よいような気がします。

forester
質問者

お礼

丁寧なご回答、ありがとうございます。 実は、つい先程、解決致しました。 原因は、Excelブックにあったみたいです。 試しに、モジュールを新規Excelにエクスポートして実行してみたところ、 サクサクッと処理が終了しました。もちろん、ExcelのVBAも正常に動作しています。 いろいろとお手数をお掛けしました。 ありがとうございました。

その他の回答 (2)

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.2

補足から...  多分Excelのオブジェクトの解放関連に問題がある様に思えます。  作成したオブジェクトはしっかり解放していますか?  それを先に確認して見て下さい。  マニュアル等では、自動的に解放と読める部分もありますが、タイミングによっては、解放を行ってくれないので、プログラムでしっかり解放してあげましょう。  それをやってから...。  Excelファイルの解放後に、少々時間を置くようにして見て下さい。直に取得すると、エラーになりやすいので......ね。

forester
質問者

補足

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

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

 どのタイミングでタイムアウトになるのですか?  挿入した時? 挿入の結果待ち? 次の挿入を行う時? 2カラムではうまくいくの?(どこからエラーになるの?)  そもそも、Excelを使用している意味がわかりません。ASPで運用してるのですよね??  だったら、全部ASP上で行えばいいのでは?  今一度、Excelを使用する意味を考えてみて下さい。 私なら、データ加工までは全部Access2000+ASPだけで構築して、Excelは使用しない様にします。理由は、連携等は問題発生時にエラーの特定が難しいので...ね。  また、グラフの作成の必要があれば、グラフのコントロールをASPから使用すればいいのですし...。  どうしても、Excelを使用しなければならないのなら、別にISAPI等のアプリケーションを作成してしまって、安全に動作させる事を考えます。ね。

forester
質問者

お礼

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

forester
質問者

補足

ご回答ありがとうございます。 タイムアウトになるのは、EXCEL.EXEのプロセスが残っていることから、 EXCEL起動後の何処かだと思います。 処理の流れとしては、 画面でデータ抽出条件を指定して、印刷ボタンをクリックして、ONCLICKメソッドでJAVASCRIPTに処理を移し、FORMをSUBMITして同画面を再読込し、EXCEL起動ロジックが実行される。 というものなのですが、印刷ボタンをクリックしても、接続している状態のままが面は変わらず、そのままタイムアウトしてしまっています。 画面が変わらないにも関わらず、EXCELが起動しているらしく、 プロセスに残ってしまっています。 EXCELを使用している意味は、既存EXCELのマクロが複雑に作られており、 1からACCESS等でリメイクするのも時間がかかると思ったからです。 試しに、既存EXCELのVBAをASPにINCLUDEして実行してみたのですが、 やはり、VBSではサポートされていないメソッドが多々あるらしく、 その部分を補正していくのも時間がかかると思い、諦めました。

関連するQ&A