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

このQ&Aに関連する最新のQ&A

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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルを開くアプリケーションとは

ファイルを開こうとすると、ファイルを開くアプリケーションを問われます。
どのアプリケーションで開けば良いのか良く分からないのですが、どれで開けば良いのでしょうか。
どこを見れば分かるのでしょう?
宜しくお願いします。

Aベストアンサー

ファイルは通常、「拡張子」と呼ばれる三つの英字で開くアプリケーションを判断しています。この「拡張子」と言うのは、ファイル名の後ろに付いて表示されるもので、たとえば「テキスト1.txt]と言うファイルなら、「.txt」が拡張子です。ただ、お使いのパソコンによっては、表示されないように設定されているものもあるので、見あたらない時は右クリック→プロパティで見ることができます。

さて、開く時にアプリケーションを問われる、とのことですが、まずはそのファイルの拡張子と、アイコンを確認して下さい。
アイコンがウインドウズのロゴマークになっているのなら、それはそのパソコンのアプリケーションで扱えるファイルではないと言うことです。分かりやすく言うと、「ワード」で作った文章を、「ワード」のないパソコンに持ち込んだときなどです。つまり、その拡張子のファイルを扱えるアプリケーションがないわけです。
この場合は、拡張子を頼りに元のアプリケーションを見つけて、そのソフトで開けば見られます。
また、拡張子が「.bak」の場合、これはアプリケーションが自動で作成する「バックアップファイル」なので、これは元になったファイルがどこかにあるはずです。そちらを開いてみましょう。

参考までに、私が知っている限りの拡張子を掲載します。

.txt→テキストファイル(メモ帳)
.doc→ワードファイル(ワード)
.jpg→ジェーペグファイル(ペイント)
.gif→ギフファイル(ペイント)
.png→画像ファイル(名前忘れました;)(ペイント)
.htm→HTMLファイル(インターネットエクスプローラ)
.xls→エクセルファイル(エクセル)
.bak→バックアップファイル(元のファイルのアプリケーション)

他にもありますが、自信を持って教えられるのはこれくらいです。
また、右クリックした時に、パソコンによっては「自在眼」と言うソフトがあるので、探してみて下さい。このソフトはオールマイティにファイルを開けます。

ファイルは通常、「拡張子」と呼ばれる三つの英字で開くアプリケーションを判断しています。この「拡張子」と言うのは、ファイル名の後ろに付いて表示されるもので、たとえば「テキスト1.txt]と言うファイルなら、「.txt」が拡張子です。ただ、お使いのパソコンによっては、表示されないように設定されているものもあるので、見あたらない時は右クリック→プロパティで見ることができます。

さて、開く時にアプリケーションを問われる、とのことですが、まずはそのファイルの拡張子と、アイコンを確認して下さ...続きを読む

Qvalue="<%=date25(25は変数です)%>"値を変数にしてデータを受け取りたい

いつもお世話になっております。
ASPのプログラミングの最中、データの受け取りを関数で行おうとした所
ソースの記述が分からなくなったので質問した次第です。
お手数をおかけしますが、アドバイスお願いいたします

※質問概要
 あらかじめ入力していたデータを
 value="<%=date値%>(値=1~26)で受け取り、内容をHTMLに表示しようと思っています。
値の変数は「num」
 一件だけならば value="<%=date10%>" と入力して
 「2008/08/29」日付を取得、HTMLに記述させられるのですが
 関数で、複数件(26件)処理するとなると

 変数名1~26の処理をnumに置き換えて
 26個のテキストBOXにそれぞれのデータを出力したいのですが
 どの様に記述すればいいでしょうか?
(value="<%=date<%=num%>%>"にしましたが、データの取得は出来ませんでした。
 value="&lt;%=date<%=num%>%&gt;"も
 テキストBOXに<%=date1%>~26出力されて取得できませんでした)


 説明不足の点がありましたら、即追加いたします。
 以上、よろしくお願いいたします。



ソースを記載いたします

<!-- カレンダー設置関数 -->
<% Function cal(num)
  Dim a
  Dim str %>
  <input type="text" name="date<%=num%>" id="date<%=num%>" onClick="cal<%=num%>.write();
<%  a = 2
   Do Until a > 26
    if a <> num then
%>
     cal<%=a%>.hide();
