Я уже решил несколько других, используя Application.Index
с Application.WorksheetFunction.Match
и сокращенное время выполнения от 7-8 секунд до миллисекунд. Но я чувствую, что есть еще возможности для улучшения.
Должен ли я использовать массив с Index
и Match
?
Мне также сказали использовать Scripting.Dictionary
, но я ищу кого-то, кто может продемонстрировать, как сделать это прямо сейчас в этом сценарии. Потому что в моей голове я должен заполнить словарь циклом, прежде чем я смогу его использовать, поэтому не будет ли он похож на скорость?
'Production Quantity for Dashboard
For i = 2 To Total_rows_Prod
For j = 2 To Total_rows_Dash
If ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5) = ThisWorkbook.Worksheets("Dashboard").Cells(j, 1) Then
ThisWorkbook.Worksheets("Dashboard").Cells(j, 4) = ThisWorkbook.Worksheets("Dashboard").Cells(j, 4) + ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 31) / ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 4)
End If
Next j
Next i
После тестирования узких мест, как показано ниже (время выполнения кода показано в строке 10):
Тем не менее, при использовании Index
и Match
при использовании только 1 цикла for-next
как показано в приведенном ниже коде:
'Production Quantity for Dashboard
For i = 2 To Total_rows_Prod
m = Application.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0)
If Not IsError(m) Then
ThisWorkbook.Worksheets("Dashboard").Cells(Application.WorksheetFunction.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0), 4) = ThisWorkbook.Worksheets("Dashboard").Cells(Application.WorksheetFunction.Match(ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 5), ThisWorkbook.Worksheets("Dashboard").Range("A:A"), 0), 4) + ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 31) / ThisWorkbook.Worksheets("Prod. Qty.").Cells(i, 4)
End If
Next i
Время выполнения будет незначительным, как показано ниже (все еще в строке 10):
Последний раз, когда я смог запустить все с заменами Index
и Match
было 2 секунды:
Но на более медленном нетбуке с процессором Pentium Atom выполнение того же кода занимает 26 секунд. Поэтому мне интересно, есть ли способ сбить эти 26 секунд.
Любые улучшения, которые позволили бы минимизировать время выполнения, были бы хороши Что касается словарей, но я не знаю, как их применять, поскольку для них есть параметр Key
and Value
.Add
и в моей голове требуется 2 цикла for-next
чтобы сделать то же самое?