tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2005でのExcel遅延バインディング
記事No8016
投稿日: 2008/08/26(Tue) 16:38
投稿者はるの
いつもこちらのサイト参考にさせていただいてます。

現在タイトル通りVB2005よりExcelを遅延バインディングで操作しているのですが、
(Excel2002/2003/2007に対応するため)
こちらのサイトのExcel操作のコードを参考にして作っています。

その中でセルへの記入例として

Dim xlCells As Excel.Range
Dim xlRange1 As Excel.Range
xlCells = xlSheet.Cells
xlRange1 = DirectCast(xlCells(5, 3), Excel.Range)

というTipsがありますが、このDirectCastは遅延バインディングの場合も必要でしょうか?

その場合
Dim xlCells As Object
Dim xlRange1 As Object
xlCells = xlSheet.Cells
xlRange1 = DirectCast(xlCells(5, 3), Object)

となり、Object型をObject型に変換するだけなので不要だと思うのですが、
間違っているでしょうか?

他のサイトでも
Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)
のようにDirectCastを行っているコードを見つけました。

DirectCastを行うのは事前バインディングを行っている場合と理解しているのですが、
その理解が間違っているか合っているのか確認したく投稿しました。

ご指摘お願いします。

[ツリー表示へ]
タイトルRe: VB2005でのExcel遅延バインディング
記事No8019
投稿日: 2008/08/26(Tue) 19:52
投稿者魔界の仮面弁士
> このDirectCastは遅延バインディングの場合も必要でしょうか?
いいえ。その場合はキャスト不要です。

> Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)
> のようにDirectCastを行っているコードを見つけました。
遅延バインディングならばキャストは不要です。が、そのコードは
遅延バインディングのものではありませんので、必要になってくるのでしょう。

xlSheets(1) は、「Sheet 型」でしょうから、もしも「Worksheet 型」にしたいなら
そこに書かれているとおり、キャストが必要になるかと思います。

> DirectCastを行うのは事前バインディングを行っている場合と理解しているのですが、
おおよそ正解だと思います。

ただし、事前バインディングであっても、必ずしも DirectCast が必須というわけでは
ありませんし、遅延バインディングであっても、キャストが必要な場合はありえます。

[ツリー表示へ]
タイトルRe^2: VB2005でのExcel遅延バインディング
記事No8021
投稿日: 2008/08/26(Tue) 21:17
投稿者はるの
返答ありがとうございます。
おおよそ正解ということでほっとしました。

> ただし、事前バインディングであっても、必ずしも DirectCast が必須というわけでは
> ありませんし、遅延バインディングであっても、キャストが必要な場合はありえます。

それはExcelメソッド実行後の戻り値がObject型以外で戻ってくることがあるということでしょうか?

関連して解放についても質問ですが、セルコピーする場合、

Dim xlRange as Object
xlRange = xlSheet.Range("A1")
xlRange.Copy
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)

とすれば解放は問題なくされるのでしょうか?
それとも

Dim xlCopyRange As Object = xlRange.Copy

などとし、xlCopyRangeというCopyの戻り値の解放も行うべきですか?

またその際に
Dim xlCopyRange As Object = DirectCast(xlRange.Copy,Object)
とCastする必要があるのでしょうか?

[ツリー表示へ]
タイトルRe^3: VB2005でのExcel遅延バインディング
記事No8022
投稿日: 2008/08/26(Tue) 22:11
投稿者はるの
すみません、自分でVBAのオブジェクトブラウザを見直していて気づいたのですが、
Exce2003の場合、Copyメソッドには戻り値がありません。
よって下記の
> Dim xlCopyRange As Object = xlRange.Copy
は不要ですよね?

代わりに
WorkSheets.Add
などはObject型を返すので、事前バインディングの場合はDirectCastが必要となってくるということですよね。
遅延バインディングの場合は特に必要なし、と。

ただし、使用するメソッドが戻り値を戻すか戻さないかを、対応する3つのExcelのバージョンすべてで確認する必要はあるとは思います。

以上の結論ですが、間違いがありましたらどうかご指摘お願いします。

[ツリー表示へ]