<%   Else
    End if
     a = a + 1
    Loop
    Response.Write str
    Response.Write " "" "
%>
   onChange="ca<%=num%>.getFormValue(); cal<%=num%>.hide();" value="&lt;%=date<%=num%>%&gt;"【問題の箇所です】>
    <br>
    <div id="caldiv<%=num%>"></div>
<% End Function%>

いつもお世話になっております。
ASPのプログラミングの最中、データの受け取りを関数で行おうとした所
ソースの記述が分からなくなったので質問した次第です。
お手数をおかけしますが、アドバイスお願いいたします

※質問概要
 あらかじめ入力していたデータを
 value="<%=date値%>(値=1~26)で受け取り、内容をHTMLに表示しようと思っています。
値の変数は「num」
 一件だけならば value="<%=date10%>" と入力して
 「2008/08/29」日付を取得、HTMLに記述させられるのですが
 関数で、複数...続きを読む

Aベストアンサー

VBScriptなら Eval関数を使って変数の値を <%= で出力しましょう

value="<%= Eval("date" & num ) %>">

といった具合にします

Qマルチスレッド対応のアプリケーションとは?

CPUにインテルCore2Duoを使っています。

マルチコアを活かせる「単体」でのアプリケーションを知りたいのです。
(ウイルス検索しながらでもブラウジングがサクサクという内容ではありません)

特に動画エンコード関係と聞きましたが・・・

動画エンコードアプリケーションでも、対応の可否はどうやったらわかりますか?

Aベストアンサー

間違っていたらすまんです。

基本的に、マルチスレッド対応のアプリは
アプリがリソースを管理することなので
それが対応しているのもかは、外からは見分けつかないはず。。。

一番の方法は、そのソフトウエアのパッケージが
説明書をみることでしょうか。。。

最近のデュアルブームで、両方に対応している可能性があります。

昔のソフトでマルチスレッド対応をうたっているアプリケーションがあったとしても
シングルCPUの搭載システムで動かすことができなかったとか、CPUの数に制限があったとかありました。
最近のアプリケーションはシングルとマルチ両方に
対応している可能性もあります。

管理用ツールなら見れたかなぁ<タスク、プロセス、そしてスレッドの動作が確認できるソフトがあったと思う

QSUBMITボタンで値を渡す時、次のページのパラメータをAAA="BBB=1&CCC=1"みたいにするには?

普通、次のページに渡すパラメータは

test.asp?AAA=1

みたいな形だと思うのですが、

test.asp?AAA=BBB=1&CCC=1 みたいなことをしたいのです。

BBB=1&CCC=1 を AAA に格納したいのですが、

どうやればいいのでしょう?

Server.urlencode とかいうのがよく分かりません
どなたか意味と役割と使い方を教えて下さい。

Aベストアンサー

Response.Redirect "test.asp?AAA=" & _
Server.URLEncode("BBB=1&CCC=1")

test.asp 側では Request.QueryString("AAA") を参照すれば
BBB=1&CCC=1 が入っています

Qプロトコルとしてのアプリケーションの意味とは?

インターネットにおけるアプリケーションという語は、英単語のapplication(応用)という意味のほかにプロトコルとしての意味を持っていると本に書かれていました。
プロトコルとしてのアプリケーションの意味はどのようなものなのでしょうか。教えてください。

Aベストアンサー

OSI 参照モデルの「アプリケーション層」のことでしょうか?
見当違いならごめんなさい。
http://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB

参考URL:http://e-words.jp/w/OSIE58F82E785A7E383A2E38387E383AB.html,http://www.mm-labo.com/computer/tcpip/basic/OSI.html

QDetailsViewで挿入後、挿入したレコードを表示

Visual Studio 2008でWebサイト作成に関する質問です。
DetailsViewコントロールでレコード挿入をおこなった場合、
挿入直後に表示される画面は、挿入レコードではなく、
挿入作業の前に表示していた既存レコードになってしまいます。
Webのユーザ(一般人)から見たら、新規作成で送信したはずの
情報がすぐ表れるのが自然であり、そうではない情報が出てくるのは心外かと思います。
DetailsViewコントロールで挿入確認ボタンを押したら、挿入レコードをすぐ表示する方法はないでしょうか。

Aベストアンサー

>参考URL見ました。けっこう複雑なんですね。

