tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: Excelのシートをコピーしたときのセルの表示書式
投稿日: 2008/01/24(Thu) 10:18
投稿者魔界の仮面弁士
# 本題以外の部分に反応。

> Do
>    I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
> Loop Until I <= 0
VB2005 なのですよね?
強制解放が必要なら、FinalReleaseComObject を使った方が良いですよ。

ただ、通常は 1 回だけ呼び出せば良く、連続して解放する必要は無いはずです。
まして、常に(無条件に)最後まで解放してしまうのは、問題があるかと思います。

ReleaseComObject を複数回呼び出すのは、参照カウントが意図せず増加している場合など、
あくまで、限定条件下に限るようにしてください。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200512/05120042.txt

最後まで強制的に解放すると、他の場所で参照しているオブジェクトまでも対象となるため
必要な解放までもが解放(オーバーリリース)されてしまい、弊害がでる事があります。

たとえば、呼び出し元の Button1_Click 側を修正して、
    Dim o As Excel.Worksheet = xlInBook.ActiveSheet
    TextBox1.Text = o.Name
    Call CE_ExcelSheetCopy(xlInBook, 1, i, False)
    TextBox2.Text = o.Name
のように書いた場合、CE_ExcelSheetCopy 内で強制解放を行っているが故に、
オーバーリリースにより、呼び出し元の変数 o の参照先まで解放されてしまい、
TextBox2.Text = o.Name の処理が失敗(InvalidComObjectException)することになります。

また、現コードのままでも、CE_ExcelSheetCopy(xlInBook, 1, 1, False) という
「xlSheetMoto と xlSheetIchi が同じシートを表していた場合」において、
   COM_MRComObject(xlSheetMoto)  '参照カウントが、2 から 0 になる
   COM_MRComObject(xlSheetIchi)  '参照カウントが、0 から -1 になる
という、オーバーリリースが実際に発生しています。

もし、解放処理を 1 回だけに留めておけば、両者が同じシートであった場合も
   COM_MRComObject(xlSheetMoto)  '参照カウントが、2 から 1 になる
   COM_MRComObject(xlSheetIchi)  '参照カウントが、1 から 0 になる
という動作になるので、このような問題は出ません。


> Finally
>     objCom = Nothing
> End Try
引数 objCom が ByVal である以上、この処理には意味がないと思います。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。