C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: Excel(SaveAs)がフ゜ロセスに残る


(過去ログ 86 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■50704 / inTopicNo.1)  Excel(SaveAs)がプロセスに残る
  
□投稿者/ VBねっと (1回)-(2010/06/15(Tue) 17:49:52)

分類:[VB.NET/VB2005 以降] 

WinXp+VB2008Express+Excel2003

ExcelをVBで制御していますが、ExcelのSaveAsメソッドを使用すると
プロセスにExcel.exeが残ってしまいます。
どなたか解決方法がわかりませんか?
Excel2002では起きていません。

コードは下記のように実装しています。

---------------------------------------------------------------
Private Function testExcel() As String
Dim xlapp As New Excel.Application()
Dim xlbooks As Excel.Workbooks = xlapp.Workbooks
Dim xlbook As Excel.Workbook
Dim xlsheets As Excel.Sheets
Dim xlsheet As Excel.Worksheet
Dim xlrange As Excel.Range

Try
xlbook = xlbooks.Open("C:\test.xls")
xlsheets = xlBook.Sheets
xlsheet = xlsheets.Item("Sheet1")
xlapp.Visible = True

' Cellの操作
xlrange = xlsheet.Range("A1")
xlrange.Value = "hoge"
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlrange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheets)
xlapp.DisplayAlerts = False
xlbook.SaveAs("C:\test.xls") '<- ここをコメントアウトするとプロセスにExcel.exeは残りません
xlbook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbook)

Catch ex As Exception
MsgBox(ex.Message)
testExcel = "NG"

Finally
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlbooks)
xlapp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp)
testExcel = "OK"

End Try


End Function
---------------------------------------------------------------
引用返信 編集キー/
■50706 / inTopicNo.2)  Re[1]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ 魔界の仮面弁士 (1665回)-(2010/06/15(Tue) 19:14:26)
2010/06/15(Tue) 19:18:12 編集(投稿者)

# 返信時にはタイトルを修正できないため、編集で対応。(半角カナ→全角)

No50704 (VBねっと さん) に返信
半角カナの利用は禁止されています。掲示板の利用方法を再読願います。
http://bbs.wankuma.com/index.cgi?mode=man


> Private Function testExcel() As String
この実装だと、エラーが起きようと起きまいと、戻り値は常に "OK" しか
返さない事になりますが、それで良いのでしょうか?


> どなたか解決方法がわかりませんか?
そもそも、Open 時の同名ファイルに SaveAs しているのが不自然に見えます。
ファイルの上書き保存なら、Save を使うべきかと思いますよ。

それにこのコードだと、保存に失敗したとき(C:\test.xls が読み込み専用であるなど)には
xlbook.Close() や Marshal.ReleaseComObject(xlbook) が実行されない事になりますね。


それらを修正しても駄目なようであれば――

・それぞれの ReleaseComObject の戻り値が、0 である事を確認する。
・SaveAs(Save)の処理を CallByName 経由の呼び出しに変更してみる。
 「CallByName(xlbook, "SaveAs", CallType.Method, "C:\test.xls")」
・複数のバージョン(2002 と 2003 など)を同一の環境にインストールしていない事を確認する。
・Excel ライブラリを使うために、どのファイルを参照設定に加えているかを再確認。
・新規に空の xls ファイルを作って試した場合にも、同じ結果になるかどうかを確認。
・C:\test.xls または PERSONAL.XLS などで、何らかのマクロが実行されてはいないかを確認。
引用返信 編集キー/
■50721 / inTopicNo.3)  Re[2]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (2回)-(2010/06/16(Wed) 10:52:39)
>>Private Function testExcel() As String
> この実装だと、エラーが起きようと起きまいと、戻り値は常に "OK" しか
> 返さない事になりますが、それで良いのでしょうか?
→ご指摘ありがとうございます。
 このコードは原因調査用のコードで戻り値でなくタスクマネージャーでプロセスをチェック
 していました。本番にはFinallyブロックをなくして正しく”NG"が出るようにします。

