C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 29 を表示中)
■13773 / )  複数のEXCELファイルのシートを1EXCELのシートに統合
□投稿者/ イナフ (1回)-(2008/02/04(Mon) 19:31:24)

分類:[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

返信 編集キー/


管理者用

- Child Tree -