将Excel 2010和SQLServer与ActiveX DataObjects 2.8一起使用
我正在从SQL数据库到Excel工作表检索大约100条记录(每次变量没有行)。查询本身运行得很快(我看到状态栏在返回时会发生变化),但是填充excel表需要很长时间 - 即使关闭ApplicationUpdating也是如此。
我正在做的是循环返回的记录集中的每一行并设置单个单元格的值。
是否有比遍历记录集中每个行和字段更快的方法。
以下是VBA的片段:
Application.StatusBar = "Getting shipment data..."
statement = "exec [SalesTax].[dbo].[GetShipmentsSummary] " & _
"@JobNo = '" & JobNo & "'"
Set rs = conn.Execute(statement)
If (rs.BOF And rs.EOF) Then
MsgBox ("No shippment records were found for JobNo: " & JobNo)
Exit Sub
End If
rs.MoveFirst
Application.StatusBar = "Got shipment data. Processing..."
Application.ScreenUpdating = False
' Get each row and set cells to appropriate fields
Do While Not rs.EOF
' Now insert the shipment data for this row
Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo)
CurrRange.Value = rs("State")
Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 1)
CurrRange.Value = CStr(rs("FirstZIP"))
Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 2)
CurrRange.Value = CStr(rs("StateCount"))
Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 3)
CurrRange.Value = rs("StatePercentage")
CurrRowNo = CurrRowNo + 1
rs.MoveNext
Loop
conn.Close
Set conn = Nothing
Set cmd = Nothing
Application.ScreenUpdating = True
Application.StatusBar = "Ready"
退出子
谢谢Mark
答案 0 :(得分:3)
您可以使用
将完整记录集分配给数组,而不是遍历每条记录arrData = rs.GetRows
但是,您可能需要转置此数组才能输出到Excel范围。
如果您只需要在工作表范围内使用
,则另一种选择outputRng.CopyFromRecordset rs
其中outputRng是范围对象。
Ps - 重置状态栏应为Application.Statusbar = False
。
答案 1 :(得分:0)
编写电子表格的最快方法是直接编写csv文件 - 它只是一个文本文件,而且非常简单 - 你没有格式化,公式等等(虽然你没有出现使用它们)
但是,您绝不应该使用任何服务器上的Microsoft ActiveX控件。它不受支持cf. Limitations of Office Web Components when used server-side,如果您将其投入生产,您几乎肯定会遇到问题。
有一个商业库和免费库都不依赖于ms ActiveX,这使得这项任务在服务器或工作站上变得简单明了。 StackOverflow似乎对库和框架建议不屑一顾。
ADDED
大多数第三方库也比使用Office Automation快得多。
ADDED
我链接了错误的文章。应该是Considerations for server-side Automation of Office不要在服务器上使用办公自动化组件。我个人被要求由这样做的公司多次解决这个问题。它可以正常工作一段时间然后完全崩溃,但如果你有一个活动服务器,它很可能会很快遇到问题。
答案 2 :(得分:0)
您是否尝试过关闭自动计算?
关闭ScreenUpdating和Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
完成填充表格后重新打开它。
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
希望这有帮助。