
Rövid szemléltető az excel makró sebességéről
Ha már tudod, hogy mire jó az excel makró vagy már meg is írtad életed első makróját, akkor felmerülhet a kérdés, hogy mégis mennyivel lehet ez gyorsabb mint a manuális kattintgatás?
Konkrét példával szemléltetve lemértem, hogy manuálisan mennyi ideig tart megszámoznom 10 ezer sort egy teljesen új excel munkalapon, ahol még semmi nincs. Azaz a szemléltetési feladat, hogy „A” oszlopban 1-től 10000-ig legyenek a számok beírva sorfolytonosan, 10. sorba 10, 1293. sorban 1293 legyen beírva és így tovább.

Kézzel 10 ezer sort megszámozni ennyi időbe telt: 24,833 mp
A módszer az volt, hogy az első 3 sorszám beírása után „lehúztam” egérrel 10000-ig a számozást

Excel makróval ennyi ideig tartott: 0,015625 mp, azaz 15 ezred másodperc
Az excel makró megíratása, fájlba beillesztése és futtatása nulláról eddig tartott: 1 perc 15 másodperc
Nézd meg, hogy az Ingyenes ChatGPT-be ezt írtam be
Írj egy Excel VBA makrót amit elindítva az A1 cellától az A10000 celláig bezárólag megszámozza a sorokat a lehető leggyorsabban.
Kód amit kiírt nekem:
====================
Sub SorokSzamozasaGyorsan()
Dim i As Long
Dim arr(1 To 10000, 1 To 1) As Long
'Tömb feltöltése memóriában
For i = 1 To 10000
arr(i, 1) = i
Next i
'Egyetlen művelettel kiírás a munkalapra
Range("A1:A10000").Value = arr
End Sub
====================
Ezt bemásoltam az excelbe és le is futtattam.
Hova kell bemásolni és mit kell nyomkorászni, itt megtalálod:
https://excelmakrobaratok.hu/irjuk-meg-eleted-elso-makrojat/
Elmondhatjuk tehát, hogy a makró írásába fektetett idő már a 3. alkalommal megtérült, mert a makró megíratása és beállítása 1 perc 15 másodperc volt, és kézzel pedig 25 másodperc alatt végeznénk el a műveletet. A makró megírása után MINDEN alkalommal több mint 1,5 millió százalékkal (1 589 312 %) gyorsabban lehet elvégezni a feladatot a manuális munkavégzéshez képest.
Ez azt jelenti, hogy pl egy 6 órás feladatot excel makróval akár 1,36 sec alatt meg tud csinálni a számítógép PONTOSAN, képlethiba nélkül és sorcsúszás nélkül. Persze nagyon béna feladat lenne, ha 6 órán keresztül csak számokat húzgálnánk 10 ezerig, de elméletileg ilyen gyorsítást érnénk el 🙂 Gyakorlatban pl 8 órás heti feladatot 9 percre le tudtam rövidíteni, embertelen mennyiségű adatot feldolgozva, 100%-os pontossággal. Mindig.
Ez havi közel 4 munkanap megtakarítást jelent!
Te mire használnád a fennmaradó idődet? 🙂
Csak két kattintásnyi idő, ugyan mi férhet bele?
Az alábbi képen látszódik, hogy egérrel 2 klikkelésem között hány millisecundum telt el.

