Innføring
Denne artikkelen beskriver hvordan du bruker variabler i microsoft Excel-delprosedyrer i Microsoft Visual Basic for Applications.
Mer informasjon
Variabler i en delprosedyre
En kraftig funksjon i programmeringsspråk er muligheten til å lagre noe i en variabel, slik at innholdet i variabelen kan brukes eller endres senere i prosedyren. Dette dokumentet beskriver følgende bruk av variabler i Visual Basic:
- Hvordan variabler deklareres.
- Prosedyrene og prosjektene som kan bruke variabelen.
- Levetiden til en variabel.
Deklarere en variabel i en makro
Den enkleste måten å deklarere en variabel i en makro på, er å bruke Dim-setningen. Følgende linje deklarerer to variabler, som heltall:
Dim x As Integer, y As Integer
Med x og y angitt som heltall, ber du Visual Basic om å sette av nok minne til en heltallsvariabel (2 byte hver for x og y), og at informasjonen som er lagret i x eller y, er et heltall mellom -32768 og 32767.
MERK: Hvis du erklærer mer enn én variabel ved hjelp av én enkelt Dim-setning, må du angi datatypen for hver variabel.
Hvis du ikke angir datatypen for hver variabel, som i følgende Visual Basic-kode, konfigureres bare variabelen y som en heltallsvariabel. Variabelen x vil være en varianttype:
Dim x, y As Integer
Hvis du vil ha mer informasjon, kan du se variantdatatypen nedenfor.
Følg disse trinnene for å utføre en variabeltest:
Lagre og lukk alle åpne arbeidsbøker, og åpne deretter en ny arbeidsbok.
Start Visual Basic Editor (trykk ALT+F11).
Klikk Modul på Sett inn-menyen.
Skriv inn følgende kode:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox "verdien av x er " & x & _
Chr(13) & "verdien av y er " & y
End SubKjør makroen Variable_Test . Du får følgende melding:
the value of x is 10
the value of y is 100Klikk på OK.
I Variable_Test endrer makroen følgende linje:
x = 10Å:
x = "error"Kjør makroen Variable_Test .
Du får en kjøretidsfeil fordi "feil" ikke er et heltall, og du prøver å tilordne denne strengverdien til heltallsvariabelen x.
Sammendrag av datatype
Dette er de vanlige variabeldatatypene:
datatypen Variant
Hvis du ikke angir en datatype når du erklærer en variabel, eller du ikke erklærer en variabel i det hele tatt, angir Visual Basic automatisk variantdatatypen for denne variabelen. Følgende er fordelene med variabler som er deklarert som denne datatypen:
- Variablene kan inneholde streng-, dato-, klokkeslett-, boolske- eller numeriske verdier.
- Variablene kan konvertere verdiene de inneholder automatisk.
Ulempen er at variantvariabler krever minst 16 byte med minne. 16 byte minne kan være viktig i store prosedyrer eller i komplekse moduler.
Følg disse trinnene for å se hvordan dette fungerer i makroen Variable_Test:
Endre koden i den Variable_Test makroen til:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Kjør makroen Variable_Test .
Du får ingen feilmelding fordi du kan tilordne noe til variantvariablene x og y.
MERK: Du kan også utelate følgende linje, og makroen vil fortsatt fungere som variablene x og y behandles som variantdatatyper:
Dim x, y
Omfanget til en variabel
Når du erklærer en variabel, kan det hende den ikke vises av andre makroer i samme modul, i andre moduler eller i andre prosjekter. Denne tilgjengeligheten av en variabel i moduler kalles omfang. De tre typene omfang er prosedyrenivå, privat modulnivå og offentlig modulnivå. Omfanget avhenger av hvordan og hvor du erklærer variabelen eller variablene.
Omfang på prosedyrenivå
En variabel med omfang på prosedyrenivå vises ikke utenfor prosedyren der den er deklarert. Hvis du angir verdien for en variabel som har omfang på prosedyrenivå, vil ikke denne variabelens innhold ses av andre makroer.
Følg disse trinnene for å bekrefte at en variabel med omfang på prosedyrenivå ikke vises utenfor prosedyren der den er deklarert:
Sett inn en ny modul i prosjektet.
Skriv inn begge følgende makroer i denne modulen:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as seen by Macro1 is " & x 'the next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, as seen by Macro2 is " & x End SubKjør Makro1, så får du følgende melding:
x, as seen by Macro1 is 10Klikk OK, så får du følgende melding:
x, as seen by Macro2 isKlikk på OK.
Makro2 viser ikke en verdi for variabelen x fordi variabelen x er lokal for Macro1.
Omfang på privat og offentlig modulnivå
Du kan definere variabler i deklarasjonsdelen av en modul (øverst i en modul, fremfor alle delprosedyrer), og angi omfanget av variabelen ved hjelp av den offentlige setningen, Dim-setningen eller Private-setningen. Hvis du plasserer den offentlige erklæringen foran variabelen, vil variabelen være tilgjengelig for alle makroene i alle modulene i prosjektet. Hvis du plasserer enten Dim-setningen eller Privat-setningen foran variabelen, er variabelen bare tilgjengelig for makroer i modulen der den deklareres.
Følg disse trinnene for å se forskjellen mellom den offentlige erklæringen og Dim-setningen:
Lagre og lukk alle åpne arbeidsbøker, og åpne deretter en ny arbeidsbok.
Start the Visual Basic Editor.
Sett inn en modul i prosjektet.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub Sett inn en annen modul i prosjektet.
Skriv inn følgende kode i denne modulen:
Sub Macro2()
x = x * 3
MsgBox x
End SubKjør Macro_1a makro i den første modulen.
Med variabelen x deklarert som «Offentlig x som heltall», har alle tre makroene i prosjektet tilgang til verdien av x. Den første meldingsboksen viser en verdi på 10. Den andre meldingsboksen viser en verdi på 20 (fordi x multipliseres med 2 i Macro_1b). Den tredje meldingsboksen viser en verdi på 60 (fordi verdien av x ble endret til 20 i Macro_1b og deretter ble den multiplisert med 3 i Makro2).
Endre deklarasjonslinjen i den første modulen fra:
Public x As IntegerÅ:
Dim x As IntegerKjør makroen Macro_1a .
Med variabelen x deklarert som Dim x As Integer, er det bare makroene i den første modulen som har tilgang til verdien x. Så den første meldingsboksen viser en verdi på 10, den andre meldingsboksen viser en verdi på 20, (fordi x multipliseres med 2 i Macro_1b), og den tredje meldingsboksen viser en verdi på 0 (fordi Makro2 ikke ser verdien av x og den uinitialiserte verdien av null brukes av makro 2).
Endre deklarasjonslinjen i den første modulen fra:
Dim x As IntegerÅ:
Private x As IntegerKjør makroen Macro_1a .
De samme meldingsboksene vises ved hjelp av private setningsomfang da de brukte Dim-setningen. Variabelen x har samme omfang, privat for modulen der den er deklarert.
MERK: Hvis du vil at omfanget av variabelen skal begrenses til modulen der den er deklarert, bruker du Privatestatement i stedet for Dim-setningen. Begge oppnår samme effekt, men omfanget er klarere når du leser koden hvis du bruker privaterklæringen.
Levetid for en variabel
Tidspunktet da en variabel beholder verdien, kalles levetiden. Verdien til en variabel kan endres i løpet av levetiden, men den beholder en verdi. Når en variabel mister omfanget, har den heller ikke lenger en verdi.
Initialisere verdien til en variabel
Når du kjører en makro, initialiseres alle variablene til en verdi. En numerisk variabel initialiseres til null, en variabel lengdestreng initialiseres til en tom streng (""), og en fast lengdestreng fylles med ASCII-koden 0. Variantvariabler initialiseres til Tom. En tom variabel representeres av en null i en numerisk kontekst og en tom streng ("") i en strengkontekst.
Variabler på prosedyrenivå
Hvis du har en variabel som er deklarert i en makro ved hjelp av Dim-setningen, beholder variabelen verdien så lenge makroen kjører. Hvis denne makroen kaller opp andre makroer, beholdes verdien av variabelen (ikke tilgjengelig for de andre makroene) så lenge disse andre makroene også kjører.
Følg disse trinnene for å demonstrere hvordan variabler på prosedyrenivå fungerer:
Sett inn en ny modul i prosjektet.
Skriv inn begge følgende makroer i denne modulen:
Sub Macro1()
'angi x som en variabel på prosedyrenivå
Nedtonet x som heltall
MsgBox «den initialiserte verdien av x er » & x
x = 10
MsgBox "x is" & x
'neste linje kjører Macro2
Makro 2
MsgBox x er fremdeles & x
End Sub
Sub Macro2()
MsgBox x, som vist av Macro2 er & x
End SubKjør Makro1.
Du får følgende melding:
the initialized value of x is 0Klikk OK, så får du meldingen:
x is 10Klikk OK, så får du følgende melding:
x, as seen by Macro2 isKlikk på OK.
Makro2 viser ikke en verdi for variabelen x fordi variabelen x er lokal for Macro1. Du får følgende melding:
x is still 10Klikk på OK.
Kjør Makro1.
Du får de samme meldingene som er beskrevet i trinn 3 til 6, fordi så snart Macro1 sluttet å kjøre i trinn 6, gikk verdien av variabelen x tapt. Når du kjører Makro1 på nytt i trinn 7, viser den første meldingen verdien av x som null (den initialiserte verdien).
Statisk nøkkelord
Hvis en variabel på prosedyrenivå deklareres ved hjelp av static-nøkkelordet, beholder variabelen verdien til prosjektet tilbakestilles. Hvis du har en statisk variabel neste gang du kaller opp prosedyren, initialiseres den statiske variabelen til den siste verdien.
Følg disse trinnene for å se hvordan static-nøkkelordet fungerer:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Kjør Makro1.
Du får meldingen:
the initialized value of x is 0Klikk OK, så får du meldingen:
x is 10Klikk på OK.
Kjør Makro1, så får du følgende melding:
the initialized value of x is 10Klikk OK, så får du følgende melding:
x is 20Klikk på OK.
Verdiene som vises i meldingene, er forskjellige andre gang fordi variabelen x deklareres som en statisk variabel, og variabelen beholder verdien etter at du har kjørt Macro1 første gang.
MERK: Hvis du har en variabel på modulnivå, er levetiden den samme som om den var en statisk variabel på prosedyrenivå.
Følg disse trinnene for å bekrefte levetiden til en variabel på modulnivå:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Kjør Makro1, så får du følgende melding:
the initialized value of x is 0Klikk OK, så får du følgende melding:
x is 10Klikk OK,
Kjør Makro1, så får du denne meldingen:
the initialized value of x is 10Klikk på OK.
Du får følgende melding:
x is 20Klikk på OK.
Verdiene som vises i meldingene, er forskjellige andre gang fordi variabelen x deklareres som en statisk variabel, og den beholder verdien etter at du har kjørt Macro1 første gang.
Tilbakestille et prosjekt for å tilbakestille variabler
Hvis du vil tilbakestille verdien for en statisk variabel eller for en variabel på modulnivå, klikker du Tilbakestill-knappen på
Standard verktøylinjen, eller klikk Tilbakestill på Kjør-menyen.
Hvis du gjør dette for Macro1-prosjektet og deretter kjører Macro1 på nytt, initialiseres verdien for variabelen x tilbake til null, og du får den første meldingen:
the initialized value of x is 0