Excel:Rangeについて

タグの編集
投稿者 ゆぅ  (社会人) 投稿日時 2009/8/11 22:01:32
Rangeメソッドについて質問です。
VB2005で開発しています。

Rangeの範囲指定方法が間違っているのか最後のセルの値だけ取得できません。

---------------
Dim symbol As Excel.Range = Nothing
Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
symbol = xlSheet.Range("B13:CR13").Find(key)
---------------

keyはFor Eachで廻していて、B13~CR13までのセルはいくつかに結合されています。
CR13より前までのセルのsymbolは取得できています。
なのにCR13だけsymbolがNothingになります。

ただ、symbol = xlSheet.Range("B13:CR13").Find(key)で止めて
ウォッチウインドでxlSheet.Range("CR13").ROWとすると欲しい値が取れています。

どうして最後だけ取得できないのでしょうか?
最後のCR13のsymbolを取得するにはどうしたらよいのでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/8/11 22:16:49
> keyはFor Eachで廻していて、B13~CR13までのセルはいくつかに結合されています。
B13:CR13 というと、13行目の第2列~第96列目に相当しますね。

しかし提示されたコードには、For Each の記述が無いようですが、
実際のコードは、どのようになっているのでしょうか?

> CR13より前までのセルのsymbolは取得できています。
> なのにCR13だけsymbolがNothingになります。
こちらでは再現できませんでした。現象をこちらで追試できるよう、
セルがどのように結合されていて、どのようなデータが入力されていたのか、
また、Find に指定した key の中身が何であるのかを示して頂けないでしょうか。


なお、個々のオブジェクトは、Marshal.ReleaseComObject メソッドを用いて、
使用後に後始末する必要があります。そのため、
Dim symbol As Excel.Range = Nothing
Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
Dim baseRange As Excel.Range = xlSheet.Range("B13:CR13")
For Each key In データ
  symbol = baseRange.Find(key)
  'symbol に対する処理 
  Marshal.ReleaseComObject(symbol)
Next
Marshal.ReleaseComObject(baseRange)

のように、個々の Range オブジェクトを変数に受け、それぞれを解放させるようにしてください。
直接「xlSheet.Range("B13:CR13").Find(~)」のように記述してしまうと、中継役となった
B13:CR13 の Range オブジェクトを、明示的に解放させる事ができなくなってしまいます。