タイトル | : Re: Cells.FindNextのループ中の解放 |
記事No | : 9404 |
投稿日 | : 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) のように、省略可能な引数の一つとして指定するのみです。
|