Začněte jednoduchou analýzou činnosti makra. Tato makro dělá 6000 * 5999 * 20 * 20 = cca 14,5 mld. porovnání hodnot. Přidejte si režii na načítání, ... To chvíli trvá.
Při průchodu jednotlivými řádky nemá smysl se vracet před aktuální řádek. Pokud se třeba řádek 1 shodoval s řádkem 2, tak se jistě bude shodovat řádek 2 s řádkem 1. Tedy
for c=a+1 to lastR ' a+1 radek az posledni
Napočtené shody budou poloviční, ale to by neměl být problém.
Nefektivní jsou i vnitřní dva cykly (400 porovnání). Pokud by byly pole cislaA a cislaB setříděné, bylo hledání shody mnohem efektivnější, mohlo by stačit průměrně cca 30 porovnání.
Asi bych si řádky setřídil v prvním průchodu, buď na stejném místě nebo na jiném, to zrychlení za to stojí. Tím máme cca 0,5 mld porovnání a polovinu čtení buněk.
Potom je tu otázka stylu programování - příliš mnoho operací s jednotlivými buňkami, neustálé načítání a zapisování. Určitě se vyplatí jedna operace nad celým blokem buněk, než řešit každou buňku zvlášť (nulování buněk na začátku lze nahradit vymazáním celé oblasti, načítání jednotlivých buněk načtením celého řádku, ukládání výsledků do pole a zápis teprve po zpracování řádku -> úvodní mazání je zbytečné,...).
Asi nejefektivnější bude načtení celého rozsahu 6000x20 buněk do pole, setřídění řádků a provedení všech testů v načteném poli, ukládání výsledků do druhého pole a po ukončení zápis výsledků do listu.