VBA: Tips&Trix

Submitted by lroedal on Sun, 12/10/2017 - 21:14

Navn på knapper, tekstbokser, comboboxer mm.

Det er en fordel om du navngir objekter med en fast forkortelse basert på hvilken type objekt det er, deretter et beskrivende navn for hva dette objektet er til. Objektene, om vi tar knapper som et eksempel, blir automatisk navngitt, "Command**". Dette kan f.eks. forkortes til "com" for "Command". Etter dette beskriver du hva knappen skal gjøre - er det en knapp som skal lagre noe, kan du kanskje kalle den "comLagre"? 

Etter hvert som koden blir avansert vil den inneholde mange objekter - comLagreSkjema er langt mer beskrivende enn Command51. Fokuset er forøvrig ikke hvilke forkortelser du bestemmer deg for å benytte, men derimot at du er konsekvent og lærer deg god praksis for å skrive ryddig kode.

Select Case - et godt alternativ til If-setninger

Det finnes et alternativ til if-tester, dette heter Select Case. I noen tilfeller kan dette være enklere å vedlikeholde, samt lettere å lese. Her er et et eksempel på en enkel Case:

  1. Dim valg as String
  2. valg = cmbValg 'henter brukerens valg fra en combobox
  3.  
  4. Select Case valg
  5. Case "kilometer"
  6. 'kode for å regne fra kilometer til miles her
  7.  
  8. Case "miles"
  9. 'kode for å regne fra miles til kilometer her
  10. End Select

Debug

En programmerers beste venn er debuggingsverktøyet i VBE. Dette lar deg gå gjennom koden steg-for-steg, linje for linje. Dette kan vi bruke dersom vi står fast og ikke finner årsaken til at koden ikke fungerer. Jeg har laget en kort video om debugging som du kan se på, TechontheNet har også laget en tutorial.

Avrunding av tall

Enkleste måte å runde av tall på i VB, er en innebygd funksjon som heter Round. Dersom du skal vise et resultat på begrenset plass er det en stor fordel å runde av, da det vil se langt bedre ut. Her er et kort eksempel:

  1. dim tall as double
  2. tall = 1.5670455
  3. Msgbox(Round(tall,2))

Knytte tabell til listbox/combobox vha. VBA

For å benytte data fra en tabell direkte i en combobox/listbox, kan du sette dette opp i Access' sitt brukergrensesnitt direkte på skjemaet. Om dette ikke er ønskelig, eller dataene skal baseres på et brukervalg, kan du fastsette datagrunnlaget vha. VBA. Her er en kort kodesnutt, som vil kjøres når skjemaet lastes:

  1. Private Sub Form_Load()
  2. Me.lstLengder.RowSourceType = "Table/Query" 'Her angir du at det er snakk om en tabell
  3. Me.lstLengder.RowSource = "lengder" 'her angir du navnet på tabellen du vil bruke
  4. End Sub

Denne koden vil nå kjøres når du laster skjemaet, slik at listboxen er fylt før brukeren ser den. Om du ikke vil skrive rutinen manuelt, finner du denne under "Event" på "Property Sheet" for skjemaet ditt (form), du må da velge "On Load".

Hvordan referere til sub-forms

Her er link til et skjema som inneholder en oversikt over hvordan du kan referere til et sub-skjema (sub-form), eller et skjema, avhengig av hvilket scope du forsøker å gjøre dette fra.

Arrays

Arrays er i svært mange tilfeller veldig nyttig - dere kan lese en god gjennomgang her. Arrays kan blant annet brukes for å legge separate tellere i "samme" variabel - se for deg at du skal lagre antall forekomster av forskjellige tallkarakterer. Da kan du bruke karakteren som "plassering" i arrayet, og på den måten eliminere behov for en eventuell if-setning (gjerne kombinert med en loop). Om du eventuelt skulle lagret andre verdier (som bokstavkarakterer), kan du la hvert tall være en "placeholder" for en gitt bokstav - du kan se et kodeeksempel under:

  1. 'De forskjellige plasseringene i arrayet tilsvarer telleren for hver karakter, som beskrevet under
  2. '0 = A, 1 = B, 2 = C, 3 = D, 4 = E, 5 = F, 6 = Bestått
  3.  
  4. Dim karakterTeller(0 to 6) As Long ' Her deklareres det med syv plasser, siden null telles også
  5.  
  6. 'Om vi antar at vi vet at det er 16 eksamener med D, kan det legges inn i arrayet på denne måten
  7. karakterTeller(4) = 16

