Zpracování pár tisíc řádků by ve vba nemělo trvat víc jak několik vteřin.
Součástí maker je kumulativní aktualizace listu. To se v power query nedělá snadno, bylo by nutné spojovat dva světy. Úprava maker by nemusela být až tak složitá.
Hlavní? problémy maker, pár příkladů.
1. Zbytečný a časově drahý kód
* filtr čísel ve sloupci K - proč to neudělat v sql dotazu??? Dotaz může data také seřadit.
* sub OznacKArchivaci je zbytečná. Řádky už označeny jsou - v "O" je "Uzavřeno"
* Používání metody Aktivate a Select je v naprosté většině případů zbytečné (a pomalé)
* Nesmyslný kód. Ve funkci Najdi:
For Each Bunka In Selection
jmeno = Bunka.Value 'uloz do promene
bun = Bunka.Address
Next Bunka
Tenhle kód si zapamatuje adresu a obsah poslední buňky ve výběru. Smysl nechápu.
* zase v Najdi:
Vyhoď
Application.ScreenUpdating = True
Tady to povolí zobrazení po každém hledání...
Zkontroluj i ostatní funkce. To má být jen tak, kde je to opravdu nutné (na konci obsluhy tlačítka).
2. Pomalé operace
* identifikace objektu "proléza" pokaždé celý strom objektů (pomalé). Místo:
ThisWorkbook.Worksheets("souhrn").Activate
For i = Range ...
If Cells(i, 1) ...
používej With např.:
With ThisWorkbook.Worksheets("souhrn")
For i = .Range("B"...
If .Cells(i, 1 ...
Mimochodem, i takový kód je také dost pomalý.
* procházení buněk pomocí
Cell.Offset(1, 0).Select - použij index řádku, nebo metodu .Find, nebo ještě lépe nahraj data sloupce do pole a pak hledej v tomto poli (při dobrém kódu to je v nejhorším případě stejně rychlé, jako Find),
3. Pomalé algoritmy.
* Mazaní, kopírování - doba málo závisí na velikosti bloku, ale hodně na jejich počtu -> je výhodné seskupit archivované řádky do jednoho bloku -> setřídit tabulku tak, aby mazané/kopírované řádky byly v co nejmenším počtu bloků a ty pak vyšejit jediným příkazem.
* Nesmyslný kód:
Set Naj = Sheets("souhrn").Range(sadre).Find(What:=jmeno, SearchOrder:=xlByRows) 'hledá označené HNV
P001 = Sheets("souhrn").Range(Naj.Address).Offset(0, 1).Value 'vytvořeno
P002 = Sheets("souhrn").Range(Naj.Address).Offset(0, 17).Value 'množství
Raději?
Set Naj = Sheets("souhrn").Range(sadre).Find(What:=jmeno, SearchOrder:=xlByRows) 'hledá označené HNV
' + ošetření chyby
With Naj
P001 = .Offset(0, 1).Value 'vytvořeno
P002 = .Offset(0, 17).Value 'množství
nebo ještě rychleji
Dim data() As Variant
' hledej HNV
Set Naj = Sheets("souhrn").Range(sadre).Find(What:=jmeno, SearchOrder:=xlByRows) 'hledá označené HNV
If Naj Is Nothing Then GoTo Konec ' Konec najdi.
data = Naj.Resize(1, 68).Value
P001 = data(1, 2) 'vytvořeno
P002 = data(1, 18) 'množstvícitovat