> ファイルの上書き保存なら、Save を使うべきかと思いますよ。
→Saveでも同じでした。
 本番のソフトは、新規ブックを開いて、SaveAsでファイル名指定して保存していました。
 しかし、プロセスにExcel.exeが残る問題が発生したため、原因調査用のコードを新規に実装
 しどこに原因があるかを1行1行コードを変えたりして調べていました。
 その結果、SaveAsもしくはSaveメソッドを実行すると問題が発生するところまで判りました。

> それにこのコードだと、保存に失敗したとき(C:\test.xls が読み込み専用であるなど)には
> xlbook.Close() や Marshal.ReleaseComObject(xlbook) が実行されない事になりますね。
→アドバイスありがとうございます。
 このコードはプロセスが残る原因を調査するためだけに作ったテスト用のコードでtest.xlsも、
 読み書き可能な空のExcelファイルです。
 デバックモードでトレースしながらタスクマネージャーでチェックしていますが、Excel.exe
 プロセスが残る問題以外は異常ありませんでした。

 
> ・それぞれの ReleaseComObject の戻り値が、0 である事を確認する。
> ・SaveAs(Save)の処理を CallByName 経由の呼び出しに変更してみる。
→ReleaseComObject の戻り値が、0 であるのは全て確認しました。
 「CallByName 経由の呼び出しに変更」も試しましたが、うまくいきませんでした。
 
> ・Excel ライブラリを使うために、どのファイルを参照設定に加えているかを再確認。
→確認しましたが問題ありません。
 Excel 11.0 object Library Ver 1.5
 Office 11.0 object Library Ver 2.3
Office 12.0 object Library Ver 2.4
を参照しています。
 参考)Excel2002環境で作ったプロジェクトを使って、Excel2003がインストされたターゲット
 マシンで動かしているためかと思い、Excel2003環境で参照を設定し直してもだめでした。

> ・新規に空の xls ファイルを作って試した場合にも、同じ結果になるかどうかを確認。
→確認しましたが問題ありません。
 
> ・C:\test.xls または PERSONAL.XLS などで、何らかのマクロが実行されてはいないかを確認。
→確認しましたが問題ありません。

私感ですが、Excel2002とExcel2003のSaveAs(もしくはSave)でCOMの挙動が違うような気がします。
他のCOMはちゃんと開放できています。
Excel2003のSaveAs(もしくはSave)メソッドを使用した場合は、根にか別の処理を追加する必要が
あるのでは? と考えていますが、ネットを検索しても有効な手段が見つかりません。
ネットに「SaveAsの後にApplication.DoEvents()を入れてみてください。」というのがありましたが、
これもうまくいきませんでした。

引用返信 編集キー/
■50727 / inTopicNo.4)  Re[3]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ 魔界の仮面弁士 (1667回)-(2010/06/16(Wed) 13:12:47)
No50721 (VBねっと さん) に返信
> デバックモードでトレースしながら
デバック→デバッグ

>>・複数のバージョン(2002 と 2003 など)を同一の環境にインストールしていない事を確認する。
SaveAs はバージョンによって引数の数が異なるため(ただし、2002と2003では同じ)、
バージョン混在問題かな…とあたりをつけていたのですが、Save でも発生するということは、
ライブラリバージョンの差異ではなく、環境側の問題なのかも知れません。(手元に環境が無いため未確認)

> Excel 11.0 object Library Ver 1.5
> Office 11.0 object Library Ver 2.3
> Office 12.0 object Library Ver 2.4
バージョン対応は 9.0=97、10.0=2002、11.0=2003、12.0=2007 のハズ…。
そもそも、Office 11.0 と 12.0 を同時に参照設定できましたっけ?

それと、これって参照設定の [COM] タブから選ばれるライブラリでは無いでしょうか。
だとしたら、[.NET] タブのプライマリ相互運用機能アセンブリを選択するようにしてみてください。

> 「CallByName 経由の呼び出しに変更」も試しましたが、うまくいきませんでした。
参照設定を外し、すべてレイトバインドで利用してみた場合はどうでしょうか?

> Excel2002とExcel2003のSaveAs(もしくはSave)でCOMの挙動が違うような気がします。
.NET ではなく、Word VBA や VBScript などから呼び出した場合も、残ってしまいますか?

