Показанный код представляет собой подпрограмму, которая сравнивает данные в двух массивах и ищет номера счетов, которые появляются в одном списке, но отсутствуют в другом. Если он находит отсутствующий, он добавляет информацию об учетной записи в лист. В обычный день он находит 10-20 недостающих учетных записей из 2500-4000 записей в зависимости от того, как далеко мы продвинулись в течение месяца. Обработка цикла i занимает 15-20 минут. Взаимодействие с Листом минимально. Я не могу понять, как улучшить код, чтобы он работал быстрее. Предложения приветствуются.
For i = 1 To TempCount
If i Mod 5 = 0 Then DoEvents
FoundMatch = 0
percent = i / TempCount * 100
Application.StatusBar = "Checking for missing accounts. Processing row " & i & " of " & TempCount & " - " & percent & "%"
For y = 1 To OppListRow
If Saved_User_Input(i, 3) = AccountList(y, 3) Then
FoundMatch = 1
End If
Next
If FoundMatch = 0 Then
n = n + 1
Opportunities.Cells(n, 2) = Saved_User_Input(i, 1)
Opportunities.Cells(n, 3) = Saved_User_Input(i, 2)
Opportunities.Cells(n, 4) = Saved_User_Input(i, 3)
Opportunities.Cells(n, 5) = Saved_User_Input(i, 4)
Opportunities.Cells(n, 6) = Saved_User_Input(i, 5)
Opportunities.Cells(n, 7) = Saved_User_Input(i, 6)
Opportunities.Cells(n, 8) = Saved_User_Input(i, 7)
Opportunities.Cells(n, 9) = Saved_User_Input(i, 8)
Opportunities.Cells(n, 10) = Saved_User_Input(i, 9)
Opportunities.Cells(n, 11) = Saved_User_Input(i, 10)
Opportunities.Cells(n, 12) = Saved_User_Input(i, 11)
Opportunities.Cells(n, 13) = Saved_User_Input(i, 12)
Opportunities.Cells(n, 14) = Saved_User_Input(i, 13)
Opportunities.Cells(n, 15) = Saved_User_Input(i, 14)
Opportunities.Cells(n, 16) = Saved_User_Input(i, 15)
End If
Next
Было бы действительно полезно включить остальную часть вашего кода, чтобы мы могли сказать, что на самом деле представляет собой Saved_User_Input .... Это может быть диапазон или массив на основе вашего опубликованного кода.





Замените все ваших строк Opportunities.Cells на эту Один.
Opportunities.Cells(n, 2).Resize(1, 15).Value2 = WorksheetFunction.Index(Saved_User_Input, i, 0)
Редактировать (для устранения одного цикла)
Замените петлю ниже
For y = 1 To OppListRow
If Saved_User_Input(i, 3) = AccountList(y, 3) Then
FoundMatch = 1
End If
Next
со строками ниже
On Error Resume Next
foundMatch = WorksheetFunction.Match(Saved_User_Input(i, 3), WorksheetFunction.Index(AccountList, 0, 3), 0)
foundMatch = Abs(CBool(Err.Number = 0))
On Error GoTo 0
Правильно, ... .Resize + Index ?
Ты сделал это. Мне пришлось изменить (n, 2) на (n, 1), чтобы получить данные в правильные столбцы, но теперь это выполняется менее чем за 3 минуты. Спасибо!!
3 минуты для обработки 4-5 тыс. строк по-прежнему очень медленные.
Я должен был быть более конкретным в своем комментарии «менее 3 минут». Показанная здесь часть кода теперь выполняется менее чем за 60 секунд. Вещи, которые выполняются до того, как они тоже занимают немного времени. Когда я запустил его сегодня утром, все это было выполнено примерно за 90 секунд. Это огромное улучшение, и, хотя, безусловно, можно добиться большей эффективности, оно не стоит затраченных усилий. 90 секунд достаточно, чтобы что-то запускать несколько раз в неделю.
вы можете добавить
Exit ForпослеFoundMatch = 1, и я полагаю, что можно заменить последнюю часть одной строкой, вроде... .rows(n).columns("2:16") = ... (i)upd: не уверен насчет последнего, хотя