Ovdje navedeni sadržaj može se odnositi na Northwind 2.0 Developer Edition i Starter Edition.
VBA referenca za Access
VBA (Visual Basic for Applications) programski je jezik koji se koristi u svim proizvodima sustava Office. VBA učenje omogućuje vam rad sa svim proizvodima sustava Office (ne samo sa servisom Access).
Kada tražite "upute", svakako potražite primjere specifične za Access i u pretraživanje uvrstite Microsoft Access. Rješenja za druge proizvode sustava Office često funkcioniraju, ali nema jamstva. Microsoft Access je zreo proizvod; To znači da postoji puno primjera; što je sjajno za vas!
To također znači da su starije knjige o programiranju u Accessu još uvijek održive za gledanje. Mnoge starije knjige još uvijek su dostupne na stranicama rabljenih knjiga po djeliću njihove izvorne cijene. Provjerite koje su verzije programa Access još podržane na Microsoftovu web-mjestu i upotrijebite ih.
Resursi za kraj podrške za Office – implementacija sustava Office | Microsoft Learn
U nastavku je nekoliko veza na Microsoftovu dokumentaciju za Access.
- Referenca za Access Visual Basic for Applications (VBA) | Microsoft Learn
- VBA rječnik | Microsoft Learn
- Konceptualne teme o jeziku Visual Basic | Microsoft Learn
- Visual Basic for Applications – Wikipedija
- VBA-Docs/API na glavnom · MicrosoftDocs/VBA-Docs · Središte GitHub
Pouzdana mjesta i omogućeni sadržaj
Datoteke programa Microsoft Access datoteke su sustava Office. Datoteke sustava Office moraju se nalaziti na "pouzdanom mjestu" ili "omogućiti njihov sadržaj". Te se stavke smatraju "sigurnima" jer ste ih vi stvorili ili potječu iz pouzdanog izvora. Provjera pouzdanih mjesta odvija se svaki put kada otvorite bilo koju datoteku sustava Office. Odsad ćemo tu mogućnost zvati Pouzdano/Omogućeno. NAPOMENA: ako se nova verzija aplikacije izda i otvori s nepouzdanog mjesta, postupak omogućivanja sadržaja ponovit će se.
Saznajte više o pouzdanim mjestima:
- Pouzdana mjesta za datoteke sustava Office – implementacija sustava Office | Microsoft Learn
- Procjena pouzdanosti baze podataka (Microsoftova podrška)
- Dodavanje, uklanjanje ili promjena pouzdanog mjesta (Microsoftova podrška)
Makronaredbe, funkcije i subs
Makronaredbe, funkcije i zamjene način su implementacije poslovne logike u bazu podataka programa Access. Važno je da prije početka razumijete opseg i vidljivost .
- Akcija makronaredbe RunCode | Microsoft Learn
- Uvod u makronaredbe | Microsoftova podrška
- Naredba funkcije (VBA) | Microsoft Learn
- Podnaredba (VBA) | Microsoft Learn
Događaji (npr. klik na kontrolu) na kontrolama na obrascu (npr. gumbi, tekstni okviri, oznake itd.) pokreću druge postupke, kao što su dodavanje, brisanje zapisa ili otvaranje obrazaca. Ti se procesi mogu implementirati pomoću makronaredbi ili programa VBA. Northwind Starter Edition uglavnom koristi makronaredbe i neke VBA makronaredbe u kojima makronaredbe ne mogu obavljati potrebne funkcije. Northwind Developer Edition prvenstveno koristi VBA.
Neke vrste kontrola sadrže ugrađene čarobnjake za automatsko stvaranje makronaredbi. Na primjer, dodavanjem naredbenog gumba u obrazac otvara se čarobnjak koji nudi nekoliko izbora funkcija za gumb. Dodavanjem kombiniranog okvira otvara se čarobnjak koji je moguće konfigurirati za pronalaženje određenog zapisa u obrascu.
okno za navigaciju
Navigacijsko okno glavni je način prikaza svih objekata baze podataka i pristupa svim objektima baze podataka, a po zadanom se prikazuje na lijevoj strani prozora programa Access.
Navigacijsko okno tvrtke Northwind je prilagođeno. Stvorili smo prilagođenu kategoriju pod nazivom Northwind Starter 2.0. To nam omogućuje organiziranje objekata prema funkcionalnom području.
- Korištenje navigacijskog okna | Microsoftova podrška
- Prilagodba navigacijskog okna | Microsoftova podrška
Opseg i vidljivost varijabli u VBA programu
Važno je naučiti više o opsegu i vidljivosti unutar programa Access/Office. Možete početi ovdje:
- Razumijevanje opsega i vidljivosti (VBA) | Microsoft Learn
- Javna izjava (VBA) | Microsoft Learn
- Privatna izjava (VBA) | Microsoft Learn
- Statička naredba (VBA) | Microsoft Learn
- Razumijevanje vijeka trajanja varijabli (VBA) | Microsoft Learn
postojane varijable
Ponekad vam je potrebna da varijabla postoji nakon što objekt koji ju je stvorio izađe izvan opsega. Pogledajte prethodni opseg i vidljivost . To možete učiniti na tri osnovna načina: javne varijable, privremene varijable i spremanje vrijednosti u lokalnu tablicu. Mnogi programeri koriste kombinaciju tih varijanti. Svaki ima svoje prednosti i nedostatke. Više o svakom od njih ovdje:
Javna varijabla VBA modula:
TempVars:
- Objekt TempVars (Access) | Microsoft Learn
- Savjet za napajanje: maksimiziranje upotrebe TempVars u programu Access 2007 i 2010 | Microsoft 365 Blog
Pohranjivanje vrijednosti u lokalnu tablicu
- Javne varijable i TempVars postoje za trenutnu sesiju i izlaze izvan opsega kada se aplikacija zatvori. No što ako želite zadržati varijable specifične za korisnika kroz sve sesije? Takve vrste vrijednosti možete pohraniti u lokalnu tablicu. U programu Northwind 2.0 jedna se takva varijabla sprema u tablicu pod nazivom SystemSettings. Vrijednost u tablici glasi ShowWelcome. Ta vrijednost govori programu Access želite li prilikom svake prijave vidjeti zaslon dobrodošlice.
OpenArgs and StringFormat()
Razvojni inženjeri često moraju prenositi parametre s jednog obrasca na drugi ili iz obrasca u izvješće. Ti parametri prenose važne informacije koje će pozvana funkcija zatim koristiti za konfiguriranje. Drugi obrazac ili izvješće na nekoliko načina mogu dohvatiti podatke iz prvog obrasca. Evo nekoliko načina:
- Drugi obrazac može "pogledati unatrag" na prvi obrazac da bi pokupio neke vrijednosti, možda u vidljivoj ili nevidljivoj kontroli. Na primjer:
lngCustomerID = Forms!FirstForm!cboCustomerID - Prvi obrazac može spremiti vrijednosti u globalne varijable ili u TempVars. Na primjer:
g_lngUserID = Me.cboUserID
TempVars.Add "UserID", Me.cboUserID
Metoda koja se često koristi u programu Northwind Developer Edition kao i u profesionalnom životu jest korištenje argumenta OpenArgs za DoCmd.OpenForm ili OpenReport. Na primjer:
DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
Ovdje kombiniramo dvije tehnike: (1) korištenje OpenArgs za prosljeđivanje varijabli VendorID i VendorType i (2) korištenje funkcije StringFormat() za stvaranje, primjerice, ovog niza:
CompanyID=5&CompanyTypeID=2
Taj niz vrlo nalikuje nizu upita koji se koristi u pregledniku. Sadrži jedan ili više "parova naziva/vrijednosti" odvojenih znakom ampersand:
name1=value1&name2=value2
Prednost takvog niza je u tome što svaka vrijednost ima svoj naziv. Usporedite to s jednostavnijim pristupom gdje biste OpenArgs postavili samo na "5,2". U takvom bi slučaju bilo potrebno uložiti napor da se otkrije što svaka vrijednost znači. Imenovanje svake vrijednosti čini niz upita "samoopisnim", što je dobra praksa programiranja.
Na primateljskoj strani DoCmd.OpenForm obično se nalazimo u Form_Open ili Form_Load događaju i želimo raščlaniti niz OpenArgs na njegove komponente.
U sustavu Northwind to možete učiniti pomoću funkcije StringToDictionary . Koristi funkciju nalik nizu upita i raščlanjuje je na njegove komponente. Te se komponente zatim pohranjuju u objekt Scripting.Dictionary . Imajte na umu da to zahtijeva korištenje referenci za alate > i postavljanje reference na Microsoft Scripting Runtime (scrrun.dll).
Značajke i prednosti objekta Dictionary obuhvaćaju sljedeće:
- Redoslijed elemenata nije važan
- Jednostavne funkcije za dodavanje i uklanjanje elemenata zbirke
- Funkcije za petlju nad zbirkom da biste znali što se nalazi u njoj
- Funkcija Exists kojom možete provjeriti je li određeni element dostupan
Upotreba objekta rječnika pojavljuje se na svim dijelovima sustava Northwind. Na primjer, Form_Load događaj u obrGenericDialog.
Rukovanje pogreškama
makronaredbe stvorene pomoću čarobnjaka za kontrole u programu Access rijetko uopće sadrže obradu pogrešaka. VBA stvoren pomoću čarobnjaka za kontrole može biti ograničen na generički MsgBox Err.Description.
U programu Northwind 2.0 pokazat ćemo vam kako to učiniti bolje kada koristite VBA kod. Implementirali smo globalni rukovatelj pogreškama. Pogreške koje se događaju u bilo kojoj proceduri pozivaju funkciju na globalnoj razini da bi vam se prikazala pogreška. Velika je prednost dosljedno rukovanje pogreškama. A ako je poruku potrebno promijeniti (npr. dodatno prikazati broj pogreške ili zabilježiti pogrešku u datoteku), to je potrebno učiniti samo na jednom mjestu.
clsErrorHandler je modul klase koji implementira kod za rukovanje pogreškama. Modul klase drži sve svoje glavne i pomoćne funkcije zajedno u jednoj jedinici, čime se sažima kod.
Makronaredba AutoExec poziva funkciju pokretanja u modStartup. U izdanju Starter Edition funkcija stvara instancu clsErrorHandler i sprema je kao globalnu varijablu koja je dostupna za korištenje u cijeloj aplikaciji. U Dev izdanju koristi se statična klasa – pogledajte komentare na vrhu modula klase.
Šifra za rukovanje pogreškama u procedurama toliko je dosljedna da smo ga sve uspjeli stvoriti za manje od pet minuta pomoću posebnog VBA koda koji je za svaku proceduru bio bolji od odgovarajućeg alata za obradu pogrešaka. (Kod nije uvršten u predložak). I izdanja predložaka Northwind 2.0 Starter i Developer u početku su bila opremljena takvim pristupom rukovanja pogreškama.
'
POBOLJŠANO RUKOVANJE POGREŠKAMA
Počevši od verzije 2.2 programa Northwind Developer Edition, zahvaljujući povratnim informacijama iz zajednice programa Access, rukovatelj pogreškama poboljšan je. Izdanje Starter ostalo je nepromijenjeno.
U osnovi, rukovatelj pogreškama u prethodnoj verziji (2.0 – objavljenoj u travnju 2023.) jest:
Public Sub HandleError(…)
MsgBox Err.Description
End Sub
U verziji 2.2 nadograđen je na:
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
If Not IsEventProcedure Then
Err.Raise lngError, strErrSource
End If
MsgBox Err.Description
End Sub
Da biste razumjeli zašto je ta promjena unesena, prvo shvatimo zašto se kod pokreće:
- Makronaredba AutoExec poziva proceduru pokretanja koja provodi određene inicijalizacije prije otvaranja prvog obrasca.
- Korisnik komunicira s aplikacijom, primjerice otvara obrazac ili klikne gumb, što uzrokuje aktiviranje procedura događaja, kao što su Form_Load i cmdPrintInvoice_Click.
'
Osim procedura događaja, aplikacije imaju potprograme i funkcije - uglavnom u modulima - i taj se kod poziva iz procedura događaja. To se zove "standardni" postupci.
U verziji 2.0 tvrtke Northwind standardni postupci rješavali su vlastite pogreške s porukama, ali na neki način ne bi obavijestili proceduru događaja pozivanja da je došlo do pogreške. To može biti loše ako procedura događaja ima naknadni kod koji bi se trebao pokrenuti neovisno o prethodnoj pogrešci kojom je rukovala pozvana procedura. Naravno, mogli bismo zamijeniti potprogram funkcijom koja vraća uspjeh ili neuspjeh i u skladu s tim kodirati proceduru događaja, ali to nije uvijek mogućnost.
U programu Northwind verzije 2.2 standardni postupci ne obrađuju poruke o pogreškama, nego ih pomoću funkcije Err.Raise prijavljuju proceduri događaja pozivanja. Postupak pozivanja zatim prikazuje prijavljenu pogrešku i nastavlja se u Exit_Handler. To je bolje jer omogućuje uredno zaključivanje postupka pozivanja.
Da bi se koristio kod Northwind verzije 2.2, procedure događaja moraju u HandleError prenijeti treći argument koji upućuje na to da je pozivatelj procedura događaja. Northwind Dev Edition ažuriran je kako bi to učinio.
Još snažniji modul za rukovanje pogreškama imao bi podršku za procedure "guranja i iskakanja" na "snopu" (polju). Prvi element uvijek bi bila procedura događaja, tako da dodatni argument nije potreban. Ova implementacija je izvan ciljeva Northwind Dev Edition.
MRU popis
MRU ili Nedavno korišteno je popis nedavno korištenih narudžbi i narudžbenica. Bilo bi dobro da ih često ponavljate da biste ih stavili u sljedeći status. Popisi MRU-a u proizvodima sustava Office često se vide kao popisi nedavno korištenih datoteka koje biste možda htjeli ponovno otvoriti.
Da biste u izdanju Northwind Dev implementirali značajku MRU (koja ne postoji u izdanju Starter), najprije morate utvrditi sljedeće stavke:
- Tablica za pohranu informacija o MRU-u.
- Kôd za ažuriranje tablice prilikom otvaranja narudžbenice ili narudžbenice.
- Kod za ažuriranje padajućeg popisa MRU na vrpci.
- Kod za učitavanje stavke kada se na vrpci odabere stavka MRU-a.
Pogledajmo svaki od njih detaljnije.
1. Tablica za pohranu informacija o MRU-u.
Dizajn tablice MRU vrijedi pregledati, posebno njegove indekse. Imajte na umu da postoji dvostruki indeks SortIdx koji pomaže pri brzom sortiranju stavki MRU-a na padajućem popisu vrpce, kao i jedinstveni indeks koji nameće poslovno pravilo prema kojem se za svakog korisnika stavka može pojaviti samo jednom. Na primjer, otvaranje iste narudžbe dva puta neće stvoriti dva zapisa u tablici MRU.
Tablica iskorištava činjenicu da su sva polja primarnog ključa (MRU) u bazi podataka automatski numerirana, pa se vrsta podataka Dugi cijeli broj može koristiti za PKValue.
2. Kod za ažuriranje tablice prilikom otvaranja narudžbe ili narudžbe.
U NW2 smo odlučili dodati na popis MRU samo kada je stvoren novi zapis, a ne kada se postojeći ponovno ažurira. Svakako bismo mogli premjestiti AddToMRU poziv s Form_AfterInsert na Form_AfterUpdate kako bismo to podržali.
Postupci AddToMRU i DeleteFromMRU implementirani su u modGlobalu, koji je Standard modul čije su javne procedure vidljive iz bilo kojeg oblika.
AddToMRU (kao što i sam naziv govori) dodaje novu stavku u tablicu MRU, a zatim je po želji skraćuje, brišući najstariji zapis ako je narastao iznad maksimalne veličine (MAX_MRU_COUNT). Posljednji korak je vjerojatno najmanje poznat razvojnim inženjerima programa Access: mora se osvježiti padajući izbornik vrpce, a to se postiže pozivanjem InvalidateControl. To je signal vrpci da ponovno pokrene proces inicijalizacije.
3. Kod za ažuriranje padajućeg izbornika MRU-a na vrpci.
Prilikom pokretanja i nakon pozivanja funkcije InvalidateControl izvršava se složeni skup funkcija radi popunjavanja vrpce. Te procedure poziva XML vrpce u tablici uSysRibbons koja između ostalog kaže:
<group id="gCurrentStatus" label="MRU">
<box id="bxMRU" boxStyle="vertical">
<dropDown id="ddMRU"
getItemCount="ddMRU_GetItemCount"
getItemLabel="ddMRU_GetItemLabel"
getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
getItemID="ddMRU_GetItemID"
onAction="ddMRU_OnAction"
screentip="Most Recently Used Objects">
</dropDown>
</box>
</group>
Ove četiri funkcije povratnog poziva popunjavaju padajući izbornik. Imajte na umu da je ovo vrlo slična ideja kao što je ovdje opisano za standardne kombinirane okvire.
Ako poništite komentare na retke Debug.Print u modRibbonCallback i ponovno pokrenete aplikaciju, u izvršnom prozoru prikazat će se ovakav slijed:
ddMRU_GetItemCount ddMRU 6
ddMRU_GetItemLabel ddMRU 0 Order 60, Proseware, Inc.
ddMRU_GetItemID ddMRU 0 2
ddMRU_GetItemLabel ddMRU 1 Order 62, Best For You Organics Company
ddMRU_GetItemID ddMRU 1 4
ddMRU_GetItemLabel ddMRU 2 Order 63, Wide World Importers
ddMRU_GetItemID ddMRU 2 5
ddMRU_GetItemLabel ddMRU 3 Order 66, Proseware, Inc.
ddMRU_GetItemID ddMRU 3 8
ddMRU_GetItemLabel ddMRU 4 Order 67, Best For You Organics Company
ddMRU_GetItemID ddMRU 4 9
ddMRU_GetItemLabel ddMRU 5 Order 68, Adatum Corporation
ddMRU_GetItemID ddMRU 5 10
ddMRU_GetSelectedItemIndex ddMRU 0
Ovdje možete vidjeti da Access najprije poziva proceduru koja vraća broj stavki koje će se učitati u argumentu ByRef za ddMRU_GetItemCount. To je također vrijeme kada otvaramo upit na MRU tablici i predmemoriramo ga jer će se koristiti nekoliko puta.
Vrpca zatim opetovano poziva dva postupka za dohvaćanje vrijednosti ID-ja i oznake za padajući popis s dva stupca.
Konačno, poziva proceduru za otkrivanje stavke koju treba odabrati. (U našem slučaju to je prvi.)
4. Kod za učitavanje stavke kada se na vrpci odabere stavka MRU-a.
Kao i kod bilo koje druge stavke vrpce, svojstvo OnAction u XML-u vrpce određuje funkciju povratnog poziva koja će se koristiti za izvođenje akcije:
onAction="ddMRU_OnAction"
Ovaj je postupak implementiran u modRibbonCallback. Ponovno koristi već otvoreni skup zapisa da bi pronašao zapis s odabranom stavkom, a zatim, ovisno o potrebnom polju TableName, otvara odgovarajući obrazac prosljeđujući PK vrijednost koju treba učitati.
Dodatne informacije
- Northwind 2.0 Developer Edition: Template-Tutorial
- Northwind 2.0 Developer Edition: Sve teme