このレベル程度では、まだまだ序の口な方ですよ。
これが、AjaxやASP.NET MVC, LINQやJQueryなんかが絡んでくると
もっともっと頭が痛いくらい複雑になります。
今回のケースはそれらを使っていない分、まだ良い方です。

ASP.NET標準のコントロールだけの動きのみではできないことの方が圧倒的に多いので、それらはすべてコードを書いて自力で作ることになります。今回のケースだとまだコード量は少ない方だと思います。

>そのURLに説明されているように、私も自作テーブルにおいて、自動採番形式を用いています。
>しかし、もしコード例を出してもらえるようなら出してもらえればたいへんありがたいです。

ということで、下記のサイトをご覧ください。

DetailsViewで作成したレコードを作成直後に表示する方法~主キーがIDENTITY項目の場合~
http://techbank.jp/Community/blogs/mymio/archive/2008/11/24/3378.aspx

ただし、DBは、SQL Serverを前提としていますので、もし、OracleやAccessなど、他のDBを使われている場合は、またやり方が違います。
しかし、ある程度、この応用でいけるはずなので、後は自分で調べながらやって頂ければと思いますが、どうしてもわからなければ相談に乗りますので、またご連絡ください。

参考URL:http://techbank.jp/Community/blogs/mymio/archive/2008/11/24/3378.aspx

>参考URL見ました。けっこう複雑なんですね。

このレベル程度では、まだまだ序の口な方ですよ。
これが、AjaxやASP.NET MVC, LINQやJQueryなんかが絡んでくると
もっともっと頭が痛いくらい複雑になります。
今回のケースはそれらを使っていない分、まだ良い方です。

ASP.NET標準のコントロールだけの動きのみではできないことの方が圧倒的に多いので、それらはすべてコードを書いて自力で作ることになります。今回のケースだとまだコード量は少ない方だと思います。

>そのURLに説明されているように...続きを読む

QDM2V.exe -アプリケーションエラー-とは

ミニタワーPCです。
グラフィックボードを交換したら、起動の度にエラー表示が出るようになってしまったのですが、意味が分かりません。
どなたか教えてください。

-------------------------------------------
DM2V.exe -アプリケーションエラー-
アプリケーションを正しく初期化できませんでした (Oxc0000142)。[OK] をクリックしてアプリケーションを終了してください。
-------------------------------------------

・エプソン MT-7900
・Win XP SP3
・CPU Intel Core(TM) Duo E8300 @2.83GHz
・メモリ 2GB
・交換前のグラボIntel G31 Express
・交換後のグラボI/oデータGA-RH5450

[OK] を押せば、普通に作業ができていて、今のところ起動しなくなったアプリは見つけられていないのですが、やはり何か起動できなくなったアプリがあるはずなのですよね?

Aベストアンサー

>DM2V.exe -アプリケーションエラー-

アプリケーションDisplay Manager 2Vをアンインストール、再起動、画面調整ツール、ディスプレイマネージャの順で入れ直す。

(メーカー製PCのハードウェアを交換すると搭載OEM版OSのリカバリCD-ROMでの再インストールができなくなりませんか)

QASP上のVB SCRIPT記述(result setからcountを取得する方法)

初心者です。
ASP上のVB SCRIPT記述(result setからcountを取得する方法)が分かりません。

Set rsRet= MyConn.Execute(strSql)
nCltCnt = 0
If Not rsRet Is Nothing Then
nCltCnt = rsRet.Count
End If

という記述をしたのですが、エラーになります。メッセージは以下の通りです。

●エラー タイプ
Microsoft VBScript 実行時エラー (0x800A01B6)
オブジェクトでサポートされていないプロパティまたはメソッドです。: 'Count'
xxx.asp, line 110


サポートされていないのであれば、result setからの件数の取得を教えて下さい。
どなたかアドバイス宜しく願います。

Aベストアンサー

>現在、ADOを使用してます
ADOでは、Countプロパティはありません。RecordCountプロパティを使用します。
 nCltCnt=rsRet.RecordCount

ですが、ADOのマニュアルを見ると、「前方スクロールカーソル」ではレコード数が取れないこと、「プロバイダやカーソルタイプ」によってはサポートしないことが明記されています。ですので、
 Set rsRet=MyConn.Execute(strSql)
