Я пытался оптимизировать следующий код:
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public rs2 As New ADODB.Recordset
Public strsQL$
…
For c = 9 To 50
strsQL = "some SQL query"
rs.Open strsQL, cn
For r = 2 To 1000
t = 0
If c <> 9 Then
For f = 9 To c - 1
t = t + Sheet9.Cells(8 + (r - 2) * 6, f)
Next f
End If
Set rs2 = rs.Clone
rs2.Find ("x='" & Sheet9.Cells(r, 2) & "'")
If rs2.EOF Then
Sheet9.Cells(r, c) = ""
Else
If rs2.Fields("Total").Value - t <> 0 Then
Sheet9.Cells(r, c) = rs2.Fields(1).Value - t
End If
End If
Next r
rs.Close
rs2.Close
Next c
cn.Close
Close Connection
Set rs = Nothing
Set cn = Nothing
Set rs2 = Nothing
И вот моя идея (или на самом деле, потому что она медленнее):
…
For c = 9 To 50
strsQL = "some SQL query "
rs.Open strsQL, cn
Do While rs.EOF = False
t = 0
If Not ThisWorkbook.Sheet9.Range("B:B").Find(what:=rs.Fields(0).Value,
LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then
P_row = ThisWorkbook.Sheet9.Range("B:B").Find(what:=rs.Fields(0).Value, LookIn:=xlValues, lookat:=xlWhole).Row
adr_1 = ThisWorkbook.Sheet9.Cells(P_row + 4, 9).Address
adr_2 = ThisWorkbook.Sheet9.Cells(P_row + 4, c - 1).Address
t = Application.WorksheetFunction.Sum(ThisWorkbook.Sheet9.Range(adr_1 & ":" & adr_2))
If rs.Fields(1).Value - t > 0 Then
Sheet9.Cells(P_row, c) = rs.Fields(1).Value - t
End If
End If
rs.MoveNext
Loop
rs.Close
Next c
cn.Close
Set rs = Nothing
Set cn = Nothing
Я не понимаю, почему время выполнения второго кода хуже.Первый код проходит через каждый столбец, и для каждого столбца открывается набор записей и просматривается каждая строка столбца B на рабочем листе, чтобы определить, включено ли значение строки в набор записей.Таким образом, даже если искомая строка не включена в набор записей, набор записей полностью ищется командой rs.find.Поскольку каждый набор записей имеет гораздо меньше записей, чем 1000, я был совершенно уверен, что для каждого столбца будет лучше пройти набор записей и поместить значения только для найденных записей, так как остальные можно оставить пустыми в любом случае.Но похоже, что это не так.
И я также использовал application.worksheetfunction.sum вместо суммирования в цикле, но я не ожидаю, что оно будет таким же значимым.
Может быть, кто-нибудь может помочь мне найти то, чтоне так с моим пониманием?