> ネットに「SaveAsの後にApplication.DoEvents()を入れてみてください。」というのがありましたが、
具体的な URL を教えていただけないでしょうか。

> これもうまくいきませんでした。
どうしても解決できないようであれば、CreateDomain したアプリケーションドメインに
Excel.Application を CreateInstanceFromAndUnwrap しておき、xls 保存処理完了後に、
最後にそのアプリケーションドメインを Unload してみるというのは如何でしょう。
引用返信 編集キー/
■50766 / inTopicNo.5)  Re[4]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (3回)-(2010/06/17(Thu) 15:41:00)
No50727 (魔界の仮面弁士 さん) に返信
 アドバイス頂いた内容を確認しましたが、どうもExcel2003 SP3側に原因がありそうです。
 VB.netでの回避手段も模索しています。

>> 参照設定を外し、すべてレイトバインドで利用してみた場合はどうでしょうか?

 →チェック用に別プロジェクトを作成し、下記のコードで確認しましたがだめでした。
 
   Private Sub Button1_Click
        Dim oExcel As Object
        Dim oBooks As Object
        Dim oBook As Object
        Dim oSheet As Object
        Dim oRange As Object
        Try
            'Excel起動
            oExcel = CreateObject("Excel.Application")
            oBooks = oExcel.Workbooks
            oBook = oBooks.Add

            '仮データ入力
            oSheet = oBook.Worksheets(1)
            oRange = oSheet.Range("A1")
            oRange.Value = "hoge"

            'Excel保存し終了
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)

            oBook.SaveAs("c:\Book1.xls")
            oBook.close()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
            oExcel.Quit()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub


>> .NET ではなく、Word VBA や VBScript などから呼び出した場合も、残ってしまいますか?
→下記コードで2回目以降に残ります。(上書きになるため?)
 但し、oExcel.DisplayAlertsをTrueにしても、2回目以降にあわられる「上書きしますか?」
 で「はい」を選んでも残ります。
 直接、手動でExcelを開き、プログラムと同じ処理をしてみましたが、当然のことながら、
 問題は起きませんでした。 Excelのみを使用する場合は起きません。 Excelを外部プログ
 ラムで操作すると起きるようです。

Option Explicit

Dim oExcel
Dim oBooks
Dim oBook
Dim oSheet
Dim oRange

'@エクセルオブジェクトを作成します
Set oExcel = CreateObject("Excel.Application")
Set oBooks = oExcel.Workbooks
Set oBook = oBooks.Add
Set oSheet = oBook.Worksheets(1)
Set oRange = oSheet.Range("A1")

oRange.Value = "hoge"

'Aエクセルを終了します
oExcel.DisplayAlerts = false
oBook.SaveAs("c:\Book1.xls")
oBook.close()
oExcel.Quit

'オブジェクトの破棄
Set oExcel = Nothing
Set oBooks = Nothing
Set oBook = Nothing
Set oSheet = Nothing
Set oRange = Nothing

>>ネットに「SaveAsの後にApplication.DoEvents()を入れてみてください。」というのがありましたが、
> 具体的な URL を教えていただけないでしょうか。http://ap.atmarkit.co.jp/bbs/core/fdotnet/10767?page=2 にありました


> どうしても解決できないようであれば、CreateDomain したアプリケーションドメインに
> Excel.Application を CreateInstanceFromAndUnwrap しておき、xls 保存処理完了後に、
> 最後にそのアプリケーションドメインを Unload してみるというのは如何でしょう。
→う〜ん 非力な私には時間がかかりそうです。
 もう少し勉強します。
 (初心者に近い私にとって、ネットで検索しても実装するために必要な知識を習得できそうな記事が
 見当たりません。ヒントになるようなサイトがあれば紹介お願いします。)


引用返信 編集キー/
■50796 / inTopicNo.6)  Re[5]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ Azulean (568回)-(2010/06/17(Thu) 23:18:17)
No50766 (VBねっと さん) に返信
>  アドバイス頂いた内容を確認しましたが、どうもExcel2003 SP3側に原因がありそうです。

なぜ、そのように判断したのでしょうか。
根拠をお聞かせください。

> oSheet = oBook.Worksheets(1)