Automatisk utfylling av objektnavn

Når dere skriver kode i et skjema (som er det vi gjør i IBE151 det meste av tiden), er det mulig å få automatisk utfylling av objektnavn. Dersom du har navngitt objektene smart - txtNavn for tekstbokser, cbmNavn for comboboxer, btnNavn for knapper mm., har du mulighet til å benytte kommanoen Me. for å få opp en liste over tilgjengelige objekter og kommandoer. Om du da skriver Me.txt vil du se alle tekstboksene som er tilgjengelig på skjemaet. Du kan da velge den du ønsker med pilknappene, og trykke på tabulator-tasten for å autofullføre dette navnet. På denne måten slipper du å hoppe frem og tilbake mellom kode-editoren og Access.

Kommentarer i koden

Etterhvert som programmene deres blir mer avanserte, vil det være gull verdt for dere om dere er flinke å kommentere underveis når dere koder. Da er det langt lettere å komme tilbake til programmet, om dere går en stund uten å jobbe på det. Da vil det også være langt enklere å gå gjennom tidligere oppgaver under eksamensforberedelser. En god kommentar vil være kort og konsis, slik at den som leser koden fort kan orientere seg om hva de forskjellige sub-rutinene og funksjonene gjør. Fant en kort "basis-guide" til kommentering, som dere kan titte på her. I VBA kommenterer dere forøvrig bort setninger med å bruke '-tegnet, slik som dette:

'Dette er en kommentar

Forøvrig blir jeg også glad dersom dere er flinke å kommentere i koden. :)

Linjeskift og innrykk

Dersom dere skal formatere en større string, kan den oftes gjøres mer lesbar ved hjelp av linjeskift og innrykk. Innrykk er alltid fint i koden, men det kan også være gunstig i utdata. For å få innrykk, kan du bruke kommandoen vbTab. Ønsker du derimot linjeskift, kan kommandoen vbCrLf benyttes.

  1. Msgbox("Dette er et eksempel på linjeskift." & VbCrLf & "Denne setningen vil komme på neste linje")
  2.  
  3. Msgbox("Del en av setningen" & VbTab & "Denne delen vil ligge et standard innrykk lengre til venstre.")

Funksjonene Len() og Replace()

Funksjonen Len() kan være svært nyttig. Denne funksjonen tar i mot en string, og returnerer en integer tilsvarende antallet bokstaver i stringen.

integer = Len("Dette er en test")

Variabelen integer vil nå inneholde verdien 16, da dette er antallet tegn i stringen vi gir den.

Ellers er funksjonen Replace() nyttig, da denne kan benyttes til å "rense" enkeltord for tegn som ligger igjen når vi splitter opp ordene fra teksten. Dette kan f.ex. være tegn som "?", ",", "!" og så videre. Dere kan lese mer om denne funksjonen på TechonNet, der er det også godt forklart hvordan den brukes.

CurrentProject.Path

CurrentProject.Path kan brukes for å hente ut filstien til Access-filen - om tekstfilen dere skal lese fra ligger i samme mappe som Access-filen kan dere bruke denne kommandoen og legge den sammen med filnavnet for å få den komplette stien.

Split() og Left()/Right()

For å "dele opp" dataene i linjene dere henter inn fra tekstfilen har dere to valg - Split() og Left()/Right()Split() deler opp en tekststreng basert på ønsket kriterie, og legger delene i et array. Left() henter det antallet tegn du ønsker, og begynner helt fra venstre - Right() begynner fra høyre. Disse to funksjonene kan brukes for å hente ut de to verdiene fra hver sin kant, slik at du kan bruke de som du ønsker.

Parameterspørring

For å sette opp en parameterspørring, er det tilstrekkelig å legge til et kriterie på feltet du ønsker å sette et parameter for. Teksten du skriver som kriterie vil være teksten som vises til bruker, og denne må settes en brakett rundt, slik som dette: [Skriv inn ønsket verdi]

Om dere ønsker å søke på en verdi som et felt skal inneholde, må dere legge til "wildcards" før og etter kriteriet. Dette kan dere gjøre ved hjelp av funksjonen Like, slik som dette: Like "*" & [Skriv inn ønsket verdi] & "*". Dette kan dere lese mer om hos TechOnTheNet.

"Page Break"

Når dere skal sette opp rapporten, skal denne grupperes etter studentnummer. For et penere resultat, kan det være flott å dedikere en egen side til hver student. Dette er mulig, ved bruk av Page Break, som dere kan lese mer om hos Microsoft.