No myslím, že jestlis to pustil na excel s tisíci řádky, tak to pár minut muselo chroustat.
Základní zefektivnění by bylo v přidání Application.ScreenUpdating=False na začátek (před DO) a Application.ScreenUpdating=True na konec (před End Sub). Tím bys vypnul grafický výstup, makro by nemuselo nic vykreslovat - vykreslování zabere nejvíc času. Na druhou stranu bys neviděl, že "to něco dělá". Prostě by Excel na chvíli jakoby zamrznul a pak vyhodil výsledek naráz.
pak je tam taky spousta řádků Activecell.offset, kdy následně pracuji s hodnotou té buňky. To se dá napsat i efektivněji (nemusíš se napřed na tu buňku přepnout, abys pracoval s její hodnotou, můžeš se na ni odkazovat rovnou). Jenomže mně se to takto líp debuguje.
Dalo by se laborovat i s odstraněním DoEvents. Ten příkaz dovoluje počítači věnovat se i ostatním aktivitám mimo to Excel makro. U krátkých maker není potřeba, dlouhá makra bez něj tuhnou. Dost to celé makro zpomaluje ale je to stabilní.