Worksheets を一度変数で受けて、これも Release しないとだめですよね。
("Worksheets(1)" と直接やるとリークして(漏れて)いる)
引用返信 編集キー/
■50806 / inTopicNo.7)  Re[6]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (4回)-(2010/06/18(Fri) 13:30:46)
No50796 (Azulean さん) に返信
> なぜ、そのように判断したのでしょうか。
> 根拠をお聞かせください。

  @VBSでもレイトバインドでも解決されない->プログラムの問題ではないのでは?
 AExcel2002(別のPC)では問題ない。
 と思ったからです。

 ※但し、検証用に新規作成したVBS・VB.net(レイトバインド)には下記不具合があ
 りましたので、修正して確認しました。 しかし、今度は、1回目から残りました。

  PCの環境かもしれませんので、Office2003とVB2008Expressを再インストするなど
 やってみます。


>>            oSheet = oBook.Worksheets(1)
> 
> Worksheets を一度変数で受けて、これも Release しないとだめですよね。
> ("Worksheets(1)" と直接やるとリークして(漏れて)いる)

 下記のようにVBSのコードを修正しましたが、今度は、1回目からExcelがプロセスに
 残りました。

------------------- VBS(修正版) -----------------------
Option Explicit

Dim oExcel
Dim oBooks
Dim oBook
Dim oSheets
Dim oSheet
Dim oRange

'@エクセルオブジェクトを作成します
Set oExcel = CreateObject("Excel.Application")
Set oBooks = oExcel.Workbooks
Set oBook = oBooks.Add
Set oSheets= oBook.Sheets
Set oSheet = oSheets.item(1)
Set oRange = oSheet.Range("A1")

oRange.Value = "hoge"

'Aエクセルを終了します
oExcel.DisplayAlerts = false
oBook.SaveAs("c:\Book1.xls")
oBook.close()
oExcel.Quit

'オブジェクトの破棄
Set oExcel = Nothing
Set oBooks = Nothing
Set oBook = Nothing
Set oSheets = Nothing
Set oSheet = Nothing
Set oRange = Nothing

--------------------- VB.net(修正版) --------------------
    Private Sub Button1_Click
        Dim oExcel As Object
        Dim oBooks As Object
        Dim oBook As Object
        Dim oSheet As Object
        Dim oSheets As Object
        Dim oRange As Object
        Try
            'Excel起動
            oExcel = CreateObject("Excel.Application")
            oBooks = oExcel.Workbooks
            oBook = oBooks.Add

            '仮データ入力
            oSheets = oBook.Sheets
            oSheet = oSheets.item(1)
            oRange = oSheet.Range("A1")
            oRange.Value = "hoge"

            'Excel保存し終了
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)

            oExcel.DisplayAlerts = False
            oBook.SaveAs("c:\Book1.xls")
            oBook.close()

            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)

            oExcel.Quit()
            System.Threading.Thread.Sleep(5000)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

引用返信 編集キー/
■50808 / inTopicNo.8)  Re[7]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ よねKEN (529回)-(2010/06/18(Fri) 13:51:36)
よねKEN さんの Web サイト
No50806 (VBねっと さん) に返信
> --------------------- VB.net(修正版) --------------------
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
> System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
>

oSheetsの解放がありませんので、まずはそれの追加を・・・

引用返信 編集キー/
■50809 / inTopicNo.9)  Re[8]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (5回)-(2010/06/18(Fri) 14:25:32)
No50808 (よねKEN さん) に返信
> ■No50806 (VBねっと さん) に返信
>>--------------------- VB.net(修正版) --------------------
>> System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
>> System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
>>
>
> oSheetsの解放がありませんので、まずはそれの追加を・・・
>

忘れていました。 追加したら解決しました。

VB.netではレイトバインドを使うとうまくいくというのが判りました。
VB.netはレイトバインドで実装し直ししますが、VBSがうまくいかないの
が気にかかります。

下記のようにQuitの後にSleep 5000を追加すると9/10回はうまくいきます。
VBSで確実にExcelを開放する方法があれば知りたいのですが。。。。。

掲示板とは違う言語の質問になりましたが、これを機会にVBSでもExcelを
動かせるようにしたいと考えています。


