tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelのプロセスが残る問題
記事No1488
投稿日: 2005/03/18(Fri) 11:31
投稿者匿名
[OSのVer]:WindowsXp    [VBのVer]:VB.NET

Oracleから取得したデータをExcel出力するアプリケーションを作っています。
Excelのプロセスが残ってしまう問題で困っていたのですが、
ResNo1000の魔界の仮面弁士さんのコメント(ReleaseComObjectの投稿)
を見つけて解決の方向に向かっています。

ただ、納得できない部分も残ってしまったので質問させてください。
ヘッダーとして使用しているのですが、A1 〜 C1のセルを連結させて項目名を表示させたいのです。

objRange = stWork.Range("A1:C1")
objRange.Value = "タイトル"
objRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
objRange.Merge()

でプロセスは残らない為、問題は無いのですが
結合するセルは取得したデータによって可変な為
A1:C1 の指定方法ではなく R1C1形式を使いたいのです。

objCells = stWork.Cells
objRange = stWork.Range(objCells._Default(1, 1), objCells._Default(1, 3))

で範囲指定すると ReleaseComObjectを行ってもプロセスが残ってしまいます。
何か別の記述の仕方はありませんでしょうか?

もしくは A1:C1 の指定方法のままコーディングを進め、
1 が来たら A、3が来たら C を返すような関数を作ってしまおうかとも考えています。

みなさんは、こんな局面でどうしているのでしょうか?
アドバイス宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: Excelのプロセスが残る問題
記事No1489
投稿日: 2005/03/18(Fri) 13:14
投稿者花ちゃん
> objCells = stWork.Cells
> objRange = stWork.Range(objCells._Default(1, 1), objCells._Default(1, 3))
>
> で範囲指定すると ReleaseComObjectを行ってもプロセスが残ってしまいます。

使い方が間違っていませんか? よく見比べて下さい。
肝心な部分を省略したコードでは確認のしようがないので事象が再現できる
最低限のコードを投稿して下さい。
(ペーストしたらそのまま動作する)

[ツリー表示へ]
タイトルRe: Excelのプロセスが残る問題
記事No1490
投稿日: 2005/03/18(Fri) 13:16
投稿者魔界の仮面弁士
> objRange = stWork.Range(objCells._Default(1, 1), objCells._Default(1, 3))
> で範囲指定すると ReleaseComObjectを行ってもプロセスが残ってしまいます。

えーと。それはそうでしょうね。

『objCells._Default(1, 1)』や『objCells._Default(1, 3)』が返す
Rangeオブジェクトを、どうやって ReleaseComObject しているのでしょうか? (^^;


修正したサンプルを投稿しておきますね。(あえて、Imports宣言無しで記述しています)

なお、当方では Excel 2003 の PIA(プライマリ相互運用機能アセンブリ)を使っているので、
名前空間は Excel ではなく、Microsoft.Office.Interop.Excel となります。
(Excel 2002 の場合は、KB 328912 から PIA を入手してください)

'------------
Dim Ex2003 As Microsoft.Office.Interop.Excel.Application
Dim Books As Microsoft.Office.Interop.Excel.Workbooks
Dim Book As Microsoft.Office.Interop.Excel.Workbook
Dim Sheets As Microsoft.Office.Interop.Excel.Sheets
Dim Sheet As Microsoft.Office.Interop.Excel.Worksheet
Dim R1, R2, R3, R4 As Microsoft.Office.Interop.Excel.Range

Ex2003 = New Microsoft.Office.Interop.Excel.ApplicationClass()
Ex2003.Visible = True
Books = Ex2003.Workbooks
Book = Books.Add()
Sheets = Book.Worksheets
Sheet = DirectCast(Sheets(1), Microsoft.Office.Interop.Excel.Worksheet)
R1 = Sheet.Cells

'A1 または R1C1 に相当
R2 = DirectCast(R1(1, 1), Microsoft.Office.Interop.Excel.Range)

'C1 または R1C3 に相当
R3 = DirectCast(R1(1, 3), Microsoft.Office.Interop.Excel.Range)

'A1:C1 または R1C1:R1C3 に相当
R4 = Sheet.Range(R2, R3)
R4.Merge()

R4.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter
R4.Value = "タイトル"

System.Runtime.InteropServices.Marshal.ReleaseComObject(R4)
System.Runtime.InteropServices.Marshal.ReleaseComObject(R3)
System.Runtime.InteropServices.Marshal.ReleaseComObject(R2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Sheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Sheets)

Book.SaveAs("C:\Book1.xls")
Book.Close()

System.Runtime.InteropServices.Marshal.ReleaseComObject(Book)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Books)

Ex2003.Quit()

System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex2003)

[ツリー表示へ]
タイトルRe^2: Excelのプロセスが残る問題
記事No1491
投稿日: 2005/03/18(Fri) 14:22
投稿者匿名
返信有難うございます。

魔界の仮面弁士さん>
助かりました。 教えて頂いたように改修して動作確認してみます。

花ちゃんさん>
すみません。 以後気をつけます。
以下のような感じでコーディングしていたのです。

Private Function F_Test(ByVal blnKbn As Boolean) As Boolean

        Dim appExcel As Excel.Application
        Dim bkWork As Excel.Workbook
        Dim stWork As Excel.Worksheet
        Dim objCells As Excel.Range
        Dim objRange As Excel.Range
        Dim intRev As Integer

        Const C_FILE As String = "text.xls"

        Try
            appExcel = New Excel.Application
            appExcel.Visible = False
            appExcel.DisplayAlerts = False
            bkWork = appExcel.Workbooks.Add
            stWork = DirectCast(bkWork.Worksheets("Sheet1"), Excel.Worksheet)

            If blnKbn = True Then
                intRev = -1
            Else
                intRev = 0
            End If

            objCells = stWork.Cells
            With objCells
                'ヘッダー1
                objRange = stWork.Range(._Default(1, 1), ._Default(1, 3 - intRev))
                objRange.Value = "タイトル1"
                objRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                objRange.Merge()

                objRange = stWork.Range(._Default(1, 4 - intRev), ._Default(1, 6 - intRev))
                objRange.Value = "タイトル2"
                objRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                objRange.Merge()

                objRange = stWork.Range(._Default(1, 7 - intRev), ._Default(1, 9 - intRev))
                objRange.Value = "タイトル3"
                objRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                objRange.Merge()

                .EntireColumn.AutoFit()
            End With

            bkWork.SaveAs(C_FILE)

            MsgBox("終了")
            Return True

        Catch ex As Exception
            MsgBox(ex.Message)

        Finally
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objCells)
            objCells = Nothing

            System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange)
            objRange = Nothing

            stWork = Nothing
            bkWork.Close()
            bkWork = Nothing
            appExcel.Quit()
            appExcel = Nothing
            GC.Collect()
        End Try

    End Function

[ツリー表示へ]