Oldal kiválasztása
Az excel makró olyan gyors, hogy leolvad az arcod!

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 nyelv1 Millióig (sec)10 Millióig (sec) 100 Millióig (sec)1 Milliárdig (sec)
    Python (v3.9)0.0380830.3756033.61041737.215490
    C0.0020.0210.2092.001
    Java (1.8.0_231 verzió)0.00284760.00472480.0389460.3914907
    Excel VBA0.00781250.05468750.5781255.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