tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルExcelシートのCopyメソッド使用時にプロセスを解放するには
記事No13519
投稿日: 2009/03/18(Wed) 14:58
投稿者kaw
お世話になっております。kawと申します。

VB6での、Excelのプロセスが残る現象についてです。
(※Excelのプロセス解放に関する質問が頻出であることは承知しており、
既出等が無いか、可能な限り調査いたしましたが、解決に至っておりません。)

【現象】
VB6で、WorksheetオブジェクトのCopy()メソッドを呼び出した場合にのみ、
Excelのプロセスが残る現象が発生しております。
プロセスが残らないようにする方法を教えてください。

【環境】
Windows XP
Excel 2000
VisualBasic 6.0

【再現コード】
下記に、現象の再現が可能なミニマムコードを記載いたします。
---------------------------------------------------------------------
Option Explicit

Public Sub Main()
    Dim xlApp As New Excel.Application
    
    xlApp.Visible = True
    
    Dim xlBook As Excel.Workbook
    Set xlBook = xlApp.Workbooks.Open("D:\hoge.xls")
    
    Dim xlSheets As Excel.Sheets
    Set xlSheets = xlBook.Worksheets
    Dim xlSheet As Excel.Worksheet
    Set xlSheet = xlSheets.Item(1)
    
    '↓この行をコメントアウトするとプロセスは残らない
    Call xlSheet.Copy(Before:=xlSheet)
    
    Call xlBook.Save
    
    Set xlSheets = Nothing
    Set xlSheet = Nothing '---【A】
    Call xlBook.Close: Set xlBook = Nothing
    Call xlApp.Quit: Set xlApp = Nothing
End Sub
-------------------------------------------------------------------------

よろしくお願い致します。

【備考】
VB.NETにおいて、WorksheetオブジェクトのCopyを使用した場合は、
参照カウントが2になるので、解放を2度行う、という旨の解決方法がありました。(下記URL)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32241&forum=7

そこで、この方法を参考にし、
【A】を2行記述したコードを実行しましたが、プロセスは残ったままでした。

[ツリー表示へ]
タイトルRe: ExcelシートのCopyメソッド使用時にプロセスを解放するには
記事No13520
投稿日: 2009/03/18(Wed) 15:54
投稿者花ちゃん
>     '↓この行をコメントアウトするとプロセスは残らない
>     Call xlSheet.Copy(Before:=xlSheet)

xlSheet は、Excelの下部のシートのタブに存在しないでしょう。
Sheet1 を指定してあげないと。

下記では。
Call xlSheet.Copy(Before:=xlSheets.Item(1))

# 失礼しました、上記の部分はどちらのコードでも問題ないようです。

[ツリー表示へ]
タイトル提示された方法でも解決しませんでした。
記事No13521
投稿日: 2009/03/18(Wed) 16:23
投稿者kaw
花ちゃん様

いつもお世話になっております。
ご回答いただきありがとうございます。

提示いただいたとおりに、

> Call xlSheet.Copy(Before:=xlSheet)

> Call xlSheet.Copy(Before:=xlSheets.Item(1))

と修正したコードを実行しましたが、プロセスは残ったままでした。

明記されていませんが、花ちゃん様の環境では、上記の修正コードで
プロセスが残らなかった、という認識でよろしいでしょうか。

ということは、当方の環境にも要因があるということになりますね。

[ツリー表示へ]
タイトルRe: 提示された方法でも解決しませんでした。
記事No13522
投稿日: 2009/03/18(Wed) 18:18
投稿者花ちゃん
失礼しました、今試してみたら、最初に投稿されたコードでもプロセスは
残らないですね。

Book に問題があるかも知れませんね、新規のBookでテストして見ても残るか確認
して見て下さい。
念のため下記は順番を逆にしておいて下さい。

    Set xlSheets = Nothing
    Set xlSheet = Nothing '---【A】


# 投稿されたコードと実際に使っておられるコードが違うと言う事はありませんか?
 投稿されたコードで試してみて下さいね。

[ツリー表示へ]
タイトルRe^2: 提示された方法でも解決しませんでした。
記事No13523
投稿日: 2009/03/18(Wed) 19:18
投稿者kaw
> 失礼しました、今試してみたら、最初に投稿されたコードでもプロセスは
> 残らないですね。

了解しました。確認いただきありがとうございます。

下記の、花ちゃん様に指摘いただいた3点、
確認できしだい、結果を報告させていただきます。

・違うコードを実行している可能性
・ブック(hoge.xls)に原因がある可能性
・Nothingのセットの順序に問題がある可能性

[ツリー表示へ]
タイトル検証結果 報告(未解決)
記事No13532
投稿日: 2009/03/25(Wed) 09:41
投稿者kaw
kawです。
遅くなりましたが、検証結果をご報告させていただきます。

結論からいいますと、原因は依然として不明です。
ただし、私の環境固有のものと推測されます。

まず、指摘のあった3点は、修正確認を行いましたが、どれも解決には至りませんでした。
> ・違うコードを実行している可能性
> ・ブック(hoge.xls)に原因がある可能性
> ・Nothingのセットの順序に問題がある可能性

その後、ソースをexe化し、社内の別の端末で実行したところ、現象は再現しませんでした。
(私の端末では再現)

どちらの端末も、環境は下記です。
WinXP SP2
Excel 2000 SP3 9.0.6926

Excelのアドインを解除する、関係のありそうなもの(ExcelViewer)をアンインストールする、
などの方法を試しましたが、解決にいたりませんでした。
Officeの再インストールをすれば、もしかすると解決するかもしれませんが、
手間がかかるし、原因が迷宮入りになってしまうので、最後の手段で考えています。

ひとまずは、運用でカバーさせていただきます。
花ちゃん様、ご協力いただきありがとうございました。

[ツリー表示へ]