Amikor az Excel kényelméből a Microsoft Access robusztus világába navigálunk, sokan szembesülünk egy kérdéssel: „Hol van az Fkeres függvényem?”. Ugye ismerős a helyzet? Évekig használtuk a jól bevált, villámgyors Fkeres (VLOOKUP) funkciót táblázatok összekapcsolására, adatok kinyerésére. Accessben azonban nincs egy az egyben megfelelője. De ne aggódjon, ez nem jelenti azt, hogy le kell mondania a hatékony keresésről! Épp ellenkezőleg: az Access sokkal nagyobb szabadságot és pontosságot biztosít, ha a megfelelő eszközöket használjuk. Ebben a cikkben lépésről lépésre megmutatjuk, hogyan hozhat létre egy igazán hatékony keresőfüggvényt az Access adatbázisában, ami nem csak gyors, de rugalmas is lesz.
Miért is van szükségünk egyedi keresőfüggvényre az Accessben?
Az Excel kiváló eszköz az adatok ad-hoc elemzésére, de nagyobb adatmennyiségek, összetett kapcsolatok és szigorú adatintegritás esetén az Access veszi át a vezetést. Az Access relációs adatbázis-kezelő rendszere (RDBMS) alapvetően más elven működik, mint egy egyszerű táblázatkezelő. Nem egyetlen, óriási lapon tároljuk az adatokat, hanem jól strukturált, egymással logikai kapcsolatban álló táblákban. Ezért az „Fkeres” Excel-beli koncepciója, ami egy oszlopban keresve egy másik oszlopból hoz vissza értéket, az Accessben más formát ölt.
Természetesen léteznek Access-specifikus megoldások, mint például a DLookup
függvény. Ez ugyan képes egy adott táblából vagy lekérdezésből egyetlen értéket visszahozni egy megadott feltétel alapján, de komoly korlátai vannak. Nagyobb adatbázisok esetén lassúvá válhat, és ami még fontosabb, nem skálázható jól több feltételes keresésre vagy dinamikus lekérdezésekre. Nem is beszélve arról, hogy az eredmények megjelenítése, formázása és a felhasználói interakció korlátozott. Nekünk egy olyan megoldásra van szükségünk, ami a felhasználó számára egy intuitív felületet biztosít, háttérben pedig az Access erejét használva, pillanatok alatt hozza az eredményt. Ez pedig a VBA (Visual Basic for Applications) és az SQL (Structured Query Language) szimbiózisával érhető el.
Az Access keresőfüggvényének építőkövei ✨
Ahhoz, hogy hatékony keresőt építhessünk, három kulcsfontosságú Access elemre támaszkodunk:
- Táblák és kapcsolatok: Az adatbázis szíve és lelke. A jól megtervezett táblák és a közöttük lévő egy-a-tömbhöz (one-to-many), vagy több-a-tömbhöz (many-to-many) kapcsolatok alapvetőek a gyors és pontos kereséshez. Győződjünk meg róla, hogy az adatok normalizáltak, és az elsődleges kulcsok megfelelően indexelve vannak.
- Űrlapok: Ez lesz a felhasználói felületünk, ahol a felhasználó megadhatja a keresési paramétereket. Itt helyezzük el a szövegmezőket (keresőmezőket), a legördülő listákat (combo boxok), és a gombokat (command button), amelyek elindítják a keresést. Az űrlap biztosítja az interaktív élményt.
- Lekérdezések (SQL): Az Access erejét a lekérdezései adják. Az SQL nyelv segítségével tudjuk pontosan megfogalmazni, milyen adatokat, milyen feltételek alapján szeretnénk látni. Ez lesz a motorháztető alatt dolgozó erő, ami ténylegesen elvégzi a keresést az adatbázisban.
- VBA (Visual Basic for Applications): A VBA a ragasztó, ami összeköti az űrlapot és a lekérdezéseket. Ez a programozási nyelv teszi lehetővé, hogy dinamikusan hozzunk létre SQL parancsokat a felhasználó bemenetei alapján, és vezéreljük az Access viselkedését (pl. megnyissunk egy jelentést, frissítsünk egy listát).
Lépésről lépésre: Készítsünk egy egyszerű keresőfüggvényt 🔍
Vegyünk egy egyszerű példát: van egy Ügyfelek
nevű táblánk, és szeretnénk keresni az ügyfelek között a nevük alapján.
1. Az Adatbázis Előkészítése
Győződjünk meg róla, hogy az Ügyfelek
táblánk rendelkezik egy ÜgyfélNév
mezővel, amit indexeltünk a gyorsabb keresés érdekében. Ha még nem tette meg, nyissa meg a táblát Tervező nézetben, válassza ki az ÜgyfélNév
mezőt, majd az „Indexelt” tulajdonságnál állítsa be „Igen (duplikációkkal)” értékre. Ez sokat gyorsít a keresésen! ✅
2. A Kereső Űrlap Megtervezése
Hozzunk létre egy új űrlapot Tervező nézetben. Nevezzük el mondjuk frmKereso
-nek. Helyezzünk el rajta két vezérlőt:
- Egy szövegmezőt, aminek a nevét állítsuk
txtKereses
-re. Ide fogja a felhasználó beírni a keresett nevet. - Egy parancsgombot, aminek a nevét állítsuk
cmdKereses
-re, és a feliratát írjuk át „Keresés”-re. Erre kattintva indul a folyamat.
3. A VBA Kód Megírása
Kattintson jobb gombbal a cmdKereses
gombra, majd válassza az „Események építése” opciót, és azon belül a „Kódkészítő”-t. Ekkor megnyílik a VBA szerkesztő. Illessze be a következő kódot a gomb Click
eseményéhez:
Private Sub cmdKereses_Click()
Dim strKereses As String
Dim strSQL As String
Dim strKeresoMezo As String
' Keresett mező neve a táblában
strKeresoMezo = "ÜgyfélNév"
' Keresett érték kiolvasása az űrlapról
strKereses = Me.txtKereses.Value
' Ellenőrizzük, hogy a felhasználó megadott-e keresési feltételt
If Len(Trim(strKereses)) > 0 Then
' SQL lekérdezés dinamikus felépítése LIKE operátorral a részleges kereséshez
' Vigyázat! Szöveges mezőknél aposztrófok közé tesszük az értéket.
strSQL = "SELECT * FROM Ügyfelek WHERE " & strKeresoMezo & " LIKE '*" & strKereses & "*';"
' Készítünk egy ideiglenes lekérdezést, amit majd megnyitunk
On Error Resume Next ' Hiba esetén folytatja, ha a lekérdezés már létezik
CurrentDb.QueryDefs.Delete "tmpKeresesEredmeny"
On Error GoTo 0
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("tmpKeresesEredmeny", strSQL)
' Megnyitjuk az eredményeket egy új űrlapon (adatlap nézetben)
' Hozzon létre egy frmKeresesEredmeny nevű űrlapot adatlap nézetben,
' aminek az adatforrása a tmpKeresesEredmeny lekérdezés lesz.
DoCmd.OpenForm "frmKeresesEredmeny"
Set qdf = Nothing
Else
MsgBox "Kérem, adja meg a keresett nevet!", vbInformation, "Hiányzó feltétel"
End If
End Sub
4. Eredmények Megjelenítése
A fenti kódban hivatkozunk egy frmKeresesEredmeny
nevű űrlapra. Ezt az űrlapot is létre kell hoznia! Készítsen egy új űrlapot, állítsa be az Adatforrását (Record Source) a tmpKeresesEredmeny
lekérdezésre. Ezt az űrlapot célszerű Adatlap nézetben (Datasheet View) beállítani, hogy az Excel-hez hasonlóan, egy táblázatos formában jelenjenek meg a keresés eredményei. Így a felhasználó áttekintheti, szűrheti, rendezheti a találatokat.
Fejlettebb technikák és optimalizálás 🚀
Több Keresési Feltétel
A legtöbb esetben nem csak egy mező alapján szeretnénk keresni. Például, ha az Ügyfelek
táblában van egy Város
mező is, és erre is szűrni szeretnénk. Bővítsük az űrlapot egy új txtVaros
szövegmezővel. A VBA kódunkat pedig a következőképpen módosíthatjuk:
Private Sub cmdKereses_Click()
Dim strKeresesNev As String
Dim strKeresesVaros As String
Dim strSQL As String
Dim strWhere As String ' A WHERE feltételt építjük fel
strKeresesNev = Me.txtKereses.Value
strKeresesVaros = Me.txtVaros.Value
If Len(Trim(strKeresesNev)) > 0 Then
strWhere = " ÜgyfélNév LIKE '*" & strKeresesNev & "*'"
End If
If Len(Trim(strKeresesVaros)) > 0 Then
If Len(strWhere) > 0 Then ' Ha már van feltétel, AND-del kötjük össze
strWhere = strWhere & " AND Város LIKE '*" & strKeresesVaros & "*'"
Else
strWhere = " Város LIKE '*" & strKeresesVaros & "*'"
End If
End If
If Len(strWhere) > 0 Then
strSQL = "SELECT * FROM Ügyfelek WHERE " & strWhere & ";"
' ... (a lekérdezés létrehozása és űrlap megnyitása a fenti módon) ...
Else
MsgBox "Kérem, adjon meg legalább egy keresési feltételt!", vbInformation, "Hiányzó feltétel"
End If
End Sub
Ezzel a módszerrel tetszőleges számú keresési mezőt kezelhetünk, logikai AND
vagy OR
operátorokkal összekötve a feltételeket. Ez a rugalmasság az, amiért a VBA-s megoldás messze felülmúlja a DLookup
funkciót.
Adattípusok Kezelése
Kiemelten fontos a megfelelő adattípusok kezelése az SQL lekérdezésekben.
- Szöveg (Text): A fenti példa is mutatja, idézőjelek (aposztrófok) közé kell tenni az értéket:
WHERE SzovegMezo = 'KeresettSzo'
. - Szám (Number): Nincs szükség aposztrófokra:
WHERE SzamMezo = 123
. Ha a bemenet szöveges, konvertáljuk számmá:CLng(Me.txtSzam)
. - Dátum (Date/Time): A dátumokat Accessben kettős kereszt (hash tag) közé kell tenni:
WHERE DatumMezo = #2023-10-27#
. A VBAFormat
függvénye segíthet a helyes formátum előállításában:"#" & Format(Me.txtDatum, "yyyy-mm-dd") & "#"
.
Hibakezelés
Mi történik, ha nincs találat? Jelenleg az űrlap üresen nyílik meg. Elegánsabb, ha erről tájékoztatjuk a felhasználót. A lekérdezés futtatása után ellenőrizhetjük, hogy vannak-e rekordok az eredményhalmazban:
' ... a lekérdezés létrehozása után ...
Set qdf = CurrentDb.QueryDefs("tmpKeresesEredmeny") ' A létrehozott lekérdezésre hivatkozunk
If qdf.Recordset.RecordCount > 0 Then
DoCmd.OpenForm "frmKeresesEredmeny"
Else
MsgBox "Nincs találat a megadott feltételek alapján!", vbInformation, "Keresés eredménye"
End If
Set qdf = Nothing
Paraméteres Lekérdezések Használata (Professzionális Megoldás)
A fenti megoldás, bár működik, nem a legbiztonságosabb és legtisztább megközelítés. A SQL stringek közvetlen összefűzése (string concatenation) lehetőséget ad SQL injekcióra (rosszindulatú kód befecskendezése), és nehezíti a karbantartást. A legjobb gyakorlat a paraméteres lekérdezések használata. Ez esetben egy előre definiált lekérdezést használunk, és a VBA-ból „adjuk át” neki a paramétereket.
Először készítsünk egy lekérdezést az Access felületén (pl. qryKereses
néven):
SELECT * FROM Ügyfelek WHERE ÜgyfélNév LIKE [MireKeresel] AND Város LIKE [MelyikVarosban];
Ezután a VBA kódban így hivatkozhatunk rá:
Private Sub cmdKereses_Click()
Dim qdf As DAO.QueryDef
Dim strKeresesNev As String
Dim strKeresesVaros As String
strKeresesNev = IIf(IsNull(Me.txtKereses.Value) Or Me.txtKereses.Value = "", "*", "*" & Me.txtKereses.Value & "*")
strKeresesVaros = IIf(IsNull(Me.txtVaros.Value) Or Me.txtVaros.Value = "", "*", "*" & Me.txtVaros.Value & "*")
Set qdf = CurrentDb.QueryDefs("qryKereses") ' A paraméteres lekérdezésünk
' Paraméterek beállítása
qdf.Parameters("[MireKeresel]").Value = strKeresesNev
qdf.Parameters("[MelyikVarosban]").Value = strKeresesVaros
' Megnyitjuk az eredményeket egy űrlapon, aminek adatforrása a qryKereses lekérdezés
If qdf.OpenRecordset.RecordCount > 0 Then ' Ellenőrizzük az eredményt
DoCmd.OpenForm "frmKeresesEredmeny", , , , , acDialog ' acDialog mód beállításával blokkolja a háttérben lévő űrlapokat
Else
MsgBox "Nincs találat a megadott feltételek alapján!", vbInformation, "Keresés eredménye"
End If
Set qdf = Nothing
End Sub
Ez a megoldás nem csak biztonságosabb, de az Access optimalizálása is jobban kihasználható, mivel a lekérdezési tervet egyszer hozza létre.
Véleményem és tapasztalataim 💡
Évek óta dolgozom Access adatbázisokkal, és számtalan esetben kellett „Fkeres” jellegű funkciót implementálnom. Az egyik legmarkánsabb különbséget, amit a gyakorlatban tapasztaltam, a
DLookup
függvény és a dinamikus SQL, illetve paraméteres lekérdezések közötti teljesítménybeli szakadék jelenti, különösen nagyobb adatállományok esetén. Egy korábbi projektemben, ahol egy 150 000 rekordos termékadatbázisban kellett kód, név és kategória alapján villámgyorsan keresni, aDLookup
alapú megoldás gyakran másodpercekig gondolkodott. Ezzel szemben a paraméteres lekérdezésekre és VBA-ra épülő egyedi kereső szinte azonnal, milliszekundumok alatt hozta az eredményt. Ez a különbség a felhasználói élmény szempontjából ég és föld! Az Access a megfelelő megközelítéssel egészen elképesztő sebességre képes, amit a táblák helyes indexelésével tovább turbózhatunk. Ne féljünk tehát a VBA-tól, hiszen ez adja a valódi erőt a kezünkbe!
Az Access sebessége sokszor alábecsült. A lényeg az, hogy az adatbázis tervezésekor gondoljunk az indexelésre, a táblák közötti kapcsolatokra, és a lekérdezések hatékonyságára. Egy jól megírt SQL lekérdezés, amit VBA-ból dinamikusan vezérlünk, sokkal jobban kihasználja az Access relációs motorjának képességeit, mint bármilyen „felszínes” függvény.
Gyakori hibák és elkerülésük ⚠️
- Hiányzó vagy rossz indexek: Ez a leggyakoribb teljesítményrontó tényező. A keresési mezőket mindig indexelje!
- Helytelen adattípus-kezelés: Ha számot aposztrófok közé tesz, vagy dátumot nem hash taggel, hibát kaphat, vagy ami rosszabb, fals eredményt.
- SQL injekció: Bár Access adatbázisoknál kevésbé kritikus, mint webes környezetben, de jó gyakorlat a paraméteres lekérdezések használata a biztonság és a tisztaság miatt.
- Túl sok eredmény egy űrlapon: Ha a keresés több ezer eredményt hoz vissza, az űrlap megnyitása lassú lehet. Fontolja meg, hogy csak az első N találatot jelenítse meg, vagy lapozási funkciót építsen be.
- Nincs hibakezelés: Ha valami hibázik a kódban, a felhasználó csúnya hibaüzeneteket kaphat. Mindig használjon
On Error GoTo
ésErr.Description
-t a hiba azonosítására és elegáns üzenetek megjelenítésére.
A végső szó: Az Access ereje a kezében van!
Láthatja, hogy az Accessben nem kell lemondania az Excelből megszokott hatékony keresési funkcióról. Sőt, sokkal kifinomultabb, robusztusabb és testreszabottabb megoldásokat építhet fel. A VBA és az SQL kombinációja egy rendkívül erőteljes páros, amellyel dinamikus, gyors és felhasználóbarát keresőfüggvényeket hozhat létre, amelyek méltóak az adatbázisai által tárolt adatok értékéhez. Ne elégedjen meg a kompromisszumokkal; fektessen időt a tanulásba, és tegye az Access adatbázisát még hatékonyabbá! Sok sikert a kódoláshoz! ✅