トップ回答者
WSH(Excel出力)の同時実行数の制限

質問
-
WSHでExcel出力処理を行っているのですが、
同時実行数が30を超えると、Excelが不安定になるようで、
Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False)
の行で、
エラー:WorkbooksクラスのOpenプロパティを取得できません。
コード:800A03EC
ソース: Microsost Office Excel
というエラーが発生して異常終了してしまうのです。
同時実行数の上限など、また、それ以外の原因について、
ご存知の方がいらっしゃいましたら、コメント頂ければ幸いです。
ちなみに、同時実行数が30未満の場合は、正常終了するので、
コードの内容には、問題ないと思っております。
Excelのバージョンは、2003で、ファイルの構成は、
wsfファイル(yyy.wsf)
vbsファイル(wsh_excel.vbs)の2ファイルを配置し、
以下のような形で、実行しています。
Set WshShell = Server.CreateObject("WScript.Shell")
Set objBatch = WshShell.Exec(strCmd)
※ strCmdには、以下のような値が設定されます。
cmd.exe wscript.exe "C:\xxx\yyy.wsf"
■ yyy.wsfの内容
<?xml version="1.0" encoding="shift_jis" ?>
<job id="zzz">
<script language="VBScript" src="wsh_excel.vbs"/>
<script language="VBScript">
Call Excel_Main()
</script>
</job>
■ wsh_excel.vbsの内容(抜粋)
Sub Excel_Main()
Set objExcelApp = Wscript.CreateObject("Excel.Application")
Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False)
:
:
End Sub
回答
-
搭載されるメモリや仮想メモリに依存すると思いますので何とも言えませんが、Excelを30(というか数十)プロセスも起動することに無理があるような…。
とりあえずとしては、使用できる物理メモリや仮想メモリを増やして30プロセス以上、起動できるか確認するのも手ですが、Excelを30プロセス(以上)も起動しないような仕組みを考えた方がいいような気もします。
例えば、同時に処理するのではなくキューにためておいて順次処理するとか、Excelを使わないでOpenXMLフォーマット(Excel 2007の*.xlsx形式)を作成するとかが考えられます。
(詳しい処理内容が書かれていないので、どの方法が良いか判断できませんが)- 回答としてマーク sk7474 2009年4月2日 9:21
すべての返信
-
搭載されるメモリや仮想メモリに依存すると思いますので何とも言えませんが、Excelを30(というか数十)プロセスも起動することに無理があるような…。
とりあえずとしては、使用できる物理メモリや仮想メモリを増やして30プロセス以上、起動できるか確認するのも手ですが、Excelを30プロセス(以上)も起動しないような仕組みを考えた方がいいような気もします。
例えば、同時に処理するのではなくキューにためておいて順次処理するとか、Excelを使わないでOpenXMLフォーマット(Excel 2007の*.xlsx形式)を作成するとかが考えられます。
(詳しい処理内容が書かれていないので、どの方法が良いか判断できませんが)- 回答としてマーク sk7474 2009年4月2日 9:21
-
CatTailさん、コメント有難うございます。
メモリ容量の異なるマシンで試したところ、
マシンA ・・・ 物理メモリ:2GB、仮想メモリ:2GB
マシンB ・・・ 物理メモリ:640MB、仮想メモリ:1GB
エラーとなってしまう、プロセス数の差は、たったの1だったので、
どこかに、設定値のようなものがあるのかなと思ってしまいました。
実行環境について、もう少し詳しく書いてみると、このExcel作成処理は、
Webアプリケーションの一部で、aspファイルから、
最初のスレッドに記載した、以下のコマンドを投げて、
バックグラウンド(非同期)で実行しています。
終了したかの確認は、別画面にて行う。
Set WshShell = Server.CreateObject("WScript.Shell")
Set objBatch = WshShell.Exec(strCmd)
※ strCmdには、以下のような値が設定されます。
cmd.exe wscript.exe "C:\xxx\yyy.wsf"
全体のユーザー数は、100人以上であるため、非常にまれですが、
Excelのプロセスが30以上になってしまう可能性を含んでいます。
そもそも、サーバーサイドでMicrosoft Office のオートメーションを使用することは
推奨、サポートをしていないのは、わかっているのですが、
ASPでExcelファイルを作成するようなソフトが見つからず、
この方法を取ることとなりました。
今回、2つほど、ご提案を頂き、大変、ありがたいのですが、
予算等の確保が厳しく、あまり工数が掛かる対応が出来ないのが正直なところです。 -
こんにちは。中川俊輔です。
CatTailさん、回答ありがとうございます。
takakentakakenさん、はじめまして。フォーラムのご利用ありがとうございます。
有用な情報と思われたため、CatTailさんの回答へ回答マークをつけさせていただきました。
また、今回の問題にかかわっているかはわかりませんが、物理メモリ量にかかわらず起きる問題として
以下のようなものがあります。参考までに紹介させていただきます。
http://support.microsoft.com/default.aspx/kb/312362/ja
今後ともフォーラムをよろしくお願いします。
それでは!
マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