VB .NETからエクセル出力

VB.NETからエクセルに出力するときの備忘録です。

 

参照設定にて「Microsoft Excel 14.0 Object Library」を追加

 

'どのファイルに記入するか指定して、Functionを呼び出し

 Private Sub btnExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExec.Click

Dim Ret as Boolean=False

Ret=ExcelOutput("C:\TEST\テンプレート.xls")

End Sub

 

Imports Microsoft.Office.Interopを追加

 Private Function ExcelOutput(ByVal LoadFilePath As String) As Boolean

        Dim xlApp As New Excel.Application
        '==================  起動時の処理  =================== 
        xlApp.Visible = False         'Excelを表示(必ずとも表示しなくてもよい)
        xlApp.DisplayAlerts = False     '保存時の問合せのダイアログを非表示に設定

        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        Dim xlBook As Excel.Workbook = xlBooks.Open(LoadFilePath)
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet
        Dim xlRange As Excel.Range
        Dim localByName As Process() = Process.GetProcessesByName("Excel")

        xlSheet = xlBook.Worksheets(1)
        xlRange = xlSheet.Range("A1")

        xlApp.DisplayAlerts = False     '保存時の問合せのダイアログを非表示に設定

        xlRange = xlSheet.Range("P3") '記入したい場所
        xlRange.Value = "ここに記入したい文字を書く"
        MRComObject(xlRange)

        'ファイルの名前をつけて保存保存
        SaveFilePath = "C:\TEST\"  '保存先
        xlBook.SaveAs(SaveFilePath)

        xlApp.DisplayAlerts = True     '保存時の問合せのダイアログを表示に設定

        '==================  終了処理  ===================== 
        MRComObject(xlRange)            'xlRange の解放
        MRComObject(xlSheet)            'xlSheet の解放
        MRComObject(xlSheets)           'xlSheets の解放
        xlBook.Close(False)             'xlBook を閉じる
        MRComObject(xlBook)             'xlBook の解放
        MRComObject(xlBooks)            'xlBooks の解放
        xlApp.Quit()                    'Excelを閉じる
        MRComObject(xlApp)              'xlApp を解放

        If localByName.Length > 1 Then
            GC.Collect()                'ガベージコレクターにてEXCELを回収
        End If

        '-------------------------------------------------------------------------
        GC.Collect()   '終了後すぐ再起動したい場合は、強制的にガベージ コレクションを実行して下さい。
        System.Threading.Thread.Sleep(1000)          '回収待ち時間
        '--------------------------------------------------------------------------


    End Function

MRComObjectは下記をコピーしておく


#Region "メモリ解放"

    Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
        Dim IDEEnvironment As Boolean = False  'メッセージボックスを表示させたい場合は、True に設定
        If objCom Is Nothing Then
            If IDEEnvironment = True Then
                'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
                MessageBox.Show("Nothing です。")
            End If
            Return
        End If
        Try
            If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
                Dim count As Integer
                If force Then
                    count = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
                Else
                    count = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                End If
                If IDEEnvironment = True AndAlso count <> 0 Then
                    Try
                        'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
                        MessageBox.Show(TypeName(objCom) & " 要調査! デクリメントされていません。")
                    Catch ex As Exception
                        MessageBox.Show(" 要調査! デクリメントされていません。")
                    End Try
                End If
            Else
                If IDEEnvironment = True Then
                    'テスト環境の場合は下記を実施し、後は、コメントにしておいて下さい。
                    MessageBox.Show("ComObject ではありませんので、解放処理の必要はありません。")
                End If
            End If
        Finally
            objCom = Nothing
        End Try
    End Sub
#End Region