ExcelUtil

■使い方の例
Dim wrk As New ExcelUtils
wrk.OpenBook("C:\Users\kagaw\Desktop\ken_all (3)\aaaa.xlsx")
wrk.ChangeSheet("休日")
Dim vals As Object(,) = wrk.GetValueList()
Debug.Print(vals(1001, 1))
wrk.Dispose()

■事前準備

プロジェクト⇒property⇒参照設定から、以下を追加。

Microsoft Excel XX.0 Object Library

 

 

Imports System.Reflection
Imports Microsoft.Office.Interop
''' <summary>
''' Excel出力用クラス。同一ファイルに様々なTClassのデータ出力を行う事を想定し、
''' Genericにはしない。
''' </summary>
Public Class ExcelUtils
Implements IDisposable
'---ファイルを開く
'---ファイルを名前をつけて保存する
'---シートを選択する
'---セルを選択する
Private _xlApp As Excel.Application
Private _xlBooks As Excel.Workbooks
Private _xlBook As Excel.Workbook
Private _xlSheets As Excel.Sheets
Private _ActiveSheet As Excel.Worksheet
Private _oridinalFilePath As String
''' <summary>
''' 既存のファイルを開く
''' </summary>
''' <param name="filePath"></param>
''' <param name="selectSheetName"></param>
Public Sub OpenBook(ByVal filePath As String, ByVal Optional selectSheetName As String = "")
_xlApp = New Excel.Application With {
.DisplayAlerts = False,
.Visible = False
}
_xlBooks = _xlApp.Workbooks
_xlBook = _xlBooks.Open(filePath)
_xlSheets = _xlBook.Worksheets
_ActiveSheet = CType(_xlSheets.Item(1), Excel.Worksheet)
_oridinalFilePath = filePath
If Not String.IsNullOrWhiteSpace(selectSheetName) Then _ActiveSheet = CType(_xlSheets(selectSheetName), Excel.Worksheet)
End Sub
''' <summary>
''' 新規ブックを開く
''' </summary>
Public Sub OpenNewBook()
_xlApp = New Excel.Application With {
.DisplayAlerts = False,
.Visible = False
}
_xlBooks = _xlApp.Workbooks
_xlBook = _xlBooks.Add
_xlSheets = _xlBook.Worksheets
_ActiveSheet = CType(_xlSheets.Item(1), Excel.Worksheet)
End Sub
''' <summary>
''' 処理対象のシートを切り替える
''' </summary>
''' <param name="selectSheetName"></param>
Public Sub ChangeSheet(ByVal selectSheetName As String)
Try
MRComObject(_ActiveSheet)
_ActiveSheet = CType(_xlSheets(selectSheetName), Excel.Worksheet)
Catch ex As Exception
ReleaseExcelObject()
Throw
End Try
End Sub
''' <summary>
''' シート名を変更する
''' </summary>
''' <param name="changeSheetName"></param>
Public Sub ChangeSheetName(ByVal changeSheetName As String)
Try
_ActiveSheet.Name = changeSheetName
Catch ex As Exception
ReleaseExcelObject()
Throw
End Try
End Sub
''' <summary>
''' 単一セルに値をセットする。
''' </summary>
''' <param name="SetLange"></param>
''' <param name="setVal"></param>
Public Sub ValueSetSingle(ByVal SetLange As String, ByVal setVal(,) As String)
Dim xlRange As Excel.Range = Nothing
Try
xlRange = _ActiveSheet.Range(SetLange)
xlRange.Value = setVal
Catch ex As Exception
ReleaseExcelObject()
Throw
Finally
MRComObject(xlRange)
End Try
End Sub
''' <summary>
''' 連続する複数セルへの一括出力を行う
''' </summary>
''' <param name="StartColumn"></param>
''' <param name="startRow"></param>
''' <param name="OutputList"></param>
Public Sub ValueSetList(ByVal StartColumn As Integer, ByVal startRow As Integer, ByVal OutputList(,) As String)
If OutputList Is Nothing Then Return
Dim xlRange As Excel.Range = Nothing
Dim allRange As Excel.Range = Nothing
Dim startRange As Excel.Range = Nothing
Dim endRange As Excel.Range = Nothing
Try
allRange = _ActiveSheet.Cells
startRange = allRange(startRow, StartColumn)
endRange = allRange(OutputList.GetLength(0), OutputList.GetLength(1))
xlRange = _ActiveSheet.Range(startRange, endRange)
xlRange.Value = OutputList
Catch ex As Exception
ReleaseExcelObject()
Throw
Finally
MRComObject(xlRange)
MRComObject(startRange)
MRComObject(endRange)
MRComObject(allRange)
End Try
End Sub
Public Function GetValueList() As Object(,)
Dim xlRange As Excel.Range = Nothing
Dim allRange As Excel.Range = Nothing
Dim startRange As Excel.Range = Nothing
Dim endRange As Excel.Range = Nothing
Try
xlRange = _ActiveSheet.UsedRange
Dim rangeArray As Object(,)
rangeArray = xlRange.Value
Return rangeArray
'xlRange.Value = OutputList
Catch ex As Exception
ReleaseExcelObject()
Throw
Finally
MRComObject(xlRange)
MRComObject(startRange)
MRComObject(endRange)
MRComObject(allRange)
End Try
End Function
''' <summary>
''' 指定した名前でブックを保存する
''' </summary>
''' <param name="fileName"></param>
''' <returns></returns>
Public Function SaveBookBySpecificName(ByVal fileName As String) As String
Dim fFormat As Excel.XlFileFormat? = GetFileType(fileName)
If fFormat Is Nothing Then
Utils.Alert("Excelファイルフォーマットが正しくありません。xls、xlsx、xlsmの何れかを指定してください。")
ReleaseExcelObject()
Return String.Empty
End If
Try
_xlBook.SaveAs(Filename:=fileName, FileFormat:=fFormat)
Return fileName
Catch ex As Exception
ReleaseExcelObject()
Throw
End Try
End Function
''' <summary>
''' ブックを上書き保存する
''' </summary>
''' <returns></returns>
Public Function SaveBookOverWrite() As String
Dim fFormat As Excel.XlFileFormat? = GetFileType(_oridinalFilePath)
If fFormat Is Nothing Then
Utils.Alert("Excelファイルフォーマットが正しくありません。xls、xlsx、xlsmの何れかを指定してください。")
ReleaseExcelObject()
Return String.Empty
End If
Try
_xlBook.SaveAs(Filename:=_oridinalFilePath, FileFormat:=fFormat)
Return _oridinalFilePath
Catch ex As Exception
ReleaseExcelObject()
Throw
End Try
End Function
''' <summary>
''' ファイル名指定ダイアログを開き保存する
''' </summary>
''' <returns></returns>
Public Function SaveBookBySpecificDialog() As String
Dim specificFile As String = Utils.ShowXlsFileSaveDialog()
If String.IsNullOrWhiteSpace(specificFile) Then Return String.Empty
Dim fFormat As Excel.XlFileFormat? = GetFileType(specificFile)
If fFormat Is Nothing Then
Utils.Alert("Excelファイルフォーマットが正しくありません。xls、xlsx、xlsmの何れかを指定してください。")
ReleaseExcelObject()
Return String.Empty
End If
Try
_xlBook.SaveAs(Filename:=specificFile, FileFormat:=fFormat)
Return specificFile
Catch ex As Exception
ReleaseExcelObject()
Throw
End Try
Return False
End Function

