ふじさきの .NET お勉強日誌

.NETを中心に「なんとなく」しか知らないものをちょっとずつお勉強
投稿数 - 57, コメント - 117, トラックバック - 36

目次

ニュース

・07/04/25 わんくま同盟入会!
・07/04/28 大阪勉強会#08 参加しました!
・07/05/18 大阪勉強会#09 参加しました!
・07/06/23 大阪勉強会#10 参加しました!

自己紹介

ふじさき@大阪人です。
ホントは技術に詳しくないとできない(やっちゃいけない?)様な仕事を、口八丁手八丁でなんとかこなしている今日この頃です

ExcelAdjuster

窓の杜(NEWS) Vector

ブックレビュー

超図解 HTML&CSS辞典 ためしてナットクSQL 基礎編 つくってナットクVisual Basicデータベースプログラミング

取得MCP

MCPロゴ MCADロゴ MCSDロゴ MCTSロゴ ・070-210
・070-229
・070-270
・070-300
・070-305
・070-306
・070-310
・070-315
・070-316
・070-320
・070-431
・070-441
・070-442
・070-528
・070-536

わんくま同盟

わんくま同盟

書庫

日記カテゴリ

2007年8月11日

Excelのプロセスが残っちゃった^^;

ちまたで何度も聞いたことがあるこの質問。
恥ずかしながらハマってしまいました(>_<)

でもでも、今回のはよくあるCOMの解放忘れとかじゃなさそうなんです。

まず、こんなコードを書いてみます。
(もしよかったら、完全なソースもここに置いときます。)

 

 

VB.NETでExcelを操作してみる
Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
    Try

        'Excelオブジェクト
        Dim objExcel As Excel.Application = Nothing
        Dim objBook1 As Excel.Workbook = Nothing
        Dim objSheet1 As Excel.Worksheet = Nothing


        '指定されたEXCELファイルを開く
        objExcel = CType(CreateObject("Excel.Application"), Excel.Application)
        objBook1 = CType(objExcel.Workbooks.Open("C:\test.xls"), Excel.Workbook)
        objSheet1 = CType(objBook1.Worksheets("Sheet1"), Excel.Worksheet)

        objExcel.DisplayAlerts = False

        With objSheet1
            .Cells(12) = "1,2"
            .Cells(22) = "2,2"
            .Cells(31) = "3,1"
            '.Cells(3, 2) = "3,2"
            '.Cells(3, 3) = "3,3"
            '.Cells(3, 5) = "3,5"
            '.Cells(1, 8) = "1,8"
            '.Cells(1, 10) = "1,10"
            '.Cells(2, 8) = "2,8"
            '.Cells(2, 10) = "2,10"
            '.Cells(2, 11) = "2,11"
            '.Cells(3, 8) = "3,8"
            '.Cells(3, 10) = "3,10"
            '.Cells(3, 11) = "3,11"
        End With

        'シートの保存
        objBook1.Save()

        '閉じる
        If Not objSheet1 Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet1)
        End If
        If Not objBook1 Is Nothing Then
            Try
                objBook1.Close()
            Finally
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook1)
            End Try
        End If
        If Not objExcel Is Nothing Then
            Try
                objExcel.Quit()
            Finally
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel)
            End Try
        End If
        objSheet1 = Nothing
        objBook1 = Nothing
        objExcel = Nothing
        GC.Collect(2)

    Catch ex As Exception
        MessageBox.Show(ex.ToString)

    End Try

 

これだと、ちゃんとExcelプロセスは消えてくれます。
ところが、コメントアウトしている部分を元に戻すと・・・
プロセスが残っちゃう!
なんでやろ~!
Cellにセットする回数が違うだけなんやけどな~

ReleaseComObjectしてるし、
BookもColseしてるし、
ExcelもQuitしてるし、
Nothig入れてるし、

GCも呼んでるねんけどな~!

posted @ 15:22 | Feedback (11)