tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルvb.netからExcel2002を操作すると
記事No3772
投稿日: 2006/05/31(Wed) 17:23
投稿者まる
まると申します。宜しくお願いします。

[OS]:Xp Pro [Excel]:2002 [VB]:VB.NET2002

VBからExcelを起動し、Excel帳票を作成しているのですが、300行前後で「リソース不足です」と言われ
データの貼付が出来ないのですが、このリソースって何なんでしょう?
ExcelはVB側から罫線や幅等も全て指定しております。

VB6+Excel2000ではこのようなことはなかったのですが?

ExcelApp = CreateObject("Excel.Application")
ExcelBook = Excelapp.Workbooks.add
ExcelSheet1 = ExcelApp.Worksheets(1)

With Excelsheet1.range(Excelsheet1.cells(1,1)Excelsheet1.cells(1,10))
.borders(xlEdgeLeft).Weight = xlHairline
.borders(xlEdgeLeft).LineStyle = xlContinuous
      ・
End With

'SQL文(略)

do until objRec.Eof
with Excelsheet1
      .range(.cells(prow,5),.cell(prow,17)).select()
      with Excelapp.selection.font
           .name = "MS ゴシック"
           .size = 9
      end with
      .application.cells(prow,2).value= objFlds("AA").value()
      〜
end with
prow +=1
objrec.Movenext
loop

system.GC.Collect()

try
system.runtime.interopservices.marshal.relesecomobject(Excelsheet1)
catch
finally
Excelsheet1 = nothing
end try

と言う感じなのですが。
このような事象に経験はありませんでしょうか?



[ツリー表示へ]
タイトルRe: vb.netからExcel2002を操作すると
記事No3773
投稿日: 2006/05/31(Wed) 18:17
投稿者花ちゃん
VB.NET の場合、VB6.0 と違ってCOMオブジェクトの解放してやらないとそのように
なります。

そもそも、そのコードでは、Excel のプロセスが残ったままになっているはず。

ここのExcel関係をよくご覧下さい。(本当は質問する前に見てほしかった。(^_^;))

[ツリー表示へ]
タイトルRe^2: vb.netからExcel2002を操作すると
記事No3774
投稿日: 2006/05/31(Wed) 19:23
投稿者魔界の仮面弁士
> VB.NET の場合、VB6.0 と違ってCOMオブジェクトの解放してやらないとそのように
> なります。
> そもそも、そのコードでは、Excel のプロセスが残ったままになっているはず。

ADO も使っているようなので、Recordset の解放も必要かも。
hhttp://support.microsoft.com/kb/321415/ja

[ツリー表示へ]
タイトルRe^3: vb.netからExcel2002を操作すると
記事No3778
投稿日: 2006/06/01(Thu) 09:39
投稿者まる
魔界の仮面弁士さん、コメントありがとうございます。

> > VB.NET の場合、VB6.0 と違ってCOMオブジェクトの解放してやらないとそのように
> > なります。
> > そもそも、そのコードでは、Excel のプロセスが残ったままになっているはず。
>
> ADO も使っているようなので、Recordset の解放も必要かも。
> hhttp://support.microsoft.com/kb/321415/ja
→ありがとうございました。

[ツリー表示へ]
タイトルRe^2: vb.netからExcel2002を操作すると
記事No3777
投稿日: 2006/06/01(Thu) 09:37
投稿者まる
花ちゃんさん、お世話になります。

> VB.NET の場合、VB6.0 と違ってCOMオブジェクトの解放してやらないとそのように
> なります。
→やはりこの辺りですか?
 なんとなくそうではないかと思っては居たのですが・・・

>
> そもそも、そのコードでは、Excel のプロセスが残ったままになっているはず。
→プロセスは、消えています。
 が、きっと解放できていないものが、メモリ内に残ったままになっているということですね。

> ここのExcel関係をよくご覧下さい。(本当は質問する前に見てほしかった。(^_^;))
→一応見させては頂いたのですが、確信がありませんでした。
 
 COMの解放が原因となると、参照したもの全てを解放の対象と考えればいいのですね。
 取りあえず、やってみます。
 ありがとうございました。

[ツリー表示へ]
タイトルRe^2: vb.netからExcel2002を操作すると
記事No3786
投稿日: 2006/06/02(Fri) 20:21
投稿者まる
お世話になります。

> VB.NET の場合、VB6.0 と違ってCOMオブジェクトの解放してやらないとそのように
> なります。
>
> そもそも、そのコードでは、Excel のプロセスが残ったままになっているはず。
>
> ここのExcel関係をよくご覧下さい。(本当は質問する前に見てほしかった。(^_^;))
ちょっと確認なんですが、createobjectでExcelを起動した場合も、COMの開放が必要なんでしょうか?
他の回答等を見ると、Dim xlApp As New Excel.Application()で定義した例しかないようなので
念のため確認させてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: vb.netからExcel2002を操作すると
記事No3787
投稿日: 2006/06/02(Fri) 20:59
投稿者花ちゃん
ここのExcel関係をよくご覧下さい。(本当は質問する前に見てほしかった。(^_^;))

と最初の回答にも書いていたかと思うのですが、見ていないのですか?

http://www.bcap.co.jp/hanafusa/dotnet/index.html
Excel・Word・他(30)
   ↓
Excelのプロセスが正常に終了しない理由
NETからExcelの基本的な操作方法
Excelのセルへのデータ入力例色々(Marshal.ReleaseComObject() を実行)
http://support.microsoft.com/default.aspx?scid=kb;ja;317109
http://www.users.gr.jp/blogs/hidori/archive/2004/01/26/916.aspx

上記にもかいてあったと思うのですが、どのように起動したかが問題ではなく
オブジェクトを返すプロパティ等を使用した場合、Marshal.ReleaseComObject() を
実行し、オブジェクトインスタンスの解放を行う必要があります。

上記解放処理をしないとExcelのプロセスが終了せず、タスクに残ったままになります。
前回残っていないとおっしゃていたがそれは、確認の仕方が間違っていたかと思いますよ。

[ツリー表示へ]