QA@IT
«質問へ戻る

質問を投稿

【VB6】エクセルでコピーのループを行うと処理速度が遅くなる

VB6の質問です。
開発環境は
OS:WindowsXP SP2
Microsoft Office2000
言語:VB6 SP6
です。

VB6で作成したRecordsetのデータをループで
エクセルに貼り付けるというプログラムを作成したのですが、
エクセルのRangeのコピーの処理がループを重ねる度に遅くなっていきます。

ソースは下記のとおりです。
------------------------------------------------------------------------------
Dim rs As ADODB.Recordset
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlCopyRange As Excel.Range
Dim lngLine As Long 'ページにおけるライン(レコード)数

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("c:\ExcelFile.xls")
Set xlSheet = xlBook.Worksheets(1)

xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False
xlApp.EnableAnimations = False
xlApp.EnableAutoComplete = False
xlApp.EnableEvents = False

*************************************
ここにRecordset取得処理が入ります。
*************************************

With xlSheet
    .EnableAutoFilter = False
    .EnableCalculation = False
    .EnableOutlining = False
    .EnablePivotTable = False

    Set xlCopyRange = .Rows("1:1"))
    lngline = 1
    Do Until rs.EOF

        lngLine = lngLine + 1

        'セルの形式をコピー
        xlCopyRange.Copy .Rows(CStr(lngline) & ":" & CStr(lngline))

        rs.MoveNext

    Loop
End With

Set xlSheet = Nothing
Set xlBook = Nothing

xlApp.Quit
Set xlApp = Nothing

------------------------------------------------------------------------------
実際にはセルの形式をコピーした後にRecordsetのデータを貼り付けるのですが、
現在Copyの処理だけでも処理時間が遅くなります。
Timer関数で計ったところ実行直後は0.03秒程度だったコピーの処理時間が
100回くらいループが回ったところで1秒ほどまで遅くなります。
最終的には2000件くらいのデータを扱いたいのでこれでは実用に耐えません。

プログラムの書き方が悪いのか、それとも何か設定があるのかも分からない状態で
ネットで検索してもエクセルのコピーのプログラムはあるのですが、
処理時間まで言及しているHPが見つかりませんでした。

よろしくお願いします。

質問者:SIC

VB6の質問です。
開発環境は
OS:WindowsXP SP2
   Microsoft Office2000
言語:VB6 SP6
です。

VB6で作成したRecordsetのデータをループで
エクセルに貼り付けるというプログラムを作成したのですが、
エクセルのRangeのコピーの処理がループを重ねる度に遅くなっていきます。

ソースは下記のとおりです。
\------------------------------------------------------------------------------
Dim rs          As ADODB.Recordset
Dim xlApp       As Excel.Application
Dim xlBook      As Excel.Workbook
Dim xlSheet     As Excel.Worksheet
Dim xlCopyRange As Excel.Range
Dim lngLine     As Long             'ページにおけるライン(レコード)数

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("c:\ExcelFile.xls")
    Set xlSheet = xlBook.Worksheets(1)

    xlApp.ScreenUpdating = False
    xlApp.DisplayAlerts = False
    xlApp.EnableAnimations = False
    xlApp.EnableAutoComplete = False
    xlApp.EnableEvents = False

\*************************************
    ここにRecordset取得処理が入ります。
\*************************************

    With xlSheet
        .EnableAutoFilter = False
        .EnableCalculation = False
        .EnableOutlining = False
        .EnablePivotTable = False

        Set xlCopyRange = .Rows("1:1"))
        lngline = 1
        Do Until rs.EOF

            lngLine = lngLine + 1

            'セルの形式をコピー
            xlCopyRange.Copy .Rows(CStr(lngline) & ":" & CStr(lngline))

            rs.MoveNext

        Loop
    End With

    Set xlSheet = Nothing
    Set xlBook = Nothing

    xlApp.Quit
    Set xlApp = Nothing
\------------------------------------------------------------------------------
実際にはセルの形式をコピーした後にRecordsetのデータを貼り付けるのですが、
現在Copyの処理だけでも処理時間が遅くなります。
Timer関数で計ったところ実行直後は0.03秒程度だったコピーの処理時間が
100回くらいループが回ったところで1秒ほどまで遅くなります。
最終的には2000件くらいのデータを扱いたいのでこれでは実用に耐えません。

プログラムの書き方が悪いのか、それとも何か設定があるのかも分からない状態で
ネットで検索してもエクセルのコピーのプログラムはあるのですが、
処理時間まで言及しているHPが見つかりませんでした。

よろしくお願いします。

質問者:SIC