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

タイトル 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)
のように、省略可能な引数の一つとして指定するのみです。

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

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