|
分類:[VB.NET/VB2005]
OS:XP 開発環境:VS2003
いつも拝見させて頂き非常に参考になり助かっております。
現在、フォルダ配下に存在する各EXCELファイルのシートを一つのEXCELファイルにまとめようとしております。 フォルダ配下に存在するEXCELを開きながらシートを読みこみ、新規に作成した統合用のEXCELファイルに シートをコピーしていっておりますが、コピーするファイルが多い場合に非常に時間が掛かってしまいます。 シートをコピーするする度に前回のコピー時間より倍程の時間が掛かるようになり、30ファイルともなりますと 数十分も掛かってしまいます。 なんとかシートのコピー処理を高速化する方法はないものでしょうか?
下記が処理コードになります。 ※Try〜FinallyでのCOM開放は見て頂きやすいように省いております。
Public Sub CreateXlsUnityFile(ByVal unityFolder As String, ByVal unityFile As String)
Dim xlApplication As Excel.Application
'COM生成 xlApplication = New Excel.Application
' 警告メッセージなどを表示しないようにする xlApplication.DisplayAlerts = False
'新規Booksの生成 Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
'新規Bookの生成 Dim xlNewBook As Excel.Workbook = xlBooks.Add()
'新規Sheetsの生成 Dim xlNewSheets As Excel.Sheets = xlNewBook.Worksheets
'新規Sheetの生成 Dim xlNewSheet As Excel.Worksheet = DirectCast(xlNewSheets(1), Excel.Worksheet)
'ディレクトリにあるEXCELのシートを新規EXCELにコピーする Dim files As String() = System.IO.Directory.GetFiles(unityFolder) Dim file As String For Each file In files
'コピー元Bookの取得 Dim xlBook As Excel.Workbook = xlBooks.Open(file)
'コピー元Sheetsの取得 Dim xlSheets As Excel.Sheets = xlBook.Worksheets
'コピー元Sheetの取得 Dim xlSheet As Excel.Worksheet = xlSheets(1)
'シート名を変更 Dim sheetName As String = System.IO.Path.GetFileNameWithoutExtension(file)
'シート名に設定可能な31バイトを超える場合は名称を編集する If LenB(sheetName) <= 31 Then xlSheet.Name = sheetName Else xlSheet.Name = Left(sheetName, 3) & sheetName.Substring(sheetName.IndexOf("(")) End If
'※シートをコピー Dim t1 As Integer = System.Environment.TickCount xlSheet.Copy(xlNewSheet) Debug.WriteLine("" & System.Environment.TickCount - t1)
'開放処理 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
'コピー元ブックを閉じる xlBook.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
Next
'不要シートの削除 Call DeleteSheet(xlNewSheets, "Sheet1") Call DeleteSheet(xlNewSheets, "Sheet2") Call DeleteSheet(xlNewSheets, "Sheet3")
'ブックの保存 xlNewBook.SaveAs(unityFile)
'シートの開放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheets)
'ブックを閉じる xlNewBook.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewBook)
'ブックス開放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
'終了処理 xlApplication.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
End Sub
|