0

現在、VBAを使用して、テーブルに抽出されたストアドプロシージャとストアドデータを実行しています。次に、VBAはそれに応じてデータ内のすべてのデータをクエリし、Excelに配置します。

ここで問題となるのは、VBAがすべてのデータ(約10万行のデータ)をExcelに抽出するのに非常に長い時間がかかることです。プロセスをスピードアップする他の方法はありますか?以下は私のコードの一部です。太字のものは、Excelコードへの挿入です。

'Row number where data inserting starts
        Do
            current_sheet = owb.ActiveSheet

            With current_sheet
                'Insert header to worksheet in first row, ie. A1, B1, C1
                For i = 0 To data_cols.GetLength(0) - 1
                    cell = data_cols(i, 0) & header_row_num 'Change to header_row_num
                    .Range(cell).Value = data_cols(i, 1)
                Next i
            End With

            row_count = header_row_num + 1 'Change the first row count to a row after header_row_num
            'Insert data to worksheet
            While rs.EOF = False

                With current_sheet
                    'Set format of specic columns before inserting data

                    .Columns("A").NumberFormat = "@"

                    .Columns("B").NumberFormat = "@"

                    .Columns("C").NumberFormat = "@"

                    .Columns("D").NumberFormat = "@"

                    .Columns("E").NumberFormat = "@"

                    .Columns("F").NumberFormat = "@"

                    .Columns("G").NumberFormat = "@"

                    .Columns("H").NumberFormat = "@"

                    .Columns("I").NumberFormat = "@"

                    .Columns("J").NumberFormat = "@"

                    .Columns("K").NumberFormat = "@"

                    .Columns("L").NumberFormat = "@"

                    .Columns("M").NumberFormat = "@"

                    .Columns("N").NumberFormat = "@"

                    .Columns("O").NumberFormat = "@"

                    .Columns("P").NumberFormat = "@"

                    .Columns("Q").NumberFormat = "@"

                    .Columns("R").NumberFormat = "@"

                    .Columns("S").NumberFormat = "@"

                    **'Start inserting data
                    For i = 0 To data_cols.GetLength(0) - 1
                        'Get the cell name
                        cell = data_cols(i, 0) & row_count
                        'Populate data to the cell
                        If IsDBNull(rs.Fields(data_cols(i, 2)).Value()) Then
                            .Range(cell).Value = " "
                        Else
                            .Range(cell).Value = rs.Fields(data_cols(i, 2)).Value()
                        End If
                    Next i
                End With
                rs.MoveNext()
                'Indicates next row
                row_count += 1**

                If row_count > 60000 Then
                    owb.Worksheets.Add(, current_sheet)
                    need_new_sheet = True
                    Console.WriteLine("Added new sheet to workbook...")
                    Exit While
                Else
                    need_new_sheet = False
                End If

            End While
        Loop While (need_new_sheet And rs.EOF = False)

特定の変数の場合、あなたは知る必要があります。

row_count = header_row_num + 1 'Change the first row count to a row after header_row_num

oxl = CreateObject("Excel.Application")
    oxl.Visible = False
    owb = oxl.Workbooks.Add

Dim data_cols(,) As String = {{"A", "Name", "NAME"}, _
                           {"B", "Age", "AGE"}}  (Not real columns, example)

アドバイスやご意見をいただければ幸いです。前もって感謝します :)

4

2 に答える 2

4

Excelで10万行を埋めるには、間違いなく時間がかかります。

これはあなたが時間を最小限に抑えるためにできることです

  1. oxl.ScreenUpdating = Falseマクロの最初で使用しTrue、最後に設定します。
  2. データを配列に格納してから、最後に一度に配列をExcelに書き込むことをお勧めします。これにより、実行時間が確実に短縮されます
  3. Excel 2007以降Excelには1048576行の行制限があるため、その制限を超える場合は、それを考慮に入れることをお勧めします。
  4. Console.WriteLine("Added new sheet to workbook...")VB.netです。VBAを使用Debug.printしている場合に使用します。
  5. ところで、これは速度に大きな影響はありませんが、次のコードを書くことができます

これは

.Columns("A").NumberFormat = "@"
.Columns("B").NumberFormat = "@"
'
'
'
.Columns("R").NumberFormat = "@"
.Columns("S").NumberFormat = "@"

なので

.Columns("A:S").NumberFormat = "@"
于 2012-07-27T04:24:57.980 に答える
1

最速の方法はCopyFromRecordsetです。

MSDNから:


expression.CopyFromRecordset(Data, MaxRows, MaxColumns)

expression: 必須。Rangeオブジェクトを返す式。

Data:必要なバリアント。Recordset範囲にコピーするオブジェクトの名前。

MaxRows:オプションのバリアント。ワークシートにコピーするレコードの最大数。この引数を省略すると、Recordsetオブジェクト内のすべてのレコードがコピーされます。

MaxColumns:オプションのバリアント。ワークシートにコピーするフィールドの最大数。この引数を省略すると、 Recordsetオブジェクト内のすべてのフィールドがコピーされます。


たとえば、あなたの場合は次のように入力します。

Range("A2").CopyFromRecordset rs
于 2013-01-13T19:16:48.757 に答える