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ę.
Index
iMatch
to najlepszy sposób na to. Zapisz odpowiednie klucze z arkusza, który chcesz dopasować wScripting.Dictionary
, a następnie użyj.Exists
jak 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.