@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Workbook.Close()でエラー。これってExcelのバグでしょうか?

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 14:03
Excelファイルのシート上にyyyy/mm/dd形式で値を入力し、セルの書式設定で「日付」を選択後、種類に「*2001年3月14日」を指定後に保存し、そのファイルをプログラム上(言語はVB6.0です)でWorkbook.Open → 印刷処理 → Workbook.Closeと処理を行わせると、なぜか、Workbook.Closeでエラーとなります。
Err.Descriptionの内容は「オートメーション エラーです。サーバによって例外が返されました。」です。
ちなみにOfficeはXPのProでSP2が適用されています。Workbook.Open実行後何もせずに、いきなりWorkbook.Closeとしても同じでした。これってExcel2002バグなのでしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-04 14:26
ども、ぼのぼのです。

Office絡みの問題は、手で全く同様の操作をした場合のことを考えてみると結構原因がわかったりします。

 開く→印刷→閉じる

これだけだと出ないかもしれませんが、印刷のところでちょっとでもページ設定を変えてたりすると、変更を保存しますか?みたいなダイアログが出ると思います。
ページ設定すら変えてないとしても、とにかく手で同じ操作をしたときに何かしら確認ダイアログが出るような状況や操作になっていないか考えてみてください。

とりあえず、閉じる前に上書き保存してみてはどうでしょう?
未記入
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 14:52
ぼのぼのさん
返信ありがとうございます。

実は、同様の操作を手で行った場合にはぜんぜん問題ありませんでした。
印刷設定も、新規にExcelを起動した状態から、まったく変更しない状態
です。

あと、Closeの際に引数としてmsoFalse(保存せずに閉じる)を指定しています
が、外した場合にも同様でした。

処理中にダイアログが出力されていることもありません。Close()でいきなり
エラートラップに引っかかる状態です。

>とりあえず、閉じる前に上書き保存してみてはどうでしょう?
これもやってみましたが同じ結果でした。
Okis
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 17:22
初めまして、通りすがりのうちなぁんちゅです。

私も似たような経験があるので
書き込みさせてください。

VBからExcelを操作しているのであれば、
それは

Set objXL = New 〜

としてオブジェクト(?)を
作製しているのでしょうか?
そうならば

objXL.Workbook.Open

objXL.Workbook.Close

として試してみてもらえますか?
(全てのエクセルオブジェクトを明示的に指定。
With 〜 End With でもできるかな?)


私の場合はエクセルを操作後、

Set objXL = Nothing

としてもプロセスから削除できませんでした。
その時、操作している全エクセルオブジェクト(?)を
明示してやることで解決できました。
プログラム初心者ですので語意があやふやなところは
勘弁してくださいマシ。
(W2k + SP4, VB6, Excel2000)
未記入
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 17:51
通りすがりのうちなぁんちゅ さん
ご返信ありがとうございます。


以下にコードを記載します。重要な箇所は削除してあります。
Dim objExcelApp As Excel.Application
Dim objWorkBook As Workbook

Set objExcelApp = New Excel.Application

With objExcelApp
.DisplayAlerts = False

.AutomationSecurity = msoAutomationSecurityForceDisable

Set objWorkBook = .Workbooks.Open(FileName:=gStrSrcFile, _
CorruptLoad:=xlRepairFile)

objWorkBook.PrintOut Copies:=1, _
ActivePrinter:=gStrDistiller, _
PrintToFile:=msoTrue, _
Collate:=msoTrue, _
PrToFileName:=gStrPsFile

'?印刷完了待機時の判定を行なう
If PrintJobWait(gStrDistiller, GetFileName(gStrSrcFile)) = False Then
Err.Number = vbObjectError + 1
Err.Description = "PSファイルの作成に失敗しました。"
GoTo ErrHandler
End If

.DisplayAlerts = True
objWorkBook.Close msoFalse    ←ここでエラーになります。

.AutomationSecurity = msoAutomationSecurityLow

.Quit
End With
Set objWorkBook = Nothing
Set objExcelApp = Nothing

On Error GoTo 0
Exit Sub

ちなみにobjWorkBook.Close msoFalseをやめて、Saved=Trueにしてから
objWorkBook.Closeをしようとしても、Saved=Trueの時点でエラーとなり
ました。
Okis
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 18:57
お疲れ様です

取り急ぎ以下のコードで試してみました。

----------------------------------
Private Sub Command1_Click()

Dim objXL As Excel.Application

Set objXL = New Excel.Application
objXL.Workbooks.Open ("hoge.xls")

objXL.Workbooks(1).PrintOut

objXL.Workbooks.Close

Set objXL = Nothing
End Sub
--------------------------------
一応エラーなしで動作し、プリント出力後プロセスからも(エクセルオブジェクトが)無くなりました。
(現在のプロセスを調べてエクセルが多重起動していないかチェックしてみてください)

未記入さんのコードとの違いは

ワークブックオブジェクトを作製しているか否か。
あといくつか差異はありますが、コメントアウト等で
最低限の実装から試してみるのも吉かと思われます。
Okis
会議室デビュー日: 2005/03/04
投稿数: 3
投稿日時: 2005-03-04 19:52
ワークブックオブジェクト云々と書いてしまいましたが、
未記入さんの書き方でも問題ないと思います(検証しました)
検証もろくにしてませんで申し訳ないです。

[追加コード]
Dim objWB As Excel.Workbook
[/追加]

[修正コード]
objXL.Workbooks.Opne("hoge.xls")

Set objWB = objXL.Workbooks.Open("hoge.xls")
[/修正コード]

恥の上塗りですが、私の環境が未記入さんと違うので
指摘(ここでは環境そのもの)にあるとおり
私の検証そのものが当てになりません。(ほんとに申し訳ない)

追加情報 2005/03/05

win xp home + SP2 , Excel2002, VB6 の環境で試してみましたが
未記入さんのようなエラーは発生しませんでした。

[ メッセージ編集済み 編集者: Okis 編集日時 2005-03-04 20:14 ]

[ メッセージ編集済み 編集者: Okis 編集日時 2005-03-04 20:20 ]

[ メッセージ編集済み 編集者: Okis 編集日時 2005-03-04 20:31 ]

[ メッセージ編集済み 編集者: Okis 編集日時 2005-03-05 12:56 ]
1

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