Private Function GetFileType(ByVal filePath As String) As Excel.XlFileFormat
Dim fExtension As String = System.IO.Path.GetExtension(filePath).ToLower()
Dim fFormat As Excel.XlFileFormat
'拡張子に合せて保存形式を変更
Select Case fExtension
Case ".csv" 'CSV (カンマ区切り) 形式
fFormat = Excel.XlFileFormat.xlCSV
Case ".xls" 'Excel 97~2003 ブック形式
fFormat = Excel.XlFileFormat.xlExcel8
Case ".xlsx" 'Excel 2007~ブック形式
fFormat = Excel.XlFileFormat.xlOpenXMLWorkbook
Case ".xlsm" 'Excel 2007~マクロ有効ブック形式
fFormat = Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled
Case Else
End Select
Return fFormat
End Function

''' <summary>
''' Range、Cell以外のExcelオブジェクトを解放し、ブックを閉じる
''' </summary>
Public Sub ReleaseExcelObject()
MRComObject(_ActiveSheet)
MRComObject(_xlSheets)
_xlBook?.Close()
MRComObject(_xlBook)
MRComObject(_xlBooks)
_xlApp?.Quit()
MRComObject(_xlApp)
End Sub
Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)
If objCom Is Nothing Then
Return
End If
Try
If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
If force Then
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
Else
System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
End If
End If
Finally
objCom = Nothing
End Try
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean = False ' 重複する呼び出しを検出するには

' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not disposedValue Then
If disposing Then
' TODO: マネージ状態を破棄します (マネージ オブジェクト)。
ReleaseExcelObject()
End If
' TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下の Finalize() をオーバーライドします。
' TODO: 大きなフィールドを null に設定します。
End If
disposedValue = True
End Sub

' TODO: 上の Dispose(disposing As Boolean) にアンマネージド リソースを解放するコードが含まれる場合にのみ Finalize() をオーバーライドします。
'Protected Overrides Sub Finalize()
' ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
' Dispose(False)
' MyBase.Finalize()
'End Sub

' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
Public Sub Dispose() Implements IDisposable.Dispose
' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
Dispose(True)
' TODO: 上の Finalize() がオーバーライドされている場合は、次の行のコメントを解除してください。
' GC.SuppressFinalize(Me)
End Sub
#End Region

End Class