我目前正在使用VBA运行存储过程并将已提取的数据存储到表中。然后,VBA将相应地查询数据中的所有数据并将其放入Excel中。
问题在于,VBA需要很长时间才能将所有数据(大约100k行数据)提取到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)
任何建议或想法都会非常感激。在此先感谢:)
答案 0 :(得分:4)
在Excel中填写10万行肯定需要时间。
这是你可以做的最小化时间
oxl.ScreenUpdating = False
,最后将其设置为True
。 Console.WriteLine("Added new sheet to workbook...")
是VB.net。如果您使用的是VBA,请使用Debug.print
。哪个是
.Columns("A").NumberFormat = "@"
.Columns("B").NumberFormat = "@"
'
'
'
.Columns("R").NumberFormat = "@"
.Columns("S").NumberFormat = "@"
作为
.Columns("A:S").NumberFormat = "@"
答案 1 :(得分:1)
最快的方法是CopyFromRecordset
。
来自MSDN:
expression.CopyFromRecordset(Data, MaxRows, MaxColumns)
expression
:必填。一个返回Range
对象的表达式。
Data
:必需的变体。要复制到的Recordset
对象的名称 范围。
MaxRows
:可选变体。要复制的最大记录数 工作表。如果省略此参数,则中的所有记录 Recordset对象被复制。
MaxColumns
:可选变体。要复制的最大字段数 到工作表上。如果省略此参数,则中的所有字段Recordset
对象被复制。
例如,在您的情况下只需键入:
Range("A2").CopyFromRecordset rs