Tämän sisällön sisältö saattaa koskea Northwind 2.0 Developer Editionia ja Starter Editionia.
Accessin VBA-viittaus
VBA (Visual Basic for Applications) on kaikissa Office-tuotteissa käytettävä ohjelmointikieli. VBA-koodin opetteluun avulla voit käyttää kaikkia Office-tuotteita (ei vain Accessia).
Kun haet toimintaohjeita, muista etsiä Access-esimerkkejä, ja sisällyttää hakuun Microsoft Access. Usein muiden Office-tuotteiden ratkaisut toimivat, mutta takuuta ei ole. Microsoft Access on aikuisille tarkoitettu tuote; Tämä tarkoittaa, että esimerkkejä on paljon; mikä on hienoa sinulle!
Se tarkoittaa myös sitä, että vanhemmat Access-ohjelmointia käsittelevät kirjat ovat edelleen käyttökelpoisia. Monet vanhemmista kirjoista ovat edelleen saatavilla käytettyjen kirjojen sivustoilta murto-osalla alkuperäisestä hinnastaan. Tarkista Microsoftin sivustosta, mitä Access-versioita tuetaan edelleen, ja valitse ne.
Officen tuen päättymiseen liittyvät resurssit – Officen käyttöönotto | Microsoft Learn
Alla on linkkejä Microsoftin Access-käyttöohjeisiin.
- Access Visual Basic for Applications (VBA) -viitemateriaali | Microsoft Learn
- VBA-sanasto | Microsoft Learn
- Visual Basicin käsitteelliset aiheet | Microsoft Learn
- Visual Basic for Applications – wikipedia
- VBA-Docs/API at main · MicrosoftDocs/VBA-Docs · GitHub
Luotetut sijainnit ja käytössä oleva sisältö
Microsoft Access -tiedostot ovat Office-tiedostoja. Office-tiedostojen on oltava luotetussa sijainnissa tai niiden sisällön on oltava käytössä. Näitä kohteita pidetään turvallisina, koska olet itse luonut ne tai ne ovat peräisin luotettavasta lähteestä. Luotettujen sijaintien tarkistus tapahtuu aina, kun avaat jonkin Office-tiedoston. Tästä eteenpäin käytämme sitä termillä Luotettu/Käytössä. HUOMAUTUS: Jos sovelluksesta julkaistaan uusi versio, joka avataan epäluotettavasta sijainnista, sisällön käyttöönottoprosessi toistuu.
Lisätietoja luotetuista sijainneista:
- Luotetut sijainnit Office-tiedostoille – Officen käyttöönotto | Microsoft Learn
- Tietokantaan luottaminen (Microsoft-tuki)
- Luotetun sijainnin lisääminen, poistaminen tai muuttaminen (Microsoft-tuki)
Makrot, funktiot ja alitekstit
Makrojen, funktioiden ja alitekstien avulla voit soveltaa liiketoimintalogiikkaa Access-tietokannassasi. On tärkeää, että ymmärrät laajuuden ja näkyvyyden ennen aloittamista.
- SuoritaKoodi-makrotoiminto | Microsoft Learn
- Johdanto makroihin | Microsoft-tuki
- Function Statement (VBA) | Microsoft Learn
- Sub-lauseke (VBA) | Microsoft Learn
Tapahtumat (kuten ohjausobjektin napsauttaminen) lomakkeen ohjausobjekteissa (esimerkiksi painikkeet, tekstiruudut, otsikot jne.) käynnistävät muita prosesseja, kuten tietueiden lisäämisen tai poistamisen tai lomakkeiden avaamisen. Nämä prosessit voidaan toteuttaa joko makrojen tai VBA-koodin avulla. Northwind Starter Edition käyttää enimmäkseen makroja ja joitakin VBA-koodeja, joissa makrot eivät voi suorittaa tarvittavia toimintoja. Northwind Developer Edition käyttää pääasiassa VBA:ta.
Joissain ohjausobjektilajeissa on sisäänrakennettuja ohjattuja toimintoja, jotka luovat makron automaattisesti. Esimerkiksi komentopainikkeen lisääminen lomakkeeseen avaa ohjatun toiminnon, jossa painikkeelle on useita toimintoja. Yhdistelmäruudun lisääminen avaa ohjatun toiminnon, joka voidaan määrittää etsimään tietty tietue lomakkeesta.
Siirtymisruutu
Siirtymisruutu on pääasiallinen tapa, jolla kaikkia tietokantaobjekteja tarkastellaan ja käytetään. Se näkyy oletusarvoisesti Access-ikkunan vasemmassa reunassa.
Northwindin siirtymisruutua on mukautettu. Loimme mukautetun luokan nimeltä Northwind Starter 2.0. Tämän avulla voimme järjestää objektit toiminnallisen alueen mukaan.
Muuttujien laajuus ja näkyvyys VBA:ssa
On tärkeää tutustua laajuuteen ja näkyvyyteen Accessissa/Officessa. Voit aloittaa tästä:
- Laajuuden ja näkyvyyden perusteet (VBA) | Microsoft Learn
- Julkinen lausunto (VBA) | Microsoft Learn
- Yksityinen ote (VBA) | Microsoft Learn
- Staattinen lause (VBA) | Microsoft Learn
- Tietoja muuttujien käyttöiästä (VBA) | Microsoft Learn
Pysyvät muuttujat
Joskus muuttujan on oltava olemassa sen jälkeen, kun sen luonut objekti poistuu vaikutusalueesta. Katso Laajuus ja näkyvyys edellä. Tämän voi tehdä kolmella tavalla: julkiset muuttujat, väliaikaismuuttujat ja arvojen tallentaminen paikalliseen taulukkoon. Monet kehittäjät käyttävät näiden yhdistelmää. Jokaisella on hyvät ja huonot puolensa. Lisätietoja näistä vaihtoehdoista:
VBA-moduulin julkinen muuttuja:
TempVars:
- TempVars-objekti (Access) | Microsoft Learn
- Vihje: Väliaikaisten muuttujien käytön maksimointi Access 2007:ssä ja 2010:ssä | Microsoft 365 -blogi
Arvojen tallentaminen paikalliseen taulukkoon
- Julkiset muuttujat ja väliaikaismuuttujat ovat olemassa nykyistä istuntoa varten, mutta ne poistuvat vaikutusalueesta, kun sovellus suljetaan. Mutta entä jos haluat säilyttää käyttäjäkohtaiset muuttujat kaikissa istunnoissa? Voit tallentaa tämäntyyppiset arvot paikalliseen taulukkoon. Northwind 2.0:ssa yksi tällainen muuttuja tallennetaan SystemSettings-nimiseen taulukkoon. Taulukon arvo on ShowWelcome. Tämä arvo kertoo Accessille, haluatko nähdä aloitusnäytön aina, kun kirjaudut sisään vai et.
OpenArgs ja StringFormat()
Kehittäjien on usein siirrettävä parametreja lomakkeesta toiseen tai lomakkeesta raporttiin. Nämä parametrit välittävät tärkeitä tietoja, joita kutsuttu funktio sitten käyttää määrittääkseen itsensä. Toinen lomake tai raportti voi hakea tietoja ensimmäisestä lomakkeesta usealla eri tavalla. Tässä on muutamia tällaisia tapoja:
- Toinen lomake voi "palata" ensimmäiseen lomakkeeseen ja poimia joitakin arvoja mahdollisesti näkyvästä tai näkymättömästä ohjausobjektista. Esimerkki:
lngCustomerID = Forms!FirstForm!cboCustomerID - Ensimmäinen lomake voi tallentaa arvoja yleisiin muuttujiin tai TempVars-muuttujiin. Esimerkki:
g_lngUserID = Me.cboUserID
TempVars.Add "UserID", Me.cboUserID
Northwind Developer Editionissa ja työelämässä usein käytetty menetelmä on DoCmd.OpenForm- tai OpenReport-argumentin OpenArgs. Esimerkki:
DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
Yhdistämme tässä kaksi tekniikkaa: (1) OpenArgs-funktion käyttö Toimittajatunnus- ja Toimittajatyyppi-arvojen välittämiseen ja (2) StringFormat() -funktion käyttö esimerkiksi seuraavan merkkijonon luomiseen:
CompanyID=5&CompanyTypeID=2
Tämä merkkijono näyttää hyvin pitkälti kyselymerkkijonolta, kun sitä käytetään selaimessa. Se sisältää yhden tai useampia et-merkillä erotettuja nimi/arvo-pareja:
name1=value1&name2=value2
Tällaisen merkkijonon etuna on se, että kullakin arvolla on nimi. Vertaa tätä yksinkertaisempaan lähestymistapaan, jossa OpenArgs-arvoksi määritetään vain "5,2". Tällöin kunkin arvon merkityksien selvittäminen vaatisi vaivaa. Kunkin arvon nimeäminen tekee kyselymerkkijonosta "itsekuvaavan", mikä on hyvä ohjelmointikäytäntö.
DoCmd.OpenForm-kohteen vastaanottavassa päässä ollaan yleensä Form_Open- tai Form_Load-tapahtumassa ja haluamme jäsentää OpenArgs-merkkijonon sen komponenteiksi.
Northwindissä voit tehdä tämän StringToDictionary-funktiolla . Se jäsentää kyselymerkkijonon kaltaisen funktion osiinsa. Nämä osat tallennetaan sitten Scripting.Dictionary-objektiin . Huomaa, että tämä edellyttää Työkaluviittausten > käyttöä ja viittauksen määrittämistä Microsoft Scripting Runtimeen (scrrun.dll).
Sanasto-objektin ominaisuuksia ja etuja ovat seuraavat:
- Osien järjestyksellä ei ole merkitystä
- Yksinkertaiset toiminnot kokoelman elementtien lisäämiseen ja poistamiseen
- Funktioita, joiden avulla voit selata kokoelmaa, jotta tiedät, mitä kokoelmassa on
- Olemassa oleva -funktio, jonka avulla voit testata, onko tietty elementti käytettävissä.
Sanasto-objektia käytetään kaikkialla Northwindissä. Esimerkiksi Form_Load-tapahtuma kohteessa frmGenericDialog.
Virheenkäsittely
Accessin ohjatulla ohjausobjektien luomisella luodut makrot sisältävät harvoin virheenkäsittelyä lainkaan. Ohjatun ohjausobjektien luomisen avulla luotu VBA voi rajoittua yleiseen MsgBox Err.Descriptioniin.
Northwind 2.0:ssa näytämme, miten voit tehdä sen paremmin VBA-koodia käytettäessä. Olemme ottaneet käyttöön niin sanotun yleisen virheenkäsittelytoiminnon. Missä tahansa toimenpiteessä tapahtuvat virheet kutsuvat yleisen tason funktiota virheen näyttämiseksi. Suuri etu tässä on, että virheiden käsittely on johdonmukaista. Jos viestiä on muutettava (kuten näytettävä virhenumero tai kirjattava virhe tiedostoon), se on tehtävä vain yhdessä paikassa.
clsErrorHandler on luokkamoduuli, joka toteuttaa virheenkäsittelykoodin. Luokkamoduuli pitää kaikki pää- ja aputoimintonsa yhdessä yksikössä ja kapseloi siten koodin.
AutoExec-makro kutsuu modStartupin Startup-funktiota. Starter Editionissa funktio luo clsErrorHandler-esiintymän ja tallentaa sen yleisenä muuttujana, joka on käytettävissä koko sovelluksessa. Dev-versiossa käytetään staattista luokkaa – katso kommentit luokkamoduulin yläosassa.
Itse asiassa virheenkäsittelykoodi toimintosarjoissa on niin yhdenmukaista, että pystyimme luomaan koodin kaiken alle viidessä minuutissa käyttämällä erityistä VBA-koodia, joka varustaa kutakin toimintosarjaa oikealla virheenkäsittelytoiminnolla. (Koodi ei sisälly malliin). Sekä Northwind 2.0 Starter- että Developer template -versioissa oli alun perin tämä virheenkäsittelytapa.
'
PARANNETTU VIRHEIDEN KÄSITTELY
Northwind Developer Editionin versiosta 2.2 alkaen virheenkäsittelyä on parannettu Access-yhteisön palautteen perusteella. Starter edition ei muutu.
Virheenkäsittely edellisessä versiossa (2.0 – julkaistu huhtikuussa 2023) on:
Public Sub HandleError(…)
MsgBox Err.Description
End Sub
Versiossa 2.2 se on päivitetty muotoon:
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
If Not IsEventProcedure Then
Err.Raise lngError, strErrSource
End If
MsgBox Err.Description
End Sub
Jotta ymmärrämme tämän muutoksen syyn, ymmärrämme ensin, minkä ansiosta koodi toimii:
- AutoExec-makro kutsuu käynnistystoimintosarjan, joka suorittaa joitakin alustuksia ennen ensimmäisen lomakkeen avaamista.
- Käyttäjä käyttää sovellusta esimerkiksi avaamalla lomakkeen tai napsauttamalla painiketta, jolloin tapahtumatoimintosarjat, kuten Form_Load ja cmdPrintInvoice_Click, käynnistyvät.
'
Tapahtumatoimintosarjojen lisäksi sovelluksilla on alirutiineja ja toimintoja – enimmäkseen moduuleissa – ja tämä koodi kutsutaan tapahtumaproseduureista. Näitä kutsutaan vakiomenettelyiksi.
Northwindin versiossa 2.0 vakiotoimintosarjat käsittelivät omat virheensä viesteillä, mutta ne eivät jollain tavalla ilmoittaneet kutsutapahtumatoimintosarjalle virheestä. Tämä voi olla huono ongelma, jos tapahtumatoimintosarjalla on seuraavaa koodia, joka suoritetaan kutsutun toimintosarjan edellisestä virheestä riippumatta. Toki voisimme korvata alirutiinin funktiolla, joka palauttaa onnistumisen tai epäonnistumisen, ja koodata tapahtumatoimintosarjan sen mukaisesti, mutta se ei ole aina vaihtoehto.
Northwindin versiossa 2.2 vakiotoimintosarjat eivät käsittele virhesanomia, vaan raportoivat ne Err.Raise-komentoa käyttämällä kutsutapahtumatoimintosarjaan. Soittotapahtumatoimintosarja näyttää sitten ilmenneen virheen ja jatkaa Exit_Handler. Tämä on parempi vaihtoehto, koska sen avulla kutsutoimintosarja voidaan päättää sulavasti.
Northwind-version 2.2 koodin käyttämiseksi tapahtumatoimintosarjojen on välitettävä HandleErroriin kolmas argumentti, joka ilmaisee, että kutsuja on tapahtumatoimintosarja. Northwind Dev Edition on päivitetty tätä varten.
Vielä tehokkaampi virheenkäsittelymoduuli tukeisi "työntämistä ja poksahtamista" "pinossa" (matriisissa). Ensimmäinen elementti on aina tapahtumatoimintosarja, joten ylimääräistä argumenttia ei tarvita. Tämä käyttöönotto ylittää Northwind Dev Editionin tavoitteet.
MRU-luettelo
MRU eli Most Recently used on viimeksi käytettyjen tilausten ja ostotilausten luettelo. Voit palata näihin usein ja sijoittaa ne seuraavaan tilaan. Viimeksi käytettyjen luetteloiden luettelot näkyvät Office-tuotteissa usein viimeksi käytettyjen tiedostojen luettelona, jotka haluat ehkä avata uudelleen.
Northwind Dev -versiossa MRU-ominaisuuden (jota ei ole Starter-versiossa) toteuttamiseksi sinun on ensin määritettävä seuraavat kohteet:
- Taulukko, johon tallennetaan viimeksi käytettyjä tietoja varten.
- Koodi, joka päivittää taulukon, kun tilaus tai ostotilaus avataan.
- Koodi, joka päivittää avattavan MRU-valikon valintanauhassa.
- Koodi ladattavaan kohteeseen, kun MRU-kohde valitaan valintanauhasta.
Katsotaanpa näitä kohtia yksityiskohtaisemmin.
1. Taulukko MRU-tietojen tallentamiseen.
MRU-taulukon rakenne, erityisesti sen indeksit, kannattaa tarkistaa. Huomaa, että avattavassa valintanauhassa on SortIdx-indeksin kaksoiskappale, joka helpottaa MRU-kohteiden nopeaa lajittelua, sekä yksilöllinen indeksi, joka valvoo liiketoimintasääntöä, jonka mukaan kohde voi esiintyä kullekin käyttäjälle vain kerran. Jos esimerkiksi avaat saman tilauksen kahdesti, viimeksi lisätyn päivityksen taulukkoon ei luoda kahta tietuetta.
Taulukossa hyödynnetään sitä, että kaikki tietokannan MRU:hen liittyvät PK-kentät ovat laskuri-kenttiä, joten PKValueessa voidaan käyttää Pitkä kokonaisluku -tietotyyppiä.
2. Koodi, joka päivittää taulukon, kun tilaus tai ostonumero avataan.
NW2:ssa päätimme lisätä MRU-luetteloon vain silloin, kun uusi tietue luotiin, ei silloin, kun aiemmin luotu tietue päivitettiin uudelleen. Voisimme varmasti siirtää AddToMRU-kutsun Form_AfterInsert: stä Form_AfterUpdate: een tukemaan sitä.
AddToMRU- ja DeleteFromMRU-menettelyt toteutetaan modGlobalissa, joka on Standard-moduuli, jonka julkiset menettelyt näkyvät mistä tahansa lomakkeesta.
AddToMRU (kuten nimestä voi päätellä) lisää uuden kohteen MRU-taulukkoon ja sitten halutessaan leikkaa sen pois, jolloin vanhin tietue poistetaan, jos se on kasvanut enimmäiskoon (MAX_MRU_COUNT) suuremmaksi. Viimeinen vaihe on luultavasti vähiten Accessin kehittäjien tiedossa: valintanauhan avattava valikko täytyy päivittää, ja se tehdään kutsumalla InvalidateControl-komentoa. Tämä on merkki valintanauhalle, että alustusprosessi suoritetaan uudelleen.
3. Koodi MRU:n päivittämiseksi valintanauhan avattavan valikon kautta.
Käynnistyksen yhteydessä ja sen jälkeen, kun InvalidateControl on kutsuttu, monimutkainen joukko funktioita täyttää valintanauhan. Näitä toimintosarjoja kutsutaan valintanauhan XML-taulukossa uSysRibbons , jossa lukee osittain:
<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>
Nämä neljä vastakutsufunktiota täyttävät avattavan valikon. Huomaa, että tämä on hyvin pitkälti sama idea kuin tässä kuvattu tavallisille yhdistelmäruuduille.
Jos poistat Debug.Print-rivien kommentit modRibbonCallbackissa ja käynnistät sovelluksen uudelleen, välitön suoritusruutu näyttää seuraavanlaisen jakson:
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
Tästä näemme, että Access kutsuu ensin toimintosarjaa, joka palauttaa ladattavien kohteiden määrän ddMRU_GetItemCount ByRef-argumentissa. Tällöin kysely avataan myös viimeksi käytettyyn taulukkoon ja ladataan se välimuistiin, koska sitä ollaan käyttämässä useita kertoja.
Tämän jälkeen valintanauha kutsuu toistuvasti kaksi toimintosarjaa tunniste- ja otsikkoarvojen saamiseksi kaksisarakkeiseen avattavaan valikkoon.
Lopuksi se kutsuu toimintosarjan, joka selvittää, mikä kohde valitaan. (Meidän tapauksessamme se on ensimmäinen.)
4. Koodi kohteen lataamiseen, kun viimeksi käytetty kohde valitaan valintanauhasta.
Kuten kaikissa muissakin valintanauhan kohteissa, valintanauhan XML-tiedoston Toiminnot-ominaisuus määrittää vastakutsufunktion, jota käytetään toiminnon suorittamiseen:
onAction="ddMRU_OnAction"
Tämä toimintosarja on toteutettu modRibbonCallback-toiminnossa. Se käyttää uudelleen avoinna olevaa tietuejoukkoa valitun kohteen tietueen etsimiseen ja avaa sitten tarvittavan TableName-määrityksen mukaan vastaavan lomakkeen välittämällä ladattavan PK-arvon.
Lisätietoja
- Northwind 2.0 Developer Edition: Malli-opetusohjelma
- Northwind 2.0 Developer Edition: Kaikki aiheet