では、前方スクロールとなるため、取得できません。
ですので、レコードセットのOpenメソッドを使い、前方スクロールカーソルでないタイプを選ぶことと、OLE DBプロバイダがRecordCountプロパティをサポートするかどうかを調べてください。

ちなみに、私はDBがOracleだったので、oo4oを使い、GetRowsメソッドを使い、配列の大きさを見て、レコード数を数えました。

>ミドルウェアって、compatible; MSIE 5.01; Windows NT) ということで宜しいんでしょうか?
ミドルウェアとは、まさに、ADO、DAO、RDO、oo4oのことをさしています。

>将来的にはRDOに変更する
余計なことかもしれませんが、RDOは将来性がないと思います。ADOでもODBCが使えますので、ADOのままにされることをお勧めします。

>各々で使用可能なメソッド
ADOは、ADOがインストールしてあるコンピュータで「ADO*.chm」で検索してもらえば、ヘルプファイルが見つかると思います。
RDOは、ヘルプファイル自身が、情報が少ないので、MSDNをお勧めします。
DAOは、同じく「DAO*.chm」または「DAO*.hlp」でヘルプが見つかると思います。

>現在、ADOを使用してます
ADOでは、Countプロパティはありません。RecordCountプロパティを使用します。
 nCltCnt=rsRet.RecordCount

ですが、ADOのマニュアルを見ると、「前方スクロールカーソル」ではレコード数が取れないこと、「プロバイダやカーソルタイプ」によってはサポートしないことが明記されています。ですので、
 Set rsRet=MyConn.Execute(strSql)
では、前方スクロールとなるため、取得できません。
ですので、レコードセットのOpenメソッドを使い、前方スクロールカーソルでないタ...続きを読む

Qアプリケーションとはどういう意味?

アプリケーション=OSを除いたソフトウェア 

で正しいですか?

Aベストアンサー

ご質問の内容で正しいです。
アプリケーション(AP)は元々業務を目的として作成されたプログラムです。
コンピュータの世界では、OS、APとユーティリティ(汎用)の3つで構成されていると言っても過言ではありません。
OSは必ず下位のバージョンと互換性(保障)が無ければいけないというルールがありますが、アプリケーションにはそれが有りません。
ユーティリティソフトは色々なアプリケーションで共通に使われる道具として作成されるものが主となっています。

Aベストアンサー

gotoPageFromAA011
という関数は、JavaScriptの関数です。

書き方や呼び出し方云々の問題ではなく、直接実行はVBScriptで行える場所にはありません。

Call gotoPageFromAA011()
↑よってこの部分は不要です。


要は、ログインボタンエレメントを取得して、クリックさせてあげると、中で勝手にJavaScriptが実行します。


gotoPageFromAA011をコメントアウトし、以下のコードを追加してください。

'Call gotoPageFromAA011() ← コメントアウト

'↓以下追加
Call SubmitFunctionCall(objIE.Document)

Sub SubmitFunctionCall(p_doc)
Dim l_divLogin
Set l_divLogin = p_doc.getElementById("loginForms")

Dim l_divSec
Set l_divSec = l_divLogin.ChildNodes(0)

Dim l_htmTbl
Set l_htmTbl = l_divSec.ChildNodes(0)

Dim l_htmTblRow
Set l_htmTblRow = l_htmTbl.Rows(0)

Dim l_htmTblCell
Set l_htmTblCell = l_htmTblRow.Cells(1)

Dim l_htmBtn
Set l_htmBtn = l_htmTblCell.ChildNodes(0)
Call l_htmBtn.Click()
End Sub


ってかこの手の質問は、「ASPカテゴリ」ではなく、「JavaScriptカテゴリ」か「VBカテゴリ」に質問した方が素早い回答を得られますよ。

gotoPageFromAA011
という関数は、JavaScriptの関数です。

書き方や呼び出し方云々の問題ではなく、直接実行はVBScriptで行える場所にはありません。

Call gotoPageFromAA011()
↑よってこの部分は不要です。


要は、ログインボタンエレメントを取得して、クリックさせてあげると、中で勝手にJavaScriptが実行します。


gotoPageFromAA011をコメントアウトし、以下のコードを追加してください。

'Call gotoPageFromAA011() ← コメントアウト

'↓以下追加
Call SubmitFunctionCall(objIE.Document)

Sub Subm...
続きを読む


人気Q&Aランキング