-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.90059
  • 閲覧数393
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 40% (36/88)

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
----------------------------------------------------------------------
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル10

ベストアンサー率 42% (79/186)

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

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

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

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

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

目的がわからないで、なんともいえませんが、どうしてもExcelのファイルでなければならない理由がなければ、CSVファイルに出して、Excelに読ませるようにするほうが、よいような気がします。
お礼コメント
forester

お礼率 40% (36/88)

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

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

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

いろいろとお手数をお掛けしました。
ありがとうございました。
投稿日時 - 2001-06-15 17:30:11
関連するQ&A
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 33% (427/1283)

 どのタイミングでタイムアウトになるのですか?  挿入した時? 挿入の結果待ち? 次の挿入を行う時? 2カラムではうまくいくの?(どこからエラーになるの?)  そもそも、Excelを使用している意味がわかりません。ASPで運用してるのですよね??  だったら、全部ASP上で行えばいいのでは?  今一度、Excelを使用する意味を考えてみて下さい。 私なら、データ加工までは全部Ac ...続きを読む
 どのタイミングでタイムアウトになるのですか?

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


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

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

お礼率 40% (36/88)

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

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

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

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

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

お礼率 40% (36/88)

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

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


  • 回答No.2
レベル13

ベストアンサー率 33% (427/1283)

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

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

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

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

お礼率 40% (36/88)

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

オブジェクトの解放はちゃんと行っているのですが、
VBみたいに、エラー時にON ERROR GOTOで解放処理に飛ばす事ってできるのですか?
リファレンスを見たところ、VBSにはON ERROR RESUMU NEXTしかなかったものですから・・・
投稿日時 - 2001-06-15 08:57:32
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