- PR -

VB.NETでエクセルエグゼが残ってしまいます。

投稿者投稿内容
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 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/07
投稿数: 43
投稿日時: 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), "&#12316;", "〜")
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()
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 18:10
引用:

エドさんの書き込み (2006-12-21 18:01) より:

xlApp = CType(CreateObject("Excel.Application"), Object)


Object 型を Object 型にキャストする必要はないと思いませんか?

引用:

Dim xlSheet As Object = xlSheets.Item(1)
Dim xlWorksheet [As Object] = xlSheets("Sheet1")


この 2 行のうち 1 行が無意味だということに気付いていますか?

引用:

'シートの削除
xlSheets("Sheet2").delete()
xlSheets("Sheet3").delete()
(snip)
xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu


・・・・・・・・・・・・・。


tk(-s-)ins

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2006-12-21 18:24
自問自答再び!

前の書き込みを見て、
xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu

が問題である所までわかりました!
しかし、xlSheets("Sheet1").rangeを分離すればよいのでしょうが、
座礁中です。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-12-21 18:49
引用:

エドさんの書き込み (2006-12-21 18:24) より:

前の書き込みを見て、
xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu
が問題である所までわかりました!
しかし、xlSheets("Sheet1").rangeを分離すればよいのでしょうが、
座礁中です。


この辺はすでにじゃんぬねっとさんが答えを出してくれていると思いますよ。

引用:

じゃんぬねっとさんの書き込み (2006-12-21 15:28) より:

引用:

とっちゃんさんの書き込み (2006-12-21 14:36) より:

. が出てくるたびに分解し、


これだけだと、コレクション系の 「デフォルト プロパティ」 で躓く可能性がありますね。

コード:

    xlWorksheets("Sheet1").Columns("A:AQ").AutoFit()


が、

コード:

    xlWorksheets._Default("Sheet1").Columns._Default("A:AQ").AutoFit()


このように展開されることがわかっていないと、通じないかもしれません。


それよりも

コード:

range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value


このあたりの暗黙の型変換がとても気になります。
Excelの問題が解決した後で結構ですので、型に付いて調べてみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2006-12-21 18:53
んん…ん。
何とかやってみようと思います…、
分かりそうで分からないようなのですが、
手探りながらもう少しあがいてみようと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 18:59
引用:

エドさんの書き込み (2006-12-21 18:24) より:

前の書き込みを見て、
xlSheets("Sheet1").range("A" & vliRowsCount + 2 & vlsCol & vliRowsCount + 2).Value = olHairetu

が問題である所までわかりました!


問題はそこだけではありません。
私の書き込みをもう 1 度良く見てください。

引用:

しかし、xlSheets("Sheet1").rangeを分離すればよいのでしょうが、


全く同じことを、Columns の方で既にやっていらっしゃるのに、ですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-12-21 20:08
引用:
しかし、xlSheets("Sheet1").rangeを分離すればよいのでしょうが



これいつも思うんですけど、xlSheets("Sheet1") という書き方自体が誤解を招くと思っています。下記で説明していますけど、これはあくまでも省略形です。


件名:Excel VBA 配列のセル貼り付けエラーについて


そう考えれば当然分けるべきだということがわかるでしょう。

# そういや、VB.NET ではできないと思うけど、legacy の VB6.0 には、Global という
# もう一個厄介なのがあるんですが。
# ちゃんとわかっている人 VBer でもほとんどいないと思うし。

tag 修正

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-12-21 20:09 ]

スキルアップ/キャリアアップ(JOB@IT)