----------------------- 改善VBS -----------------------
Dim oBooks
Dim oBook
Dim oSheets
Dim oSheet
Dim oRange

'@エクセルオブジェクトを作成します
Set oExcel = CreateObject("Excel.Application")
Set oBooks = oExcel.Workbooks
Set oBook = oBooks.Add
Set oSheets= oBook.Sheets
Set oSheet = oSheets.item(1)
Set oRange = oSheet.Range("A1")

oRange.Value = "hoge"

'Aエクセルを終了します
oExcel.DisplayAlerts = false
oBook.SaveAs("c:\Book1.xls")
oBook.close()
oExcel.Quit
WScript.Sleep 5000

'オブジェクトの破棄
Set oExcel = Nothing
Set oBooks = Nothing
Set oBook = Nothing
Set oSheets = Nothing
Set oSheet = Nothing
Set oRange = Nothing


引用返信 編集キー/
■50811 / inTopicNo.10)  Re[9]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (6回)-(2010/06/18(Fri) 14:48:55)
すみません。 VB.netにもQuitの後に9秒タイマーを入れていました。
VBSも9秒にしたら10/10回はOKでした。
タイマーでなく、もっと確実に開放する方法にしたいのですが、どなたか
良いアイデアがありませんか?

------------ 改善VB.net(今のターゲット環境ではExcelは残らない) -----------
    Private Sub Button1_Click
        Dim oExcel As Object
        Dim oBooks As Object
        Dim oBook As Object
        Dim oSheet As Object
        Dim oSheets As Object
        Dim oRange As Object
        Try
            'Excel起動
            oExcel = CreateObject("Excel.Application")
            oBooks = oExcel.Workbooks
            oBook = oBooks.Add

            '仮データ入力
            oSheets = oBook.Sheets
            oSheet = oSheets.item(1)
            oRange = oSheet.Range("A1")
            oRange.Value = "hoge"

            'Excel保存し終了
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheets)

            oExcel.DisplayAlerts = False
            oBook.SaveAs("c:\Book1.xls")
            oBook.close()

            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)

            oExcel.Quit()
            System.Threading.Thread.Sleep(9000)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try 

引用返信 編集キー/
■50812 / inTopicNo.11)  Re[9]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ よねKEN (530回)-(2010/06/18(Fri) 15:07:21)
よねKEN さんの Web サイト
No50809 (VBねっと さん) に返信
>>oSheetsの解放がありませんので、まずはそれの追加を・・・
> >
>
> 忘れていました。 追加したら解決しました。
>
> VB.netではレイトバインドを使うとうまくいくというのが判りました。

上記の対応も含めてきちんと対応したら、レイトバインドでなくても上手く行ったりしませんか?
#既に試されていたらごめんなさい。


■50811 (VBねっと さん) に返信
> すみません。 VB.netにもQuitの後に9秒タイマーを入れていました。
> VBSも9秒にしたら10/10回はOKでした。
> タイマーでなく、もっと確実に開放する方法にしたいのですが、どなたか
> 良いアイデアがありませんか?

VBSやVB.NETで9秒の待ちを入れなくても、単にその程度の時間待ってExcelのプロセスを確認したら終了していませんか?

Quitするといきなりプロセスが消えるわけでなく、Excelが終了処理をしていると思いますので、
純粋にExcelの終了にかかる時間だったりしないか?ということです。

引用返信 編集キー/
■50813 / inTopicNo.12)  Re[10]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ 渋木宏明(ひどり) (1365回)-(2010/06/18(Fri) 15:29:55)
渋木宏明(ひどり) さんの Web サイト
> タイマーでなく、もっと確実に開放する方法にしたいのですが、どなたか
> 良いアイデアがありませんか?

COM オブジェクト参照の解放漏れを撤廃するのが正道です。

それでもどーにもならない場合

・少しだけメッセージポンプを回してみる
・GC.Collect() してみる

なんて対処療法も考えられますが、所詮、これらの方法では抜本的な解決は得られません。(=コードを変更したらまた症状がぶり返すなど)

