【发布时间】:2018-06-25 20:48:33
【问题描述】:
我有以下代码从内存写入电子表格的行\列。 如果有 200 条记录,则需要几分钟。 我不明白为什么它应该那么慢,因为没有磁盘 I/O。一切都应该发生在记忆中。所以为什么要花几分钟让我很困惑。
关于如何使其更快的任何想法? Offset是罪魁祸首吗? 顺便说一句,TagValues 是一个二维数组。
Private Sub PopulateGrid()
Dim i As Integer
Dim r As Range
Dim RowOffset As Integer
Dim CurRow As Integer
Dim StartCol As String
RowOffset = 15
StartCol = "B"
MsgBox "Grid population will start after you press OK. This might take a few minutes. Please wait while we populate the grid. You will be alerted when completed."
Set r = ActiveSheet.Range("B16")
For i = 1 To TotalRecords
CurRow = RowOffset + i
Set r = ActiveSheet.Range(StartCol + CStr(CurRow))
r.Value = TagValues(i, cTagNo)
Set r = r.Offset(0, 1)
r.Value = Qty(i)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cSize)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cValveType)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cBodyStyle)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cPressureClass)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cOperator)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cEndConfiguration)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cPort)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cBody)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cTrim)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cStemHingePin)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cWedgeDiscBall)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cSeatRing)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cORing)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cPackingSealing)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cGasket)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cWarrenValveFigureNo)
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cWarrenValveTrimCode)
Set r = r.Offset(0, 1)
r.Value = RemoveLastLineBreakAndTrim(TagValues(i, cComments))
Set r = r.Offset(0, 1)
r.Value = TagValues(i, cDelivery)
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = ""
Set r = r.Offset(0, 1)
r.Value = Price(i)
Set r = r.Offset(0, 1)
r.Value = ExtPrice(i)
Next
MsgBox "Grid Population completed."
End Sub
【问题讨论】:
-
这不会发生在内存中,每次引用工作表时都会减慢代码速度。如果您想加快速度,您将需要使用变体数组并一次将数组分配给范围。
-
例如您可以跳过整个循环并将每一列作为一个整体分配:
ActiveSheet.Range("B16").Resize(TotalRecords).Value = Application.Index(TagValues,0,cTagNo)