- PR -

VBScriptを使ってExcelを作成する時にCalculationプロパティを設定できません

1
投稿者投稿内容
k2a-go
会議室デビュー日: 2003/07/01
投稿数: 5
投稿日時: 2006-08-31 10:10
バッチ処理にてVBScriptを使ってExcelを作成しています。
次第にそのExcelでのレポート対象のデータ件数が増え、当初1,2分で終わった処理が、現在50分以上かかるようになってしまいました。

そこで、処理時間の短縮を目指し調査したところ、Excel作成途中に自動再計算しないと早くなるとのアドバイスを受けました。
アドバイスに従い以下のようにApplication クラスの Calculation プロパティに値:xlCalculationManualをセットして処理をするように変更しました。

   1   Set objExcel = CreateObject("Excel.Application")
   2   Set objWorkbook = objExcel.Workbooks.Add()
   3
   4   Wscript.Echo "Calculation: " & objExcel.Calculation
   5   Wscript.Echo "--------------------------------"
   6
   7   objExcel.Calculation = xlCalculationManual
   8   Wscript.Echo "Calculation: " & objExcel.Calculation
   9
   10   Wscript.Echo "--------------------------------"
   11
   12   objExcel.Calculation = xlCalculationAutomatic
   13   Wscript.Echo "Calculation: " & objExcel.Calculation
   14
   15   objExcel.Quit

例えば上記のVBScriptを実行すると7行目で、” Microsoft Office Excel: Application クラスの Calculation プロパティを設定できません。”
というエラーになってしまいます。

同じと思われるApplication クラスのScreenUpdatingプロパティ等には値が設定出来るのに、なぜ、Calculationプロパティには設定出来ないのでしょうか?
あるいは、上記コードに間違い、回避策等がありましたら教えて頂けないでしょうか?
よろしくお願いします。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-31 10:40
試してませんが。

>xlCalculationManual
VBScriptから、参照なしでこの定数は解決できるんでしょうか?
k2a-go
会議室デビュー日: 2003/07/01
投稿数: 5
投稿日時: 2006-08-31 10:53
引用:

mioさんの書き込み (2006-08-31 10:40) より:
試してませんが。

>xlCalculationManual
VBScriptから、参照なしでこの定数は解決できるんでしょうか?


参照出来ませんでした。

WSHにしてタイプライブラリを参照したら上記は動作しました。
ありがとうございました
いげ太
常連さん
会議室デビュー日: 2004/10/27
投稿数: 32
投稿日時: 2006-08-31 11:16
WSF ファイルにそんなメリットがあったとは。
勉強になりました。

.vbs ファイルを .wsf ファイルに移行して、
コード:
<reference object="Excel.Application" />

とした。ってことですよね?

[参考]
Hey, Scripting Guy!: スクリプトからタイプ ライブラリにアクセスする方法はありますか
k2a-go
会議室デビュー日: 2003/07/01
投稿数: 5
投稿日時: 2006-08-31 12:28
引用:

いげ太さんの書き込み (2006-08-31 11:16) より:

コード:
<reference object="Excel.Application" />

とした。ってことですよね?




はい、そうです。ただ、私はGUIDしか調べられなかったので
コード:
  <REFERENCE GUID="{00020813-0000-0000-C000-000000000046}"/>


としました。
便乗質問ですいません。WSHにおいてExcelのタイプライブラリにはProgIDを何とすればよいかご存知でしたら教えてください。個人的にGUIDはやはり解りにくいので

■経過報告
実際のバッチ処理を、WSHにして参照設定して実行したところ、
” Microsoft Office Excel: Application クラスの Calculation プロパティを設定できません。”
となってしまいました。いま、落ち着いてもう一度チェックします。
k2a-go
会議室デビュー日: 2003/07/01
投稿数: 5
投稿日時: 2006-08-31 13:20
解決しました。

コード:
Set objExcel = CreateObject("Excel.Application")

' 画面の更新を抑止する  
objExcel.ScreenUpdating = False
' 再計算方法を手動にして再計算を止める  
objExcel.Calculation = xlCalculationManual

Set objWorkbook = objExcel.Workbooks.Add()



としていたのを

コード:
Set objExcel = CreateObject("Excel.Application")

