tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelのプロセスが終了しない
記事No1538
投稿日: 2005/03/31(Thu) 16:30
投稿者VB.net初心者
[OSのVer]:WindowsXP    [VBのVer]:VB.NET  
いつも参考にさせて頂いております。
同じような質問が続いてしまって申し訳ないのですが、ぜひ教えて頂けたらと思い、投稿させて頂き
ました。

データベースから取得したレコードをエクセルに書き込むアプリケーションを作成しているのです
が、取得したレコード数が2件以上になると、Excelのプロセスが残ってしまいます。
毎回COMの開放は行っているつもりなのですが、なぜプロセスが消えないのか理由が分かりません。
COMの開放については、ホームページ内の記述を参考にさせて頂きました。

以下、ソースです。
よろしくお願いいたします。


----------------------

Dim xlApp As Excel.Application = CreateObject("Excel.Application")
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = xlBooks.Open(xlsFile)
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = xlSheets.Item(sheet_save)
Dim xlRange As Excel.Range
Dim row_cnt As Integer = 5

'タイトル入力用の変数
Dim strTitle(0, 6) As String
'データ入力用の変数
Dim strDat(0, 6) As String

'タイトルの設定
strTitle(0, 0) = "タイトル"
strTitle(0, 4) = DateTime.Now.ToString

xlRange = xlSheet.Range("A1:G1")
'セルへデータの入力
xlRange.Value = strTitle
'xlRangeの解放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)

Do Until (レコードがなくなるまで)
    '2行目からは前の行をコピーする
    If row_cnt > 5 Then
        xlSheet.Rows(row_cnt - 1).Select()
        xlApp.Selection.Copy()
        xlSheet.Rows(row_cnt).Select()
        xlApp.Selection.Insert()
        xlApp.CutCopyMode = False
        xlApp.Selection.ClearContents()
    End If

    'データの入力セル範囲
    Dim strRange As String = "A" + row_cnt.ToString + ":" + "G&quo
t; + row_cnt.ToString
    xlRange = xlSheet.Range(strRange)

    strDat(0, 0) = "aaa"
    strDat(0, 1) = "bbb"
    strDat(0, 2) = "ccc"
    strDat(0, 3) = "ddd"
    strDat(0, 4) = "eee"
    strDat(0, 5) = "fff"
    strDat(0, 6) = "ggg"

    'セルへデータの入力
    xlRange.Value = strDat
    'xlRangeの解放
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)

    '書き込む行番号をインクリメント
    row_cnt += 1

Loop

'ファイルの保存処理
'保存時の問合せのダイアログを非表示に設定
xlApp.DisplayAlerts = False
'上書き保存
xlSheet.SaveAs(xlsFile)
'元に戻す
xlApp.DisplayAlerts = True

'終了処理
'xlRange の開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
'xlSheet の開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
'xlSheets の開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
'xlBook を閉じる
xlBook.Close(False)
'xlBook の開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
'xlBooks の開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
'Excelを閉じる
xlApp.Quit()
'xlApp を開放
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

[ツリー表示へ]
タイトルRe: Excelのプロセスが終了しない
記事No1539
投稿日: 2005/03/31(Thu) 17:15
投稿者花ちゃん
原因が解っていて対策もご存知なのですから、後はどこが間違っているか
間違い探しを(バグ取り)をするだけかと思うのですが、自分の間違いを人に
探してもらうのもどうかと思うのですが、自分で探す(見つける事)事をやらないと
いつまでたっても同じ事の繰り返しをするだけです。

私がいつもやる方法
1.まず、基本的なプログラムを作成した時点で十分テストして確認しておく。
2.コードを追加する度に残っていないか確認しながら進める。
(特に今までやった事のないような処理は念入りに)
これだけで殆ど問題点がつかめます。

後から調べるとなると逆に順番にコメント化して、確認しながら、コメントをはずして
いけば解るかと思います。
(これが面倒だから都度、確認しなが進めるのです。私は)

問題の箇所がつかめ、その対策方法が解らないなら質問されるのもいいかと思います。

とりあえず、ヘルプで Rows プロパティ を調べて見る事から初めて下さい。

> 同じような質問が続いてしまって申し訳ないのですが、
なら、下記を見ていないのですか?
hhttp://www.bcap.co.jp/hanafusa/bbs/wforum.cgi?no=1534&reno=1533&oya=1533&mode=msgview&page=0

[ツリー表示へ]
タイトルRe: Excelのプロセスが終了しない
記事No1545
投稿日: 2005/04/01(Fri) 22:25
投稿者魔界の仮面弁士
# この手の質問、なぜか無くなりませんね……。(^_^;)

> 以下、ソースです。
> よろしくお願いいたします。
怪しい匂いがするところだけ列挙します。