引用返信 編集キー/
■50818 / inTopicNo.13)  Re[10]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (7回)-(2010/06/18(Fri) 17:29:30)
No50812 (よねKEN さん) に返信
> 上記の対応も含めてきちんと対応したら、レイトバインドでなくても上手く行ったりしませんか?
> #既に試されていたらごめんなさい。
 いろいろやったんですが。。。 最終的にはタイマーで消えました。
 ただ、タイマーでは不安です。
 COM オブジェクト参照の解放漏れを無くすのがポイントと思いますが、前回の「改善VB.net
 (今のターゲット環境ではExcelは残らない)」コードを見る限り、どこに漏れがあるかが判
 りません。

 現在判っているのは、
 @Save・SaveAsメソッドを使わないと残らない
 ASave・SaveAsメソッドを使っても、QuitとReleaseComObject(oExcel)間に9秒タイマーを
  入れると残らない。 但し、2〜5秒では不十分でした。(残ります)


 保存作業(Save・SaveAs)を行うとQuit後のExcel終了に時間が掛かり、その間にReleaseCom
 Object(oExcel)しても、この開放は無視されるということはないですか?
 つまり、Excelのインスタンスが消滅したのを確認してReleaseComObject(oExcel)しなけれ
 ばならないということはないですか?


> Quitするといきなりプロセスが消えるわけでなく、Excelが終了処理をしていると思いますので、
> 純粋にExcelの終了にかかる時間だったりしないか?ということです。

  タイマーを入れないと20秒待っても残っています。 しかし、9秒タイマーを入れると9秒
 近くでExcelはプロセスから消えます。

引用返信 編集キー/
■50853 / inTopicNo.14)  Re[9]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ 魔界の仮面弁士 (1677回)-(2010/06/20(Sun) 13:30:21)
No50809 (VBねっと さん) に返信
> VBSがうまくいかないのが気にかかります。
下位のオブジェクトから解放していない点が気にかかります。

> 下記のようにQuitの後にSleep 5000を追加すると9/10回はうまくいきます。
Excel 2003 環境があったので試してみましたが、当方環境では、
Sleep の無い下記のコードであっても、常に正しく解放されています。

Option Explicit
Dim oExcel
Dim oBooks
Dim oBook
Dim oSheets
Dim oSheet
Dim oRange

Set oExcel = WScript.CreateObject("Excel.Application")
oExcel.Visible = True
Set oBooks = oExcel.Workbooks
Set oBook = oBooks.Add()
Set oSheets= oBook.Sheets
Set oSheet = oSheets(1)
Set oRange = oSheet.Range("A1")
oRange.Value = "hoge"
Set oRange = Nothing
Set oSheet = Nothing
Set oSheets = Nothing

oExcel.DisplayAlerts = False
oBook.SaveAs("c:\Book1.xls")

oBook.Close
Set oBook = Nothing
Set oBooks = Nothing

oExcel.Quit
Set oExcel = Nothing

MsgBox "Excelのプロセスを確認してください。"
引用返信 編集キー/
■50880 / inTopicNo.15)  Re[10]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (8回)-(2010/06/21(Mon) 16:15:35)
No50853 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん、確認ありがとうございました。

> Excel 2003 環境があったので試してみましたが、当方環境では、
> Sleep の無い下記のコードであっても、常に正しく解放されています。
→書込まれていたコードを実行してみましたが、こちらでは、だめでした。
 タイマーが必要なこと自体もおかしいですが、その値が9secは最低
 必要なのもの疑問が出ます。

 ひょっとしたら、Excel2003かWinXpがおかしくなっているのかもしれま
 せん。 ターゲットマシンには色々ソフトが入っているため、同じ環境
 を再構築するのに少し時間がかかりますが、再インストした後、再度、
 書き込まれていたVBSコードを実行して確認してみます。
引用返信 編集キー/
■51113 / inTopicNo.16)  Re[11]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ VBねっと (9回)-(2010/06/25(Fri) 12:26:14)
ご教授頂いた皆さんありがとうございました。
Windowsの再インストールで解決しました。

*Excelの再インストールでは解決できませんでした。
Windowsが一部壊れていたみたいです。
エクスプローラやExcel単体で使う分には問題なかった
ので気がつきませんでした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -