tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルすいません。またタスクエラーです(^^;)
記事No1070
投稿日: 2004/09/06(Mon) 15:33
投稿者クーガ
[OSのVer]:Windows XP   [VBのVer]:VB.NET   2003

フォーマットは直ったのですが、
先ほどまでは、タスクにエクセルが残らなかったのですが、
また動かしてみると、タスクにエラーが残るようになりました。
前のと同じコードなのですが、なぜこんな現象がおきるのかがわかりません。
すいません。ご教授ください

Dim FileSaveName As String ''ファイル名取得
Dim dlg_FileSave As DialogResult
Dim preCursor As Cursor = Cursor.Current
Dim sr As IO.StreamWriter
Dim linetext As String

'ファイルに格納

''エクセルインスタンス格納
Dim xlApp As Excel.Application = Nothing
''エクセルブック格納
Dim xlBook As Excel.Workbook = Nothing
''エクセルシート格納
Dim xlSheet As Excel.Worksheet = Nothing

Dim xlCell As Object

xlApp = CreateObject("Excel.Application")

'空白の新しいブックを追加
xlBook = xlApp.Workbooks.Add
'新しいシートを追加
xlSheet = xlBook.Worksheets(1)
xlSheet.Name = "売上指示"
xlCell = xlSheet.Cell

'ファイル名を指定して保存

SaveFileDialog1.Filter = "Excel(*.xls)|*.xls"
dlg_FileSave = SaveFileDialog1.ShowDialog
SaveFileDialog1.RestoreDirectory = False

If dlg_FileSave = DialogResult.Cancel Then

Exit Sub

End If