' 画面の更新を抑止する  
objExcel.ScreenUpdating = False

Set objWorkbook = objExcel.Workbooks.Add()

' 再計算方法を手動にして再計算を止める  
objExcel.Calculation = xlCalculationManual



と変更したところエラーとならずに実行できました。WorkbookオブジェクトがないとCalculation プロパティは設定出来ないようです。ScreenUpdating プロパティは設定できました。両者を同じApplication クラスのプロパティと考えていたところに落とし穴がありました。
ありがとうございました。
いげ太
常連さん
会議室デビュー日: 2004/10/27
投稿数: 32
投稿日時: 2006-08-31 13:40
引用:
k2a-goさんの書き込み (2006-08-31 12:28) より:

WSHにおいてExcelのタイプライブラリにはProgIDを何とすればよいかご存知でしたら教えてください。


ちゃんと調べもせずにレスしてしまいました。申し訳ありません。

コード:
<reference object="Excel.Application" />

とすると、
『80040068: この参照用のタイプ ライブラリが見つかりません。』
のエラーになりました。

私の方でも調べましたところ、k2a-go さんの仰るとおり
GUID で指定するしかなさそうです。

http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list27.shtml
※【おじさま】さんの 2000/12/26/ 14:30:30 の投稿を参考にしました。

[ メッセージ編集済み 編集者: いげ太 編集日時 2006-08-31 13:45 ]
いげ太
常連さん
会議室デビュー日: 2004/10/27
投稿数: 32
投稿日時: 2006-08-31 16:23
さらに調べてみたら Microsoft サポート技術情報(文書番号: 183771)に
行き当たりました。

[VB] ActiveX コンポーネントで作成されるレジストリ エントリ

これに従い、Scripting.FileSystemObject のタイプライブラリを
レジストリエディタ上から追跡すると、
  • 調査する ProgID、Scripting.FileSystemObject を HKEY_CLASSES_ROOT 直下から探す。
  • HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID の値のデータから、
    ProgID に関連付けられている ClassIDが {0D43FE01-F093-11CF-8940-00A0C9054228}
    であることを確認する。
  • ClassID、{0D43FE01-F093-11CF-8940-00A0C9054228} を HKEY_CLASSES_ROOT\CLSID
    から探す。
  • HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\TypeLib
    の値のデータ は {420B2830-E718-11CF-893D-00A0C9054228} である。
と手繰っていけます。

対して、Excel.Application の場合、
  • 調査する ProgID、Excel.Application を HKEY_CLASSES_ROOT 直下から探す。
  • HKEY_CLASSES_ROOT\Excel.Application\CLSID の値のデータから、
    ProgID に関連付けられている ClassIDが {00024500-0000-0000-C000-000000000046}
    であることを確認する。
  • ClassID、{00024500-0000-0000-C000-000000000046} を HKEY_CLASSES_ROOT\CLSID
    から探す。
  • HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}
    のサブキーに TypeLib がない。
とサブキーがなくなっていて、手繰っていけなくなります。

上記の走査方法が、スクリプト実行時にも当てはまるならば、

コード:
<reference object="Excel.Application" />


がエラーになる理由になります。

真偽の程は分かりかねますが、ご参考まで。



[修正]
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}
のサブキーに TypeLib がない。

HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}
のサブキーに TypeLib がない。
[/修正]



[追記]
上記の推論、検証しました。
本題は解決済みのようですので、追記にてご報告します。

サブキーに TypeLib がないからダメかも、って推論。
ってことは、追加してスクリプトが動けばこの推論が正しいか分かる。

コード:

キー名: HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\TypeLib
データ: {00020813-0000-0000-C000-000000000046}


を追加したところ、下記の検証コードが動作しました。

コード:

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="TypeLibTest">
<reference object="Excel.Application"/>

<script language="vbscript">
<![CDATA[
WScript.Echo(xlCalculationManual) '-4135
]]>
</script>
</job>
</package>


よって、推論は正しいものと思われます。

[ メッセージ編集済み 編集者: いげ太 編集日時 2006-09-05 11:57 ]

[ メッセージ編集済み 編集者: いげ太 編集日時 2006-09-05 14:15 ]
1

スキルアップ/キャリアアップ(JOB@IT)