プロセスの解放ができません。 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 shu  (社会人)
投稿日時
2013/3/18 11:00:14
> xlsCell = xlsheet.Cells
こうしているのだからxlsheet.Cellsではなく以降xlsCellを使用する
xlsCellの解放も行う。
xlsCell.Rowsを1度変数にいれ使い終わったら解放する。
CType(xlsCell(xlsCell.Rows.Count, 1), Range) も同様
CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
xlsheet.Cells(xlRng, 1)
xlsheet.Cells(xlRng, 2)
xlsheet.Cells(xlRng, 3)
xlsheet.Cells(xlRng, 4)
xlsheet.Cells(xlRng, 5)
xlsheet.Cells(xlRng, 6)
xlsheet.Cells(xlRng, 7)
これらも同様
オブジェクトが返ってくるメソッドは単体で呼ぶようにする。
xlsheet.Cells => Rangeオブジェクト
xlsheet.Cells(row, col) => xlsheet.Cells.Item(row,col)と同じ => Rangeオブジェクト
xlsheet.Rows => Rangeオブジェクト
などRangeオブジェクトはそれが持っているメソッドにより新たなRangeオブジェクトが
返ってくるのでそれらをすべて変数で保持し解放する必要があります。
こうしているのだからxlsheet.Cellsではなく以降xlsCellを使用する
xlsCellの解放も行う。
xlsCell.Rowsを1度変数にいれ使い終わったら解放する。
CType(xlsCell(xlsCell.Rows.Count, 1), Range) も同様
CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
xlsheet.Cells(xlRng, 1)
xlsheet.Cells(xlRng, 2)
xlsheet.Cells(xlRng, 3)
xlsheet.Cells(xlRng, 4)
xlsheet.Cells(xlRng, 5)
xlsheet.Cells(xlRng, 6)
xlsheet.Cells(xlRng, 7)
これらも同様
オブジェクトが返ってくるメソッドは単体で呼ぶようにする。
xlsheet.Cells => Rangeオブジェクト
xlsheet.Cells(row, col) => xlsheet.Cells.Item(row,col)と同じ => Rangeオブジェクト
xlsheet.Rows => Rangeオブジェクト
などRangeオブジェクトはそれが持っているメソッドにより新たなRangeオブジェクトが
返ってくるのでそれらをすべて変数で保持し解放する必要があります。
投稿者 さらたん  (社会人)
投稿日時
2013/3/17 16:46:21
>・xlApp.Workbooks
>・xlBook.Worksheets
以下のように書き直してプロセスに残らなくなりましたが、肝心なところが解りません。
やっぱり無理なのでしょうか?
どなたか教えてくださいお願いします。
Dim xlApp As Excel.Application
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Sheets
Dim xlSheet As Excel.Worksheet
xlApp = CreateObject("Excel.Application")
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Open("E:\AAAA.xls")
xlSheets = xlBook.Worksheets
xlSheet = DirectCast(xlSheets(1), Excel.Worksheet)
ここが解りません
On Error Resume Next
xlApp.DisplayAlerts = False
xlBook.SaveAs("E:\AAAA.xls")
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) 'xlSheet の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) 'xlSheets の解放
xlBook.Close() 'xlBook を閉じる
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) 'xlBook の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 'xlApp を解放
>・xlBook.Worksheets
以下のように書き直してプロセスに残らなくなりましたが、肝心なところが解りません。
やっぱり無理なのでしょうか?
どなたか教えてくださいお願いします。
Dim xlApp As Excel.Application
Dim xlBooks As Excel.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Sheets
Dim xlSheet As Excel.Worksheet
xlApp = CreateObject("Excel.Application")
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Open("E:\AAAA.xls")
xlSheets = xlBook.Worksheets
xlSheet = DirectCast(xlSheets(1), Excel.Worksheet)
ここが解りません
On Error Resume Next
xlApp.DisplayAlerts = False
xlBook.SaveAs("E:\AAAA.xls")
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) 'xlSheet の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) 'xlSheets の解放
xlBook.Close() 'xlBook を閉じる
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) 'xlBook の解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 'xlApp を解放
投稿者 さらたん  (社会人)
投稿日時
2013/3/17 11:25:43
YuOさん ありがとうございます
>・xlApp.Workbooks
>・xlBook.Worksheets
>・xlsCell(xlsCell.Rows.Count, 1)
>・CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
>・xlsheet.Cells(xlRng, 1)
>・xlsheet.Cells(xlRng, 2)
>・xlsheet.Cells(xlRng, 3)
>・xlsheet.Cells(xlRng, 4)
>・xlsheet.Cells(xlRng, 5)
>・xlsheet.Cells(xlRng, 6)
>・xlsheet.Cells(xlRng, 7)
>あたりが解放されていないようですが
そうなんですね、もうどうしていいか解らなくなってます。
> また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
>UsedRange使った方がよい場合もあるでしょう。
UsedRangeですね、どうのように書けばいいのでしょう?
すいません 勉強不足でちゃんと理解してないです。
>・xlApp.Workbooks
>・xlBook.Worksheets
>・xlsCell(xlsCell.Rows.Count, 1)
>・CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
>・xlsheet.Cells(xlRng, 1)
>・xlsheet.Cells(xlRng, 2)
>・xlsheet.Cells(xlRng, 3)
>・xlsheet.Cells(xlRng, 4)
>・xlsheet.Cells(xlRng, 5)
>・xlsheet.Cells(xlRng, 6)
>・xlsheet.Cells(xlRng, 7)
>あたりが解放されていないようですが
そうなんですね、もうどうしていいか解らなくなってます。
> また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
>UsedRange使った方がよい場合もあるでしょう。
UsedRangeですね、どうのように書けばいいのでしょう?
すいません 勉強不足でちゃんと理解してないです。
投稿者 さらたん  (社会人)
投稿日時
2013/3/17 11:11:15
bz9さん ありがとうございます
確認して一つづつ確認していかないとダメですね
確認して一つづつ確認していかないとダメですね
投稿者 YuO  (社会人)
投稿日時
2013/3/17 09:26:17
・xlApp.Workbooks
・xlBook.Worksheets
・xlsCell(xlsCell.Rows.Count, 1)
・CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
・xlsheet.Cells(xlRng, 1)
・xlsheet.Cells(xlRng, 2)
・xlsheet.Cells(xlRng, 3)
・xlsheet.Cells(xlRng, 4)
・xlsheet.Cells(xlRng, 5)
・xlsheet.Cells(xlRng, 6)
・xlsheet.Cells(xlRng, 7)
あたりが解放されていないようですが。
> また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
UsedRange使った方がよい場合もあるでしょう。
・xlBook.Worksheets
・xlsCell(xlsCell.Rows.Count, 1)
・CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp)
・xlsheet.Cells(xlRng, 1)
・xlsheet.Cells(xlRng, 2)
・xlsheet.Cells(xlRng, 3)
・xlsheet.Cells(xlRng, 4)
・xlsheet.Cells(xlRng, 5)
・xlsheet.Cells(xlRng, 6)
・xlsheet.Cells(xlRng, 7)
あたりが解放されていないようですが。
> また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
UsedRange使った方がよい場合もあるでしょう。
投稿者 bz9  (中学生)
投稿日時
2013/3/17 07:15:14
> 一応、EXCELに書き込み保存は出来ましたが、プロセスにEXCELが残ってしまいます。
プロセスが解放されないことは、このサイトに有りました
http://homepage1.nifty.com/rucio/main/technique/teq_15.htm
プロセスが解放されないことは、このサイトに有りました
http://homepage1.nifty.com/rucio/main/technique/teq_15.htm
投稿者 さらたん  (社会人)
投稿日時
2013/3/17 01:38:20
はじめまして、始めたばかりの初心者です。
Visual Basic 2010 Expressで作ってます。
EXCELにデータ保存をしようと色々なサイトを見ながら作りました。
一応、EXCELに書き込み保存は出来ましたが、プロセスにEXCELが残ってしまいます。
解放で調べながら色々試しましたがうまくいきません。
どう直せばいいのでしょうか?
どなたか教えてください。
また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlsheet As Excel.Worksheet
Dim xlRng As Integer
Dim xlsCell As Excel.Range
Dim Nob As String
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open("D:\Documents\AAAA.xls")
xlsheet = xlBook.Worksheets(1)
xlsCell = xlsheet.Cells
'使用するデータの最終行を決める()
xlRng = CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp).Row + 1
Nob = CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp).Value
xlsheet.Cells(xlRng, 1).Value = Nob + 1
xlsheet.Cells(xlRng, 2).Value = ComboBox2.Text '年代
xlsheet.Cells(xlRng, 3).Value = ComboBox1.Text '問合せ項目
xlsheet.Cells(xlRng, 4).Value = TextBox1.Text '問合せ内容
If RadioButton1.Checked = True Then
xlsheet.Cells(xlRng, 5).Value = "男性"
ElseIf RadioButton2.Checked = True Then
xlsheet.Cells(xlRng, 5).Value = "女性"
End If
xlsheet.Cells(xlRng, 6).Value = Label8.Text
xlsheet.Cells(xlRng, 7).Value = Label2.Text
On Error Resume Next
xlApp.DisplayAlerts = False
xlsheet.SaveAs("D:\Documents\AAAA.xls")
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRng)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsCell)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
Visual Basic 2010 Expressで作ってます。
EXCELにデータ保存をしようと色々なサイトを見ながら作りました。
一応、EXCELに書き込み保存は出来ましたが、プロセスにEXCELが残ってしまいます。
解放で調べながら色々試しましたがうまくいきません。
どう直せばいいのでしょうか?
どなたか教えてください。
また、【使用するデータの最終行を決める】のあたりの書き方は合っているのでしょうか?
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlsheet As Excel.Worksheet
Dim xlRng As Integer
Dim xlsCell As Excel.Range
Dim Nob As String
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open("D:\Documents\AAAA.xls")
xlsheet = xlBook.Worksheets(1)
xlsCell = xlsheet.Cells
'使用するデータの最終行を決める()
xlRng = CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp).Row + 1
Nob = CType(xlsCell(xlsCell.Rows.Count, 1), Range).End(XlDirection.xlUp).Value
xlsheet.Cells(xlRng, 1).Value = Nob + 1
xlsheet.Cells(xlRng, 2).Value = ComboBox2.Text '年代
xlsheet.Cells(xlRng, 3).Value = ComboBox1.Text '問合せ項目
xlsheet.Cells(xlRng, 4).Value = TextBox1.Text '問合せ内容
If RadioButton1.Checked = True Then
xlsheet.Cells(xlRng, 5).Value = "男性"
ElseIf RadioButton2.Checked = True Then
xlsheet.Cells(xlRng, 5).Value = "女性"
End If
xlsheet.Cells(xlRng, 6).Value = Label8.Text
xlsheet.Cells(xlRng, 7).Value = Label2.Text
On Error Resume Next
xlApp.DisplayAlerts = False
xlsheet.SaveAs("D:\Documents\AAAA.xls")
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRng)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsCell)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
ありがとうございます。
分からない事だらけです。
もっと勉強してがんばってみます。