Метод 1.
Если у вас есть dbo на SQL, тогда создайте временную таблицу и загрузите туда данные Excel.Сделайте это за один проход, используя эффективный метод построения строк (т. Е. Используйте Mid вместо замены, а не для конкатенации констант).Или используйте Integration для прямой загрузки данных.Запустите запрос и отбросьте данные обратно.Определите, какие ячейки необходимо отформатировать, и выполните их сразу (выполните цикл с Union, чтобы получить один большой диапазон).
Метод 2.
Используйте курсор на стороне клиента, загрузите все свои данныеиз SQL и используйте rs.Filter, чтобы найти соответствующую запись.Вы можете загрузить свои данные Excel в массив или отключенный набор записей и вернуть их обратно.
Важным моментом является отсутствие ненужной обратной записи в Excel.В Excel должно быть не более двух записей.
Что-то вроде (код не полностью протестирован)
Dim rsLocal As ADODB.Recordset ' create a local, disconnected recordset
Set rsLocal = New ADODB.Recordset
rsLocal.CursorLocation = adUseClient
rsLocal.Fields.Append "L", adVarChar, 1024, adFldIsNullable ' change to suit your data
rsLocal.Open
Dim myRange As Range
rs.CursorLocation = adUseClient
'bring all the records back into memory
Set rs = GetData("SELECT 'Checked', AT.Code Code FROM astAssetTypes AT JOIN astAssetTypesUDFV UDFV ON UDFV.TableLinkId = AT.Id WHERE UDFV.Userfield13Id = '5029' AND AT.Code = '")
For Each c In sht.Range("J3:J" & lrow)
rsLocal.AddNew
If c.Value <> "" Then
rs.Filter = "Code='" & c.Value & "'" 'use Filter to prevent lots of round trips
If rs.RecordCount <> 0 Then
rs.MoveFirst
rsLocal("L") = rs("Code")
'add the cells to the range as we go
If myRange Is Nothing Then
Set myRange = sht.Range(sht.cells(c.Row, "A"), sht.cells(c.Row, LCol))
Else
Set myRange = Union(sht.Range(sht.cells(c.Row, "A"), sht.cells(c.Row, LCol)), myRange)
End If
End If
End If
rsLocal.Update
Next
rsLocal.MoveFirst
sht.Range("L3").CopyFromRecordset rsLocal 'write all updates at once
With myRange.Font ' do all formatting at once
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.349986266670736
End With