タイトル : Re: Cells.FindNextのループ中の解放 投稿日 : 2009/09/16(Wed) 12:05 投稿者 : 魔界の仮面弁士
> 1: Dim myFindNext As Excel.Range = xlCells.FindNext(myRng) > 2: MRComObject(myRng) > 3: myRng = myFindNext > 4: MRComObject(myFindNext) '←これを入れると、 > 'myFindNextとmyRngの両方が > '使えなくなります。。。 > 5: MsgBox(myRng.Value) 一行ずつ順に見ていくと、使えなくなる理由が分かるかと思います。 myRng に、COMオブジェクト1 がセットされているとすると… > 1: Dim myFindNext As Excel.Range = xlCells.FindNext(myRng) → myFindNext に オブジェクト2 をセット > 2: MRComObject(myRng) → オブジェクト1を破棄する (myRng の参照先が使えなくなる) > 3: myRng = myFindNext → myRng に オブジェクト2 をセット (myRng と myFindNext が、共に同じオブジェクトを参照した状態となる) > 4: MRComObject(myFindNext) '←これを入れると、 > 'myFindNextとmyRngの両方が > '使えなくなります。。。 → オブジェクト2を破棄する (myRng と myFindNext の両方の参照先が使えなくなる) > 5: MsgBox(myRng.Value) → オブジェクト2は破棄されているので、使えない という流れで処理される事になります。 破棄するべきは、以前に参照していたオブジェクト1だけであって、 オブジェクト2の方は、次回のループ先頭にある 「Dim myFindNext As Excel.Range = xlCells.FindNext(myRng)」 のタイミングまで保持し続けておかなければなりません。 > Dim 最初セル As String = myRng.Address > ですが、エクセルのオブジェクトブラウザからRangeクラスAddressメンバの型を調べると、 > 本来は > Dim 最初セル As Excel.XlReferenceStyle = myRng.Address > になるはずだと思うのですが、 いえ、違います。 Range.Address のプロパティ定義は、Excel のバージョンによっても異なりますが、 少なくとも Excel 97 以降では、その戻り値は String 型と定められています。 XlReferenceStyle を使うとしても、それは、 Dim s As String = rng.Address(False, True, Excel.XlReferenceStyle.xlR1C1) のように、省略可能な引数の一つとして指定するのみです。 |