Legkevesebb 158 ms legtöbb 179 ms volt, átlag 169 ms. 1000 ms van egy másodpercben, tehát 1 secundum alatt kb majdnem 6 alkalommal tudok kattintgatni, 7 kattintás az 1183 ms-ra jön ki így.
Lentebb látni fogjuk, hogy az excel makró KETTŐSZÁZ MILLIÓIG el tud számolni, amíg 7-et kattintok
Érdekesség: Hét kattintásnyi idő, kb 1 sec mire elég?
Az egyes programozási nyelvek eltérő mennyiségű műveletet képesek elvégezni ugyanazt a számítógépet használva változatlan idő alatt.
Tehát esetünkben a számítógép ugyanaz, csak a programozási nyelv változik.
Az alábbi táblázat azt mutatja meg, hogy eltérő programozási nyelvek ugyanazt a számítógépet használva mennyi idő alatt számolnak el 1, 10, 100 millióig majd 1 Milliárdig egyesével. Egy összeadást vegyünk egy műveletnek.
A nagyságrendeket még tudatosítani szeretném, hogy mekkora számokról van szó:
1 Millió másodperc az ~11,57 naptári nap,
1 Milliárd másodperc ~31,7 !!ÉV!!
Szóval a táblázat, ahol „csak” annyi volt a számítógép dolga, hogy elszámoljon valameddig és kiírja, hogy mennyi időbe telt.
| Programozási nyelv | 1 Millióig (sec) | 10 Millióig (sec) | 100 Millióig (sec) | 1 Milliárdig (sec) |
| Python (v3.9) | 0.038083 | 0.375603 | 3.610417 | 37.215490 |
| C | 0.002 | 0.021 | 0.209 | 2.001 |
| Java (1.8.0_231 verzió) | 0.0028476 | 0.0047248 | 0.038946 | 0.3914907 |
| Excel VBA | 0.0078125 | 0.0546875 | 0.578125 | 5.7421875 |
Az Excel VBA 7 kattintásnyi idő alatt kb 200 Millióig tudott egyesével elszámolni, pontosabban a tesztben 1.1171875 sec alatt számolt el 200,000,000 -ig, ami valóban majdnem a 100 milliós sor kétszerese.
Láthatjuk, hogy vannak az excel makrónál gyorsabb nyelvek, viszont azok sokkal bonyolultabban működnek. A VBA-ban az a jó, hogy mindent az ember szeme elé rak le a Microsoft, nem kell külön telepíteni sem fejlesztőkörnyezetet, sem magát a nyelvet, sem más egyebet, hogy működjön, csak az excel kell a gépre és kész.
Forráskódok a méréshez:
Ezek a kódok csak úgy nem fognak futni a gépeden, megfelelő dolgokat kell felraknod és beállítanod előtte, ebben tud segíteni ChatGPT.
Azért is érdemes megnézni ezeket, mert felfedezhetünk egy mintát és megtapasztalhatjuk, hogy nagyon-nagyon hasonlóan kell megírni ugyanazt a dolgot különböző programozási nyelveken.
Ha Excel VBA-ban meg tudod oldani a feladatot, akkor nem sok gondolkodás kell és más nyelven is tudsz „beszélni” a számítógéppel.
Python forráskód (v3.9)
import time
def szamolj_ossze(eddigszamolj):
start_time = time.time() # időmérés kezdete
osszead = 0
for i in range(1, eddigszamolj + 1):
osszead += 1
end_time = time.time() # időmérés vége
elapsed_time = end_time - start_time
print(f"Futtatási idő: {elapsed_time:.6f} másodperc")
def main():
egymillio = 1_000_000
tizmillio = 10 * egymillio
szazmillio = 100 * egymillio
EGYMILLIARD = 1000 * egymillio
print("Eddig számolunk: egymillio")
szamolj_ossze(egymillio)
print("Eddig számolunk: tizmillio")
szamolj_ossze(tizmillio)
print("Eddig számolunk: szazmillio")
szamolj_ossze(szazmillio)
print("Eddig számolunk: EGYMILLIARD")
szamolj_ossze(EGYMILLIARD)
if __name__ == "__main__":
main()
C forráskód
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double meddigfut(long meddigszamoljon) {
clock_t start, end;
double cpu_time_used;
long osszeg = 0;
// idõmérés kezdete
start = clock();
// számolás 0-tól meddigszamoljon-ig
for (long i = 0; i <= meddigszamoljon; i++) {
osszeg += 1 ;
}
// idõmérés vége
end = clock();
// idõ kiszámítása másodpercben
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
return cpu_time_used;
}
int main()
{
double ennyi_ideig_szamolt;
long egymillio = 1000*1000;
long tizmillio = 10 * egymillio;
long szazmillio = 100 * egymillio;
long egymilliard = 1000 * egymillio;
ennyi_ideig_szamolt = meddigfut(egymillio);
printf("Futtatasi ido egymilliora: %.4f masodperc\n", ennyi_ideig_szamolt);
ennyi_ideig_szamolt = meddigfut(tizmillio);
printf("Futtatasi ido tizmilliora: %.4f masodperc\n", ennyi_ideig_szamolt);
ennyi_ideig_szamolt = meddigfut(szazmillio);
printf("Futtatasi ido szazmilliora: %.4f masodperc\n", ennyi_ideig_szamolt);
ennyi_ideig_szamolt = meddigfut(egymilliard);
printf("Futtatasi ido egymilliardra: %.4f masodperc\n", ennyi_ideig_szamolt);
return 0;
}
Java forráskód
package hu.excelmakrobaratok;
public class Main {
public static void main(String[] args) {
long egymillio = 1000000;
long tizmillio = 10 * egymillio;
long szazmillio = 100 * egymillio;
long EGYMILLIARD = 1000 * egymillio;
double eddigFutott = 0;
eddigFutott = mennyiIdeigfut(egymillio);
System.out.println("Eddig számoltunk: egymillio és ennyi millisecundumig tartott: " + eddigFutott / 1_000_000_000.0);
eddigFutott = mennyiIdeigfut(tizmillio);
System.out.println("Eddig számoltunk: tizmillio és ennyi millisecundumig tartott: " + eddigFutott / 1_000_000_000.0);
eddigFutott = mennyiIdeigfut(szazmillio);
System.out.println("Eddig számoltunk: szazmillio és ennyi millisecundumig tartott: " + eddigFutott / 1_000_000_000.0);
eddigFutott = mennyiIdeigfut(EGYMILLIARD);
System.out.println("Eddig számoltunk: EGYMILLIARD és ennyi millisecundumig tartott: " + eddigFutott / 1_000_000_000.0);
}
public static double mennyiIdeigfut(long meddigSzamoljon) {
long startTime = System.nanoTime();
long sum = 0;
for (long i = 0; i <= meddigSzamoljon; i++) {
sum += 1;
}
long endTime = System.nanoTime();
double duration = endTime - startTime;
return duration;
}
}
Excel VBA Forráskód, Makró forráskód
Option Explicit
Dim eddigSzamoljonAGep As Long
Sub elszamolSokaig()
Dim startTime As Double
Dim elapsedTime As Double
Dim endTime As Double
Dim szamlalo As Long
Dim egymillio As Long
egymillio = 1000000 '1 000 000
Dim tizmillio As Long
tizmillio = 10 * egymillio
Dim szazmillio As Long
szazmillio = 100 * egymillio
Dim EGY_MILLIARD As Long
EGY_MILLIARD = 1000 * egymillio
Call szamolEsOsszeadEgyesevel(egymillio)
Debug.Print "Végeztem, eddig elszámoltam: egymillio " & elapsedTime & vbNewLine
'==============tizmillio=========
eddigSzamoljonAGep = tizmillio
Debug.Print "Elindultam tizmillio " & Time() & vbNewLine
startTime = Timer
For szamlalo = 0 To eddigSzamoljonAGep
szamlalo = szamlalo + 1
Next
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "Végeztem, eddig elszámoltam: tizmillio " & elapsedTime & vbNewLine
'==============szazmillio=========
eddigSzamoljonAGep = szazmillio
Debug.Print "Elindultam szazmillio " & Time()
startTime = Timer
For szamlalo = 0 To eddigSzamoljonAGep
szamlalo = szamlalo + 1
Next
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "Végeztem, eddig elszámoltam: szazmillio " & elapsedTime & vbNewLine
'==============kettoszazmillio=========
eddigSzamoljonAGep = szazmillio
Debug.Print "Elindultam 2szazmillio " & Time()
startTime = Timer
For szamlalo = 0 To 2 * eddigSzamoljonAGep
szamlalo = szamlalo + 1
Next
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "Végeztem, eddig elszámoltam: 2szazmillio " & elapsedTime & vbNewLine
'==============EGYMILLIARD=========
eddigSzamoljonAGep = EGY_MILLIARD
startTime = Timer
Debug.Print "Elindultam EGY_MILLIARD " & Time()
For szamlalo = 0 To eddigSzamoljonAGep
szamlalo = szamlalo + 1
Next
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "Végeztem, eddig elszámoltam: EGY_MILLIARD " & elapsedTime & vbNewLine
End Sub
Function szamolEsOsszeadEgyesevel(meddigSzamoljon As Long) As Double
'Idő mérésére szolgáló változók
Dim startTime As Double
Dim endTime As Double
Dim elapsedTime As Double
Dim szamlalo As Long
startTime = Timer 'Mérünk egy időpillanatot, amikor elindult
For szamlalo = 0 To eddigSzamoljonAGep
szamlalo = szamlalo + 1
Next
endTime = Timer 'Mérünk egy másik időpillanatot, amikor már befejeződött az elszámolás
elapsedTime = endTime - startTime 'A későbbi (nagyobb) időből kivonjuk a korábbi (kisebb) időt,
'és megkapjuk a kettő különbségeként a futásidőt
szamolEsOsszeadEgyesevel = elapsedTime
End Function