< návrat zpět

MS Excel


Téma: Makro pro zpracování tisíců řádků rss

Zaslal/a 20.12.2022 11:15

Dobrý den, mám jeden problém (viz přiložený soubor a popis v něm). Jedná se o zpracování tisíců řádků dat a pokud to řeším přes mé znalosti, tak celé makro trvá přes půl hodiny ... děkuji moc za pomoc

Příloha: 7z54135_reklam.7z (350kB, staženo 18x)
Zaslat odpověď >

icon #054136
avatar
Asi by som, minimálne na nejakú časť toho riešenia, miesto VBA využil možnosti Power Query. Píšeš, že vo VBA to beží, síce pomaly, ale beží. Tak asi to ešte chvíľu vydržíš a nemusíš strácať čas optimalizáciou kódu. Filtrovanie a triedenie dát PQ zvláda celkom dobre, tak by som sa vybral touto cestou, ale je to môj názor, nebudem Ti ho vnucovať.citovat
#054141
elninoslov
Makro sa dá urobiť veľmi rýchle. Používate strašne pomalý postup - z bunky do bunky a ešte ich aj označujete. Treba to prerobiť do polí. Na prvý pohľad nevidím nejaké komplikácie, prečo by to malo ísť po prerobení pomaly. Niektoré veci sú tam doslova zbytočné, napr. cyklus v "Najdi" podľa mňa len spomaľuje. Uvidím podľa času, ale takéto niečo to musí fičať...
Pomaly to začnem analyzovať, tak dúfam, že to nepotrebujete do Vianoc, páč mám roboty jak nasranej...citovat
#054142
avatar
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
#054143
avatar
Pokud by u nás IT fungovalo, jak má, tak je to bez problémů - ale klasika - je jich málo. Takhle mám alespoň šanci se něco naučit.

V první řadě musím říct, že kódy nepíšu, ale hledám, učím se je a používám - díky tomu jsou tedy má makra složená z menších a výsledkem pomalejší.
Teď už se pomalu dostávám do stádia, kdy se budu muset pořádně zaměřit na detaily a naučit se zase něco víc.
U jednoduchých věcí není problém, že je makro pomalejší, když je to stále počítáno ve vteřinách, ale když je toho pak více ...

Když jsem chodil do školy, tak začínal Basic a teď na stará kolena se učím VBA :)

Do Vánoc to určitě nepotřebuji - letos jsem v práci naposledycitovat
#054144
avatar
Jak píše El Nino, pomocí polí je možné toto významně urychlit. Já měl fakt optimalizované makro bez polí, které potřebovalo přes 40 minut. Poté co jsem použil pro řešení pole, tak na to stačily 3 minuty. Ale bylo potřeba nejdřív nastudovat ty dynamické arraye a jejich vrtochy (např. že nejdřív se dynamická 2D array musela transponovat aby s ní šlo pracovat a na konci zase transpozice zpět). Přehled jednotlivých proměnných při ladění kódu s použitím array je uživatelsky mnohem méně přívětivý než u "klasiky"citovat
#054199
avatar
Zdravím, pomůže někdo prosím?
Práce s poli je pro mne velkou neznámou ...citovat
#054206
avatar
Nastuduj práci s poli. Nejprve základy:

https://office.lasakovi.com/excel/vba-teorie-zaklady/excel-vba-pole/

Využití 2D dynamických polí pro práci s oblastí dat - v textu je řada užitečných procedur (načtení oblasti do pole, zápis pole do oblasti, zjištění rozměrů pole, transformace 2D pole, ...):

https://www.rjurecek.cz/excel/navody-a-postupy-pro-praci-v-excelu/dvourozmerne-pole-a-oblasti/citovat
#054218
Stalker
Přikládám svůj pokus, není to kompletní. Chybí řazení na listě reklamace a vymazání listu souhrn. Nevím zda odstranit celý list, nebo jen data bez hlavičky, nebo i hlavičku.
Příloha: rar54218_reklamace.rar (355kB, staženo 6x)
citovat
#054228
avatar
Mnohokrát děkuji!!!

Vymazání listu souhrn jsem doplnil. Vše funguje jak má.citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse

Čas od do

lubo • 19.4. 16:30

Makro smyčka

MilanKop • 19.4. 10:46

Makro smyčka

elninoslov • 19.4. 9:02

Čas od do

elninoslov • 19.4. 8:46

Čas od do

jarek1111 • 18.4. 13:46

Čas od do

lubo • 18.4. 11:13

Čas od do

jarek1111 • 18.4. 8:32