A matematika iránti amatőr és semmilyen tudományos elismerésben ki nem teljesedő vonzódásom adja a mai poszt témáját, méghozzá egy alapvetően egyszerűnek tűnő kérdésből kiindulva - Excelben kinek milyen módszere van annak megállapítására, hogy egy szám prímszám-e vagy sem? A prímek ugyebár azok a természetes számok, amelyeknek mindösszesen két osztójuk van, saját maguk és 1. Ilyen például az egyetlen páros prímszám a 2 vagy mondjuk a 19, a 7 vagy a 23.
A kérdés nem újkeletű, már sok-sok évvel ezelőtt is voltak Excel-guruk, akik előjöttek ilyen-olyan megoldásokkal, a mostani kérdés igazából a legegyszerűbb és legrövidebb utat keresi az Excelben, legyen szó akár VBA-ról, akár formuláról - én most elsőként egy VBA-kódot fogok bemutatni, de kommentben jöhet bármilyen javaslat és ötlet.
Mit fogunk tenni? Magán az Excel munkalapon elég egyszerű a kérdés, az A1 cellába beírunk egy számot, VBA-ban pedig készítünk egy funkciót, amelynek egyetlen paramétere az A1 lesz és a funkció visszaad egy TRUE vagy FALSE értéket, attól függően, hogy prímszám van az A1 cellában vagy sem.
Szóval ALT+F11 lenyomásával átmegyünk VBA-editorba, beszúrunk egy modult, majd létrehozunk egy PRIM nevű funkciót:
Azt már a korábbi posztok vagy saját tapasztalat alapján valószínűleg elég sokan tudják, hogy miért Boolean lett az eredmény adattípusa, hiszen ez a típus tárol True vagy False értékeket, a paraméterként megadható számunk pedig Integer lesz.
Miután a kód egy For..Next ciklussal fog operálni, szükségünk van egy változó deklarálására is, ez lesz most az i változó, Integer típussal.
Ezután következzen egy If utasítás, amelyben két roppant egyszerű feltételt fogunk megvizsgálni, egyrészt, hogy a számunk kisebb-e mint kettő (tehát 1) illetve, hogy a számunk osztható-e maradék nélkül kettővel (feltéve, hogy a szám maga nem a kettes, mert kettő prímszám):
If Szam < 2 Or (Szam <> 2 And Szam Mod 2 = 0) Then Exit Function
Figyeljünk fel két dologra: Szam Mod 2 = 0 a Mod operátort használja fel, amely az elsőként megadott számot (szam változó) elosztja a másodikként megadott számmal (2) és visszaadja a maradékot, itt pedig azt vizsgáljuk, hogy ez a maradék nulla-e. A másik az Exit Function lépés, amely Boolean típusú funkciónál, ha előtte nem állítottuk be másként, alapból False értéket dob majd vissza - jelen esetben pedig ezt akarjuk, hiszen a maradék nélkül kettővel osztható számok biztos nem prímek, ahogy egy sem.
Vegyük észre azt is, hogy ha az egész If utasítást egy soron tüntetjük fel, akkor nincs szükség End If lezárásra.
A kódunk másik részében pedig a For...Next ciklust fogjuk használni, amelyben egyszerűen nem mást fogunk tenni, mint háromtól kezdődően egészen számunk négyzetgyökéig elvégezzük azt az osztást, amelyben a számunkat elosztjuk i értékével és ha nullát kapunk, akkor ismét Exit Functionnel kilépünk a funkcióból és FALSE értéket adunk vissza, ellenkező esetben funkciónk TRUE értékkel zárul.
Step 2 utasítás azt jelenti a For ciklusunk első sorában, hogy kettesével lépkedünk a ciklusban, azaz 3,5,7..stb. követi egymást egészen számunk négyzetgyökéig.
És kész is vagyunk, teszteljük nyugodtan, elvileg jól működik, kommentben pedig jöhetnek az egyéb ötletek, megoldási javaslatok!
Function Prim (Szam As Integer) As Boolean
Dim i As Integer
If Szam < 2 Or (Szam <> 2 And Szam Mod 2 = 0) Then Exit Function
For i = 3 To Sqr(Szam) Step 2
If Szam Mod i = 0 Then Exit Function
Next
Prim = True
End Function