FileSaveName = SaveFileDialog1.FileName
sr = New IO.StreamWriter(FileSaveName, False, System.Text.Encoding.GetEncoding("Shift-
JIS"))

' 表示項目

xlsheet(1,1) = "aaa"

' Excelを終了

xlBook.Close(False)
If Not xlSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
xlSheet = Nothing
End If
'xlSheet = Nothing
'GC.Collect()

If Not xlBook Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
xlBook = Nothing
End If
'xlBook = Nothing
'GC.Collect()

If Not xlApp Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
End If
'GC.Collect()
'xlApp = Nothing
GC.Collect()
sr.Close()

' カーソルを元に戻す
Cursor.Current = preCursor

[ツリー表示へ]
タイトルRe: すいません。またタスクエラーです(^^;)
記事No1071
投稿日: 2004/09/06(Mon) 15:38
投稿者花ちゃん
> xlsheet(1,1) = "aaa"

よく調べてから投稿しましょう。

[ツリー表示へ]
タイトルRe^2: すいません。またタスクエラーです(^^;)
記事No1072
投稿日: 2004/09/06(Mon) 15:48
投稿者クーガ
[OSのVer]:Windows    [VBのVer]:VB.NET  
> > xlsheet(1,1) = "aaa"
>
> よく調べてから投稿しましょう。

すいません。↓です
xlcell(1,1) = "aaa"です

[ツリー表示へ]
タイトルRe^3: すいません。またタスクエラーです(^^;)
記事No1073
投稿日: 2004/09/06(Mon) 16:04
投稿者クーガ
[OSのVer]:Windows    [VBのVer]:VB.NET  
> [OSのVer]:Windows    [VBのVer]:VB.NET  
> > > xlsheet(1,1) = "aaa"
> >
> > よく調べてから投稿しましょう。
>
> すいません。↓です
> xlcell(1,1) = "aaa"です
cellではなく、rangeを使うといいわけですね

[ツリー表示へ]
タイトルRe^4: すいません。またタスクエラーです(^^;)
記事No1074
投稿日: 2004/09/06(Mon) 16:25
投稿者クーガ
[OSのVer]:Windows    [VBのVer]:VB.NET  


ループを回すと駄目なのでしょうか?
項目名を設定するだけなら消えてくれるのですが

''エクセルインスタンス格納
Dim xlApp As Excel.Application = Nothing
''エクセルブック格納
Dim xlBook As Excel.Workbook = Nothing
''エクセルシート格納
Dim xlSheet As Excel.Worksheet = Nothing
Dim xlCulomn As Object
Dim xlCell As Object

xlApp = CreateObject("Excel.Application")

'空白の新しいブックを追加
xlBook = xlApp.Workbooks.Add
'新しいシートを追加
xlSheet = xlBook.Worksheets(1)
xlSheet.Name = "売上指示"
Dim rw As Datarow

Dim a As Integer
Dim i As Integer = BindingContext(DataGrid_1.DataSource, DataGrid.DataMember).Count

xlSheet.Range("A1").Value = "タイトル名"
For a = 0 To i
rw = DataSet.DataTable.Rows(int_roop1)
xlSheet.Range("A" & a + 2).Value = rw.Item("項目名")
Next

ループを回すと消えないのでしょうか?

[ツリー表示へ]
タイトルRe: すいません。またタスクエラーです(^^;)
記事No1075
投稿日: 2004/09/06(Mon) 16:33
投稿者魔界の仮面弁士
> xlBook = xlApp.Workbooks.Add
残る原因・その1。
Workbooksコレクションも変数にとっておき、
最後にReleaseComObjectする必要があります。

> xlSheet = xlBook.Worksheets(1)
残る原因・その2。
Worksheetsコレクションも変数にとっておき、
最後にReleaseComObjectする必要があります。

> xlsheet(1,1) = "aaa"
残る原因・その3。No.1000 のログを参照してみてください。
hhttp://www.bcap.co.jp/hanafusa/bbs/wforum.cgi?mode=allread&no=997#1000

[ツリー表示へ]
タイトルRe^2: すいません。またタスクエラーです(^^;)
記事No1076
投稿日: 2004/09/06(Mon) 16:52
投稿者クーガ
[OSのVer]:Windows    [VBのVer]:VB.NET  
> > xlBook = xlApp.Workbooks.Add
> 残る原因・その1。
> Workbooksコレクションも変数にとっておき、
> 最後にReleaseComObjectする必要があります。
>
> > xlSheet = xlBook.Worksheets(1)
> 残る原因・その2。
> Worksheetsコレクションも変数にとっておき、
> 最後にReleaseComObjectする必要があります。

If Not xlBook Is Nothing Then
   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
   xlBook = Nothing
End If

のことでしょうか?これはしています。

>
> > xlsheet(1,1) = "aaa"
> 残る原因・その3。No.1000 のログを参照してみてください。
> hhttp://www.bcap.co.jp/hanafusa/bbs/wforum.cgi?mode=allread&no=997#1000

これは、Cellを使わないで、Rangeを使用したほうがいいということですか?

[ツリー表示へ]
タイトルRe^3: すいません。またタスクエラーです(^^;)
記事No1077
投稿日: 2004/09/06(Mon) 18:59
投稿者花ちゃん
> これは、Cellを使わないで、Rangeを使用したほうがいいということですか?

VB6.0 でも基本的に同じです。

ここのExcel&Word関係の下記をよく読んで下さい。
hhttp://www.bcap.co.jp/hanafusa/VBHLP/ExcelErr.htm

又、.NET のTips一覧にもExcel関係がありますので合わせて参考にして下さい。

[ツリー表示へ]
タイトルRe^3: すいません。またタスクエラーです(^^;)
記事No1082
投稿日: 2004/09/14(Tue) 10:05
投稿者魔界の仮面弁士
> > > xlBook = xlApp.Workbooks.Add
> > Workbooksコレクションも変数にとっておき、
> > 最後にReleaseComObjectする必要があります。

> > > xlSheet = xlBook.Worksheets(1)
> > Worksheetsコレクションも変数にとっておき、
> > 最後にReleaseComObjectする必要があります。
>
>    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
> のことでしょうか?これはしています。

いえ、そういう事では無いのです。

確かに、最後の Marshal.ReleaseComObject() の呼び出しは必須なのですが、
クーガさんが解放しているのは「Workbookオブジェクト」ですよね。
それに対して、私が書いたのは「Workbooksオブジェクト」となります。
(名前は良く似ていますけどね)

もちろん、クーガさんが書かれていますように、Workbook も解放する必要があるのですが、
それに加えて、一時的に参照された Workbooks というコレクションオブジェクトについても
解放しなければならない、という事です。

つまり、この場合には、
  xlBook = xlApp.Workbooks.Add
とするのではなく、
  xlBooks = xlApp.Workbooks
  xlBook = xlBooks.Add()
などのようにして、個々のCOMオブジェクトを変数に保持しておき、最後に、
この2つの変数を Marshal.ReleaseComObject() するという手順が必要なのです。
そしてこれは、その他のコレクション(Worksheets等)についても同様です。

# なお、COM側にとってみれば、.NETの変数がNothingされたかどうかは、あまり関係ありません。
# Marshal.ReleaseComObject さえ確実に行われれば、Nothingの代入やガベージコレクトが
# 行われなくても、(COM側が使用していた分の)メモリは解放されるはずです。


> これは、Cellを使わないで、Rangeを使用したほうがいいということですか?
Cellsプロパティは、Rangeオブジェクトを返します。
そしてこれも、上記の「コレクションの解放」の話と、同様の内容なのです。

たとえば、
  xlSheet1.Cells(1, 1)
というのは、
  xlSheet1.Cells._Default(1, 1)
を省略した書き方と言えます。

Cellsプロパティ自体は、実際には「全てのセルを含むRangeオブジェクト」を返します。
そして、Rangeオブジェクトの規定のプロパティ(_Defaultプロパティ)によって、
また別のRangeオブジェクトが返されるようになっています。

いずれのRangeオブジェクトも、(.NETのクラスではなく)COMのオブジェクトですから、
最後には Marshal.ReleaseComObject() が必要とされます。という事は、先の話と同様で、
途中のRangeオブジェクトも変数にとっておき、最後には解放してやらねばならないのです。

つまり、Cellsプロパティを使った
  xlRange = objsheet.Cells(1, 1)
というコードがあったとしたら、これを
  xlRange1 = xlSheet1.Cells
  xlRange2 = xlRange1(1, 1)    'または、「xlRange2 = xlRange1._Default(1, 1)」
のように修正して、最後にこの xlRange1, xlRange2 を解放させれば良い事になります。

[ツリー表示へ]