- - PR -
VB.NETでエクセルエグゼが残ってしまいます。
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-21 17:33
再び迷いの森に戻ってしまいました。
Dim xlApp As New Object xlApp = CType(CreateObject("Excel.Application"), Object) Dim xlBooks As Object = xlApp.Workbooks Dim xlBook As Object = xlBooks.Add Dim xlSheets As Object = xlBook.Worksheets Dim xlSheet As Object = xlSheets.Item(1) Dim xlWorksheet = xlSheets("Sheet1") Dim xlColumns As Object = xlWorksheet.Columns Dim xlColumn As Object とカラムを分けて定義して、 xlColumn = xlColumns("A:AQ") xlColumn.AutoFit() を行い、 'オブジェクトの解放 MRComObject(xlColumn) MRComObject(xlColumns) MRComObject(xlWorksheet) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) GC.Collect() としましたが、 やはりプロセスが開放し切れませんでした。 じゃんぬねっとさん、とっちゃんさんのアドバイスを元に xlSheets("Sheet1").columns("A:AQ").AutoFit() を Dim xlWorksheet = xlSheets("Sheet1") Dim xlColumns As Object = xlWorksheet.Columns Dim xlColumn As Object として MRComObject(xlColumn) MRComObject(xlColumns) MRComObject(xlWorksheet) と開放したつもりだったのですが、これだと何が足りないのでしょう? (私の頭が足りないのは置いておいてください) | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:01
失礼しました。
先ほどの私の書き込みは間違いでした。 (足りないのは私の頭でした…☆) 今一度詳しく調べた結果、 上記記述の部分ではプロセスの開放が行われていました。 問題なのは次の部分で実際に値を出力する部分でした。 'エクセル出力する為の変数定義 Dim xlApp As New Object xlApp = CType(CreateObject("Excel.Application"), Object) Dim xlBooks As Object = xlApp.Workbooks Dim xlBook As Object = xlBooks.Add Dim xlSheets As Object = xlBook.Worksheets Dim xlSheet As Object = xlSheets.Item(1) Dim xlWorksheet = xlSheets("Sheet1") Dim xlCells As Object Dim xlRange As Object Dim xlColumns As Object = xlWorksheet.Columns Dim xlColumn As Object Dim vliRowsCount As Integer Dim vliColCount As Integer Dim omDataTable As New DataTable Dim olHairetu(0, omDataTable.Columns.Count - 1) Dim vlsCol As String Try 'データセットからデータテーブルの設定 omDataTable = omDataSet.Tables(0) 'Excelを非表示 xlApp.Visible = False '保存時の問合せのダイアログを非表示に設定 xlApp.DisplayAlerts = False 'シートの削除 xlSheets("Sheet2").delete() xlSheets("Sheet3").delete() 'セルの設定 xlCells = xlSheet.Cells '作成区分が"0"以外の場合 If vgiSaisakuseiKubun <> 0 Then '出力レイアウトの設定("1"の場合フォーマットの設定) Me.sgUriageSetLayout(xlSheets, xlSheet, vasJigyosyoName, 1) For vliColCount = 0 To (omDataTable.Columns.Count - 1) 'セル指定 xlRange = xlCells(1, vliColCount + 1) '出力内容 '項目名の設定 xlRange.value = omDataSet.Tables(0).Columns(vliColCount).ColumnName Next ReDim olHairetu(0, omDataTable.Columns.Count - 1) vlsCol = ":AQ" *************************************************************************** 以下の処理を通るとプロセスが残りました。 *************************************************************************** For vliRowsCount = 0 To (omDataTable.Rows.Count - 1) '最大列数分ループ For vliColCount = 0 To (omDataTable.Columns.Count - 1) olHairetu(0, vliColCount) = omDataTable.Rows.Item(vliRowsCount).ItemArray(vliColCount) 'DBNULLだった場合は処理を抜ける If IsDBNull(omDataTable.Rows.Item(vliRowsCount).ItemArray(vliColCount)) = False Then olHairetu(0, vliColCount) = Replace(olHairetu(0, vliColCount), "〜", "〜") End If Next xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu Next ***************************************************************************** 'エクセルエグゼ開放用 xlColumn = xlColumns("A:AQ") xlColumn.AutoFit() '********************* 'エクセルに保存 '********************* xlSheet.SaveAs(omSaveFilePass) 'オブジェクトの解放 MRComObject(xlColumn) MRComObject(xlColumns) MRComObject(xlWorksheet) MRComObject(xlCells) MRComObject(xlRange) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) GC.Collect() | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:10
Object 型を Object 型にキャストする必要はないと思いませんか?
この 2 行のうち 1 行が無意味だということに気付いていますか?
・・・・・・・・・・・・・。 tk(-s-)ins _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:24
自問自答再び!
前の書き込みを見て、 xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu が問題である所までわかりました! しかし、xlSheets("Sheet1").rangeを分離すればよいのでしょうが、 座礁中です。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:49
この辺はすでにじゃんぬねっとさんが答えを出してくれていると思いますよ。
それよりも
このあたりの暗黙の型変換がとても気になります。 Excelの問題が解決した後で結構ですので、型に付いて調べてみてください。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:53
んん…ん。
何とかやってみようと思います…、 分かりそうで分からないようなのですが、 手探りながらもう少しあがいてみようと思います。 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 18:59
問題はそこだけではありません。 私の書き込みをもう 1 度良く見てください。
全く同じことを、Columns の方で既にやっていらっしゃるのに、ですか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2006-12-21 20:08
これいつも思うんですけど、xlSheets("Sheet1") という書き方自体が誤解を招くと思っています。下記で説明していますけど、これはあくまでも省略形です。 件名:Excel VBA 配列のセル貼り付けエラーについて そう考えれば当然分けるべきだということがわかるでしょう。 # そういや、VB.NET ではできないと思うけど、legacy の VB6.0 には、Global という # もう一個厄介なのがあるんですが。 # ちゃんとわかっている人 VBer でもほとんどいないと思うし。 tag 修正 [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-12-21 20:09 ] |