タイトル : 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 である以上、この処理には意味がないと思います。 |