>         xlSheet.Rows(row_cnt - 1).Select()
この行だけで、解放漏れが2つありますよ。

>         xlApp.Selection.Copy()
解放漏れ×1。それから、Application.Selectionは使わない方が無難。

>         xlSheet.Rows(row_cnt).Select()
解放漏れ×2

>         xlApp.Selection.Insert()
解放漏れ×1

>         xlApp.Selection.ClearContents()
解放漏れ×1

>     Dim strRange As String = "A" + row_cnt.ToString + ":" + "G" + row_cnt.ToString
VBでの文字列連結は、&演算子を使った方が良いかと。

[ツリー表示へ]
タイトルRe^2: Excelのプロセスが終了しない
記事No1554
投稿日: 2005/04/04(Mon) 13:31
投稿者VB.net初心者
花ちゃんさん、魔界の仮面弁士さん、ご教授ありがとうございます。

前の行をコピーする部分を下記のように修正しました。
しかし、まだプロセスがうまく終了してくれません。

Dim R1 As Excel.Range
Dim R2 As Excel.Range
Dim RCopy As Excel.Range
Dim RPaste As Excel.Range

xlCells = xlSheet.Cells
R1 = DirectCast(xlCells._Default(row_cnt - 1, 1), Excel.Range)
R2 = DirectCast(xlCells._Default(row_cnt - 1, 7), Excel.Range)
RCopy = xlSheet.Range(R1, R2)
RCopy.Copy()
RPaste = DirectCast(xlCells._Default(row_cnt, 1), Excel.Range)
RPaste.Insert()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(R2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(RCopy)
System.Runtime.InteropServices.Marshal.ReleaseComObject(RPaste)

しかも、デバッグのためにxlCells以外のところを全てコメントアウトしてもダメでした。

xlCells = xlSheet.Cells
'R1 = DirectCast(xlCells._Default(row_cnt - 1, 1), Excel.Range)
'R2 = DirectCast(xlCells._Default(row_cnt - 1, 7), Excel.Range)
'RCopy = xlSheet.Range(R1, R2)
'RCopy.Copy()
'RPaste = DirectCast(xlCells._Default(row_cnt, 1), Excel.Range)
'RPaste.Insert()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
'System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)
'System.Runtime.InteropServices.Marshal.ReleaseComObject(R2)
'System.Runtime.InteropServices.Marshal.ReleaseComObject(RCopy)
'System.Runtime.InteropServices.Marshal.ReleaseComObject(RPaste)

xlCells = xlSheet.Cellsのなかに、xlCells以外で解放しなければならないものがあるのでしょうか?

[ツリー表示へ]
タイトルRe^3: Excelのプロセスが終了しない
記事No1555
投稿日: 2005/04/04(Mon) 13:51
投稿者花ちゃん
> しかも、デバッグのためにxlCells以外のところを全てコメントアウトしてもダメでした。
だったらそれ以外にもまずいところがあるのでは。
キチンと終了するところまでコメント化してみて下さい。
(起動と終了だけのプログラムでキチンと終了していますか)
ここのサンプル参照。

# 返信がすぐにできない理由があるのなら質問の時に記入しておいて下さい。

最初のコードの  If row_cnt > 5 Then 〜  End If の部分をコメント化すれば
プロセスがキチンと終了するのではなかったのですか?

If 文のところを下記にように変数に受けてReleaseComObject して見てください。
(下記はとりあえず試すのに使っただけで貴方のやりたい事とは違うかもしれません)

        If row_cnt > 5 Then
            Dim xlRange1 As Excel.Range
            Dim xlRange2 As Excel.Range
            Dim xlRows As Excel.Range
            xlRows = xlSheet.Rows
            xlRange1 = xlRows(row_cnt - 1)
            xlRange1.Copy()
            xlRange2 = xlRows(row_cnt)
            xlRange2.Insert()
            xlApp.CutCopyMode = False
            xlRange2.ClearContents()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRows)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange1)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange2)
        End If

[ツリー表示へ]
タイトルRe^4: Excelのプロセスが終了しない
記事No1558
投稿日: 2005/04/04(Mon) 15:41
投稿者VB.net初心者
花ちゃんさん、ありがとうございます。

> # 返信がすぐにできない理由があるのなら質問の時に記入しておいて下さい。

返信が遅くなって、ご迷惑をお掛けしました。
申し訳ありませんでした。

> 最初のコードの  If row_cnt > 5 Then 〜  End If の部分をコメント化すれば
> プロセスがキチンと終了するのではなかったのですか?

そのとおりです。
Rowsの使い方をちゃんと理解しないままにコードを書いてしまっていました。
花ちゃんさんにご教授頂いたようにすれば、うまく終了できました。

今回のことで色々勉強させて頂き、ありがとうございました。

[ツリー表示へ]