'***********************************************************************************************
' ■■■ コントロールイベント ■■■
'***********************************************************************************************
'* 処理名 :Button1_Click
'* 機能 :ExcelのCOM参照テスト① ※新規ブックの追加①
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※COMオブジェクトを参照した変数はその都度解放する
'* 注意事項: ⇒[○]フォームを開いたままでもExcelを閉じるとプロセスも解放される
'***********************************************************************************************
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加①)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
Dim objWorkbooks As Excel.Workbooks = Nothing ' Excel.Workbooks
Dim objWbk As Excel.Workbook = Nothing ' Excel.Workbook
Dim objSh As Excel.Worksheet = Nothing ' Excel.Worksheet
Dim objR As Excel.Range = Nothing ' Excel.Range
'===========================================================================================
' Excel.Applicationのインスタンス生成(共通処理)
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
objWorkbooks = objExcelApp.Workbooks
objWbk = objWorkbooks.Add()
With objWbk
objSh = .Worksheets(1)
With objSh
objR = .Range("A1")
objR.Value = "ABC"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
objR = .Range("A2")
objR.Value = "DEF"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
objR = .Range("A3")
objR.Value = "GHI"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
End With
Call GP_ReleaseComObject(objSh) ' ←参照の都度解放する
' ワークシートを追加
objSh = .Worksheets.Add()
With objSh
.Name = "HOGE"
objR = .Range("A1")
objR.Value = "JKL"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
objR = .Range("A2")
objR.Value = "MNO"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
objR = .Range("A3")
objR.Value = "PQR"
Call GP_ReleaseComObject(objR) ' ←参照の都度解放する
End With
Call GP_ReleaseComObject(objSh) ' ←参照の都度解放する
.Saved = True
End With
'-------------------------------------------------------------------------------------------
' COM解放(こまめに)
Call GP_ReleaseComObject(objWbk)
Call GP_ReleaseComObject(objWorkbooks)
Call GP_ReleaseComObject(objExcelApp)
End Sub
'***********************************************************************************************
'* 処理名 :Button2_Click
'* 機能 :ExcelのCOM参照テスト② ※新規ブックの追加②
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※最後にまとめてCOMオブジェクトを参照した変数を解放する
'* 注意事項: ⇒[○]フォームを開いたままでもExcelを閉じるとプロセスも解放される
' つまりループ中に都度解放するというような必要はないようだ
'***********************************************************************************************
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加②)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
Dim objWorkbooks As Excel.Workbooks = Nothing ' Excel.Workbooks
Dim objWbk As Excel.Workbook = Nothing ' Excel.Workbook
Dim objSh As Excel.Worksheet = Nothing ' Excel.Worksheet
Dim objR As Excel.Range = Nothing ' Excel.Range
'===========================================================================================
' Excel.Applicationのインスタンス生成(共通処理)
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
objWorkbooks = objExcelApp.Workbooks
objWbk = objWorkbooks.Add()
With objWbk
objSh = .Worksheets(1)
With objSh
objR = .Range("A1")
objR.Value = "ABC"
objR = .Range("A2")
objR.Value = "DEF"
objR = .Range("A3")
objR.Value = "GHI"
End With
' ワークシートを追加
objSh = .Worksheets.Add()
With objSh
.Name = "HOGE"
objR = .Range("A1")
objR.Value = "JKL"
objR = .Range("A2")
objR.Value = "MNO"
objR = .Range("A3")
objR.Value = "PQR"
End With
.Saved = True
End With
'-------------------------------------------------------------------------------------------
' COM解放(まとめて)
Call GP_ReleaseComObject(objR)
Call GP_ReleaseComObject(objSh)
Call GP_ReleaseComObject(objWbk)
Call GP_ReleaseComObject(objWorkbooks)
Call GP_ReleaseComObject(objExcelApp)
End Sub
'***********************************************************************************************
'* 処理名 :Button3_Click
'* 機能 :ExcelのCOM参照テスト③ ※新規ブックの追加③
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※WithステートメントでCOMオブジェクトを参照し、変数宣言を省略する
'* 注意事項: ⇒[×]フォームを開いたままExcelを閉じてもプロセスが解放されずに残る
' 但し、呼び出した元のフォームを閉じればプロセスも解放されるようだ
'***********************************************************************************************
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加③)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
'===========================================================================================
' Excel.Applicationのインスタンス生成
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
With objExcelApp.Workbooks
With .Add()
With .Worksheets(1)
.Range("A1").Value = "ABC"
.Range("A2").Value = "DEF"
.Range("A3").Value = "GHI"
End With
' ワークシートを追加
With .Worksheets.Add()
.Name = "HOGE"
.Range("A1").Value = "JKL"
.Range("A2").Value = "MNO"
.Range("A3").Value = "PQR"
End With
.Saved = True
End With
End With
'-------------------------------------------------------------------------------------------
' COM解放(Applicationのみ)
Call GP_ReleaseComObject(objExcelApp)
End Sub
'***********************************************************************************************
'* 処理名 :Button4_Click
'* 機能 :ExcelのCOM参照テスト④ ※新規ブックの追加④
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※Excel本体のCOMオブジェクト以外の変数を解放をスキップする
' もしくはすべてのCOM解放を怠ってみる
'* 注意事項: ⇒[×]フォームを開いたままExcelを閉じてもプロセスが解放されずに残る(当然!)
' 但し、呼び出した元のフォームを閉じればプロセスも解放されるようだ
'***********************************************************************************************
Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加④)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
Dim objWorkbooks As Excel.Workbooks = Nothing ' Excel.Workbooks
Dim objWbk As Excel.Workbook = Nothing ' Excel.Workbook
Dim objSh As Excel.Worksheet = Nothing ' Excel.Worksheet
Dim objR As Excel.Range = Nothing ' Excel.Range
'===========================================================================================
' Excel.Applicationのインスタンス生成(共通処理)
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
objWorkbooks = objExcelApp.Workbooks
objWbk = objWorkbooks.Add()
With objWbk
objSh = .Worksheets(1)
With objSh
objR = .Range("A1")
objR.Value = "ABC"
objR = .Range("A2")
objR.Value = "DEF"
objR = .Range("A3")
objR.Value = "GHI"
End With
' ワークシートを追加
objSh = .Worksheets.Add()
With objSh
.Name = "HOGE"
objR = .Range("A1")
objR.Value = "JKL"
objR = .Range("A2")
objR.Value = "MNO"
objR = .Range("A3")
objR.Value = "PQR"
End With
.Saved = True
End With
'-------------------------------------------------------------------------------------------
' COM解放(怠る例)
'Call GP_ReleaseComObject(objR)
'Call GP_ReleaseComObject(objSh)
'Call GP_ReleaseComObject(objWbk)
'Call GP_ReleaseComObject(objWorkbooks)
'Call GP_ReleaseComObject(objExcelApp)
End Sub
'***********************************************************************************************
'* 処理名 :Button5_Click
'* 機能 :ExcelのCOM参照テスト⑤ ※新規ブックの追加⑤
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※ApplicationやWorkbooksだけ先に解放できるかの確認
'* 注意事項: ⇒[○]フォームを開いたままでもExcelを閉じるとプロセスも解放される
'***********************************************************************************************
Private Sub Button5_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button5.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加⑤)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
Dim objWorkbooks As Excel.Workbooks = Nothing ' Excel.Workbooks
Dim objWbk As Excel.Workbook = Nothing ' Excel.Workbook
Dim objSh As Excel.Worksheet = Nothing ' Excel.Worksheet
Dim objR As Excel.Range = Nothing ' Excel.Range
'===========================================================================================
' Excel.Applicationのインスタンス生成(共通処理)
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
objWorkbooks = objExcelApp.Workbooks
Call GP_ReleaseComObject(objExcelApp) ' ←先にApplicationを解放
objWbk = objWorkbooks.Add()
Call GP_ReleaseComObject(objWorkbooks) ' ←先にWorkbooksを解放
With objWbk
objSh = .Worksheets(1)
With objSh
objR = .Range("A1")
objR.Value = "ABC"
objR = .Range("A2")
objR.Value = "DEF"
objR = .Range("A3")
objR.Value = "GHI"
End With
' ワークシートを追加
objSh = .Worksheets.Add()
With objSh
.Name = "HOGE"
objR = .Range("A1")
objR.Value = "JKL"
objR = .Range("A2")
objR.Value = "MNO"
objR = .Range("A3")
objR.Value = "PQR"
End With
.Saved = True
End With
'-------------------------------------------------------------------------------------------
' COM解放(Workbooks以外まとめて)
Call GP_ReleaseComObject(objR)
Call GP_ReleaseComObject(objSh)
Call GP_ReleaseComObject(objWbk)
End Sub
'***********************************************************************************************
'* 処理名 :Button6_Click
'* 機能 :ExcelのCOM参照テスト⑥ ※新規ブックの追加⑥
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:※⑤からWorkbookオブジェクト以下のオブジェクトをWith参照にしてみる
' さらにInteriorやPageSetupも操作してみる
'* 注意事項: ⇒[○]フォームを開いたままでもExcelを閉じるとプロセスも解放される
' つまり、シート内の個々のオブジェクトをいちいち解放しなくても可!?
'***********************************************************************************************
Private Sub Button6_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button6.Click
'-------------------------------------------------------------------------------------------
Const cnsTitle = "ExcelのCOM参照テスト(新規ブックの追加⑥)"
Dim objExcelApp As Excel.Application = Nothing ' Excel.Application
Dim objWorkbooks As Excel.Workbooks = Nothing ' Excel.Workbooks
'===========================================================================================
' Excel.Applicationのインスタンス生成
If Not FP_GetExcelInstance(objExcelApp, cnsTitle) Then Exit Sub
'-------------------------------------------------------------------------------------------
' ワークブックを追加
objWorkbooks = objExcelApp.Workbooks
With objWorkbooks.Add()
With .Worksheets(1)
.Range("A1").Value = "ABC"
.Range("A2").Value = "DEF"
.Range("A3").Value = "GHI"
.PageSetup.PrintArea = .UsedRange.Address
End With
' ワークシートを追加
With .Worksheets.Add()
.Name = "HOGE"
.Range("A1").Value = "JKL"
.Range("A2").Value = "MNO"
.Range("A3").Value = "PQR"
.Range("A1:A3").Interior.ColorIndex = 5
End With
.Saved = True
End With
'-------------------------------------------------------------------------------------------
' COM解放
Call GP_ReleaseComObject(objWorkbooks)
Call GP_ReleaseComObject(objExcelApp)
End Sub
'***********************************************************************************************
' ■■■ 共通サブ処理 ■■■
'***********************************************************************************************
'* 処理名 :FP_GetExcelInstance
'* 機能 :Excel.Applicationのインスタンス生成
'-----------------------------------------------------------------------------------------------
'* 返り値 :処理成否(Boolean)
'* 引数 :Arg1 = Excel.Application(Object) ※Ref参照
'* Arg2 = 処理タイトル(String)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2017年04月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***********************************************************************************************
Private Function FP_GetExcelInstance(ByRef objExcelApp As Excel.Application, _
ByVal strTitle As String) As Boolean
'-------------------------------------------------------------------------------------------
Dim typType As Type = Type.GetTypeFromProgID(g_cnsExcelApplication) ' Type
' 取得失敗
If typType Is Nothing Then
MessageBox.Show("Excelがインストールされていません。", strTitle)
Return False
End If
objExcelApp = Activator.CreateInstance(typType)
' Microsoft Excelを表示
objExcelApp.Visible = True
Return True
End Function
'***********************************************************************************************
'* 処理名 :GP_ReleaseComObject
'* 機能 :COMオブジェクトの解放
'-----------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :Arg1 = 解放するCOMオブジェクト(Object)
'-----------------------------------------------------------------------------------------------
'* 作成日 :2009年03月01日
'* 作成者 :井上 治
'* 更新日 :2009年03月01日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***********************************************************************************************
Private Sub GP_ReleaseComObject(ByRef objCOM As Object)
'-------------------------------------------------------------------------------------------
' 明示的にCOMオブジェクトへの参照を解放する
Try
' ランタイム呼び出し可能ラッパーの参照カウントをデクリメント
If ((objCOM IsNot Nothing) AndAlso (Marshal.IsComObject(objCOM))) Then
Marshal.FinalReleaseComObject(objCOM)
End If
Finally
' 参照を解除する
objCOM = Nothing
End Try
End Sub