プロセスの解放ができません。

タグの編集
投稿者 さらたん  (社会人) 投稿日時 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 
投稿者 bz9  (中学生) 投稿日時 2013/3/17 07:15:14
> 一応、EXCELに書き込み保存は出来ましたが、プロセスにEXCELが残ってしまいます。
プロセスが解放されないことは、このサイトに有りました
http://homepage1.nifty.com/rucio/main/technique/teq_15.htm
投稿者 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使った方がよい場合もあるでしょう。
投稿者 さらたん  (社会人) 投稿日時 2013/3/17 11:11:15
bz9さん ありがとうございます

確認して一つづつ確認していかないとダメですね
投稿者 さらたん  (社会人) 投稿日時 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ですね、どうのように書けばいいのでしょう?
すいません 勉強不足でちゃんと理解してないです。
投稿者 さらたん  (社会人) 投稿日時 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 を解放
投稿者 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オブジェクトが
返ってくるのでそれらをすべて変数で保持し解放する必要があります。
投稿者 さらたん  (社会人) 投稿日時 2013/3/18 20:09:25
shu さん
ありがとうございます。

分からない事だらけです。
もっと勉強してがんばってみます。