Rozwiązałem już kilka innych Application.Index z Application.WorksheetFunction.Match i skrócony czas działania od około 7-8 sekund do milisekund. Ale czuję, że wciąż jest miejsce na poprawę.
Czy powinienem użyć tablicy z Index i Match?
Kazano mi też używać Scripting.Dictionary, ale szukam kogoś, kto może pokazać, jak to zrobić od razu w tym scenariuszu. Ponieważ w mojej głowie muszę zapełnić słownik pętlą, zanim będę mógł go nawet użyć, więc nie będzie to podobne pod względem szybkości?
'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
Po wykonaniu niektórych testów wąskiego gardła, jak pokazano poniżej (czas wykonywania kodu jest pokazany w wierszu 10): 
Jednak podczas używania Index i Match podczas gdy tylko używasz 1 for-next pętla jak pokazano w poniższym kodzie:
'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
Czas pracy byłby nieistotny, jak pokazano poniżej (nadal w rzędzie 10):
Ostatnim razem udało mi się uruchomić wszystko Index i Match wymiana trwała 2 sekundy:
Ale na wolniejszym netbooku z procesorem Pentium Atom wykonanie tego samego kodu zajmuje 26 sekund. Zastanawiam się, czy istnieje sposób na obniżenie tego o 26 sekund.
Wszelkie ulepszenia, które pozwoliłyby optymalnie zminimalizować czas, byłyby świetne. Biorąc pod uwagę słowniki, ale nie mam pojęcia, jak je zastosować, jest Key i Value parametr dla .Add w mojej głowie wymaga 2 for-next pętle, aby zrobić to samo?
Scripting.Dictionary z keys nie muszę biegać for-next pętla to zrobić? Wtedy będę musiał uruchomić inny for-next pętla, aby sprawdzić słownik .Exists? Podczas, gdy Index i Match powinien potrzebować tylko jednego for-next pętla do zrobienia całości. Pod względem szybkości, która jest szybsza?
Dictionary przegląda zamiast przeszukiwać całą kolekcję. Spojrzeć na ta odpowiedź na CR aby lepiej zrozumieć, o czym mówię.


IndexiMatchto najlepszy sposób na to. Zapisz odpowiednie klucze z arkusza, który chcesz dopasować wScripting.Dictionary, a następnie użyj.Existsjak będziesz przechodził przez drugą. Próba napisania VBA w taki sposób, jakby była to funkcja Excela, zazwyczaj nie jest sposobem na uzyskanie najlepszej wydajności.