C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ExcelのSetSourceDataでプロセスが残ります


(過去ログ 50 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■27194 / inTopicNo.1)  ExcelのSetSourceDataでプロセスが残ります
  
□投稿者/ 欠片 (1回)-(2008/10/30(Thu) 10:42:15)

分類:[VB.NET/VB2005 以降] 

VB2005からレイトバインドによりExcelにデータ出力しているのですが
ChartのSetSourceDataを設定するとプロセスが残ってしまいます。
検索すると暗黙の参照になってしまっているミスが多いようですが
それを考えても私には間違っている所が見つかりません。
どなたか原因がお分かりでしたらお教えいただきたいのですが。


Dim objApp As Object
Dim objBooks As Object
Dim objBook As Object
Dim objSheets As Object
Dim objSheet As Object
Dim objChartObjects As Object
Dim objChartObject As Object
Dim objChart As Object
Dim objRange As Object

objApp = CreateObject("Excel.Application")
objApp.Visible = True

objBooks = objApp.Workbooks
objBook = objBooks.Open(Application.StartupPath & "\" & "TEST.xls")
objSheets = objBook.Worksheets
objSheet = objSheets("TEST")
objSheet.activate()

objChartObjects = objSheet.ChartObjects
objChartObject = objChartObjects(1)
objChart = objChartObject.Chart
objRange = objSheet.Range("A1:B10")

objChart.SetSourceData(Source:=objRange, PlotBy:=2) ← この行を実行するとプロセスが残ります

System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objChart)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objChartObject)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objChartObjects)

objSheet.PrintPreview()

objBook.Close(SaveChanges:=False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheets)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBooks)

objApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp)

引用返信 編集キー/
■27199 / inTopicNo.2)  Re[1]: ExcelのSetSourceDataでプロセスが残ります
□投稿者/ 魔界の仮面弁士 (883回)-(2008/10/30(Thu) 11:27:22)
No27194 (欠片 さん) に返信
> objChart.SetSourceData(Source:=objRange, PlotBy:=2) ← この行を実行するとプロセスが残ります

上記の実行後、objRange の参照カウントが増加しているのかも知れません。
このメソッドを実行後に、
> System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)
の戻り値の値がどうなっているのかを確認してみてください。


.NET からの動作は確認していませんが、Excel VBA 環境で見てみると、このメソッドは
 Sub SetSourceData(Source As Range, Optional PlotBy As Variant)
のような定義になっているようなので、レイトバインドでの呼び出し時において、もしかしたら
Object → Range の型変換が発生し、そこで参照数が増加しているかも……と予想。
引用返信 編集キー/
■27214 / inTopicNo.3)  Re[2]: ExcelのSetSourceDataでプロセスが残ります
□投稿者/ 欠片 (2回)-(2008/10/30(Thu) 14:06:12)
Dim intA As Integer
intA = System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)

としてみたところintAの中身は1でした。
確かに型変換が発生しているのかもしれません。

System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)

と二連続で解放を行うことで無事プロセスが残らないようになりました。
今回の事でReleaseComObjectに戻り値がある事も初めて知りました。
ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -