C# VB Web システム開発の部屋

システム開発で役に立つコードを厳選したブログです。

【VB.NET】複数のExcelファイルを一つのシートにまとめて保存する

 

サンプルコードの概要

  1. Excelデータをテーブル1に格納(OLEDB接続) 
  2. Excelデータをテーブル2に格納(OLEDB接続) 
  3. 1.2で取得したテーブルをマージする 
  4. マージしたテーブルを二次元配列に格納する 
  5. 4をExcelファイルに保存する 

 

サンプルコード

Dim strExcel1 As String = '1つ目のエクセルファイルのパス'
Dim strExcel2 As String = '2つ目のエクセルファイルのパス'

Dim dtlExcel1 As DataTable = New DataTable 
Dim dtlExcel2 As DataTable = New DataTable
Dim OleDDa As System.Data.OleDb.OleDbDataAdapter 
Dim OleCon As System.Data.OleDb.OleDbConnection

Try
   'Excelデータをテーブル1に格納(OLEDB接続文字) 
   OleCon = New System.Data.OleDb.OleDbConnection & _
           ("provider=Microsoft.ACE.OLEDB.12.0; data source=" + strExcel1 + ";Extended Properties=""Excel 12.0;IMEX=1""") 
   OleDDa = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", OleCon) 
   OleDDa.Fill(dtlExcel1)
Catch ex As Exception 
   If OleCon.State <> ConnectionState.Closed Then 
       OleCon.Close() 
   End If 
End Try

Try 
   'Excelデータをテーブル2に格納(OLEDB接続文字) 
    OleCon = New System.Data.OleDb.OleDbConnection & _
             ("provider=Microsoft.ACE.OLEDB.12.0; data source=" + strExcel2 + ";Extended Properties=""Excel 12.0;IMEX=1""") 
    OleDDa = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", OleCon) 
    OleDDa.Fill(dtlExcel2) 
Catch ex As Exception 
    If OleCon.State <> ConnectionState.Closed Then 
        OleCon.Close() 
    End If 
End Try

 'テーブル(エクセルの行)をマージする 
 dtlExcel1.Merge(dtlExcel2)
 
 'テーブルを二次元配列に格納する 
 Dim data(dtlExcel1.Rows.Count - 1, dtlExcel1.Columns.Count - 1) As String 
 For y As Integer = 0 To dtlExcel1.Rows.Count - 1 
    For z As Integer = 0 To dtlExcel1.Columns.Count - 1 
        data(y, z) = dtlExcel1.Rows(y)(z).ToString
    Next 
 Next
 
 Dim excelApp As New Excel.Application() 
 Dim bk As Excel.Workbook = excelApp.Workbooks.Add() 
 Dim sheet As Excel.Worksheet = bk.Worksheets(1) 

 '保存確認のダイヤログを表示しない
 excelApp.DisplayAlerts = False
 
 'データを貼り付ける 
 Dim range As Excel.Range = Nothing 
 Dim range1 As Excel.Range = Nothing 
 Dim range2 As Excel.Range = Nothing

 Try
    '列名を表示する場合は記述 
    sheet.Cells(1, 1) = "列名1" 
    sheet.Cells(1, 2) = "列名2" 
    sheet.Cells(1, 3) = "列名3"
      ・
      ・
      ・


    Dim startX As Integer = 1 
    Dim startY As Integer = 2 
    
    '始点
    range1 = DirectCast(sheet.Cells(startY, startX), Excel.Range) 
    '終点 
    range2 = DirectCast(sheet.Cells(startY + UBound(data), startX + UBound(data, 2)), Excel.Range) 
    'セル範囲 
    range = sheet.Range(range1, range2) 
    '貼り付け 
    range.Value = data 
    '列の一番長いセルのセル幅に自動調整
    range.EntireColumn.AutoFit()
    '保存する 
    bk.SaveAs('保存先のファイルパス'.xlsx)
    
    bk.Close() 
    excelApp.Quit()
Catch 

Finally 

'解放 
If Not range Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(range) range = Nothing
End If
If Not range1 Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(range1) range1 = Nothing 
End If
If Not range2 Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(range2) range2 = Nothing 
End If
If Not sheet Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet) sheet = Nothing 
End If
If Not bk Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(bk) bk = Nothing 
End If
If Not excelApp Is Nothing Then 
   System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp) excelApp = Nothing 
End If

GC.Collect() 

End Try

'元ファイルを削除 
File.Delete(strExcel1)
File.Delete(strExcel2)

VB.NET