Denne opplæringen vil demonstrere hvordan du deklarerer (Dim), oppretter og initialiserer matrisevariabler i VBA
Hva er en VBA Array -variabel?
En VBA -matrisvariabel kan betraktes som en gruppe variabler, lagret under samme navn og med samme datatype. En matrise kan lagre tekst, tall eller objekter.
Du refererer til et element i en matrise ved å bruke indeksnummeret.
Du kan deklarere en matrisevariabel på samme måte som du ville deklarere en annen variabel ved å bruke Dim, Statisk, Offentlig eller Privat søkeord.
Statiske matriser
Det er to typer matriser - Statisk og Dynamisk. En statisk matrise deklareres med den angitte størrelsen når du først deklarerer matrisen. Det kalles også en Fixed Array.
1 | Dim intA (4) som heltall |
Matrisen ovenfor deklareres ved bruk av Dim -setningen på et prosedyre- eller modulnivå, og størrelsen på matrisen er 5 ettersom vi ikke har deklarert LBound -verdien til matrisen.
Nei, det er ikke en skrivefeil! Array -størrelsen er 5, til tross for at du har angitt 4 i matrisen. Dette er fordi matrisindekser automatisk starter på null.
Arrayindekser
Arrayindekser begynner automatisk på null med mindre Alternativbase 1 er deklarert øverst i kodemodulen.
Hvis Alternativbase 1 blir deklarert, starter matriser automatisk ved 1.
Jeg synes imidlertid det er problematisk å erklære variabler på en slik måte. Kodevurderere er kanskje ikke klar over at matriser starter på null eller av Option Base 1 -erklæringen
I stedet foretrekker jeg eksplisitt å angi start- og sluttposisjonen til matriser:
1 | Dim intA (2 til 5) som heltall |
Legg merke til at når du gjør det, kan du starte matrisen med et hvilket som helst tall (ikke bare 1 eller 0).
Dynamiske matriser
En Dynamic Array -variabel er en matrise hvis størrelse kan endres under kjøretid. Du erklærer dynamiske variabler uten størrelse.
1 | Dim intA () som heltall |
Du kan bruke ReDim -setningen til å angi størrelsen på matrisen etter at matrisen er opprettet.
1 | ReDim intA (2) |
Du kan endre størrelsen på en dynamisk matrise når som helst. Når du bruker ReDim -erklæringen, slettes imidlertid alle eksisterende verdier. For å bevare eksisterende matrisverdier, bruk ReDim Preserve i stedet.
1 | ReDim Preserve intA (2) |
Du kan deklarere en dynamisk matrise på et prosedyre-, modul- eller globalt nivå, men du kan bare bruke ReDim -setningen i en prosedyre.
Variant Arrays
Variantarrayer er dynamiske matriser som er lettere å jobbe med.
1 | Dim varNames () |
Legg merke til at du ikke trenger å spesifisere datatypen (det antas å være variant) eller matrisestørrelsen.
Som vi ser nedenfor, kan du initialisere variantarrayer ved hjelp av Array -funksjonen (du trenger ikke å endre størrelsen på arrays først)!
Deklarere modul og offentlige oppsett
Som vist ovenfor kan matriser deklareres innenfor prosedyrer, for bruk innenfor denne prosedyren:
1234 | Sub StaticArray ()'erklærer matrisen med en LBound -verdi på 1 og en UBound -verdi på 4Dim IntA (1 til 4) som heltallSlutt Sub |
Men de kan også deklareres på modul- eller globalt nivå.
1234567 | Alternativ Eksplisitt'erklærer matrisen med en LBound -verdi på 1 og en UBound -verdi på 4Dim IntA (1 til 4) som heltallSub StaticArray ()Slutt Sub |
I dette eksemplet kan matrisevariabelen kalles hvor som helst i denne kodemodulen. I stedet kan du deklarere en offentlig matrise som kan brukes i hele ditt VBA -prosjekt (se neste avsnitt).
Erklæring om offentlig matrise
Du erklærer en offentlig statisk matrise slik du ville erklært en offentlig variabel.
1 | Offentlig strNames (3) som streng |
Denne erklæringen må gå øverst i modulen, under Alternativ eksplisitt. Det kan deretter brukes i hele ditt VBA -prosjekt i en hvilken som helst modul eller prosedyre.
Hvis du erklærer matrisen øverst i modulen, men med Dim -søkeordet, er bruken av denne matrisen begrenset til den enkelte modulen. Hvis du prøver å bruke matrisen i en egen modul, vil det føre til en feil.
Initialiser matriser
Du kan tilordne verdier til en statisk matrise på følgende måte.
1234567891011 | Sub StaticArray ()'erklærer matrisen med en LBound -verdi på 1 og en UBound -verdi på 4Dim IntA (1 til 4) som heltall'initialiser matrisenIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'vis resultatet av posisjon 2 i matrisen i det umiddelbare vinduetDebug.Print IntA (2)Slutt Sub |
Hvis du kjører prosedyren ovenfor, vil verdien på 20 vises i det umiddelbare vinduet.
Du kan også tilordne verdiene til en dynamisk matrise på samme måte
12345678910111213 | Sub DynamicArray ()'erklærer en dynamisk matrise, men utelater de begrensede verdieneDim IntA () som heltall'initialiser matrisenReDim IntA (1 til 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'vis resultatet av posisjon 2 i matrisen i det umiddelbare vinduetDebug.PrintIntA (2)Slutt Sub |
Array -funksjon
Derimot, bare med variantarrayen, kan du bruke Array -funksjonen som kan være enklere enn å bruke standardmetoden.
12 | 'fyll ut matrisenintA () = Array (10, 20, 30, 40) |
Fyll ut matrise med sløyfe
Du kan også fylle ut matriser ved å gå gjennom en rekke celler i Excel
1234567891011121314151617 | Sub TestDynamicArrayFromExcel ()'erklærer matrisenDim strNames () As String'erklærer et helt tall for å telle radene i et områdeDim n Som heltall'erklærer et heltall for løkkenDim i As Integer'teller radene i et områden = Range ("A1", Range ("A1"). End (xlDown)). Rows.Count'rediger matrisen til mengden rader i området.ReDim strNames (n)For i = 0 Til nstrNames (i) = Range ("A1"). Offset (i + 1, 0)Neste jeg'vis verdiene i matrisenMsgBox Join (strNames ())Slutt Sub |
Initialiser arrays på nytt
Du kan initialisere matrisen på nytt når som helst i koden, men du vil da miste den opprinnelige verdien som finnes i den posisjonen i matrisen.
1234567891011121314 | Sub StaticArray ()'erklærer matrisen med en LBound -verdi på 1 og en UBound -verdi på 4Dim IntA (1 til 4) som heltall'initialiser matrisenIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'vis resultatet av posisjon 2 i matrisen i det umiddelbare vinduetDebug.Print IntA (2)'initialiser matrisen igjenintA (2) = 200Debug.Print IntA (2)Slutt Sub |
I eksemplet ovenfor beholder den statiske matrisen alle verdiene, bortsett fra verdien i posisjon 2 - den verdien endres til 200.
Bruke ReDim
Hvis du bruker en dynamisk matrise, brukes ReDim -setningen til å angi størrelsen på matrisen. Du kan bruke ReDim -setningen senere i koden for å endre størrelsen på matrisen så mange ganger du trenger. Kodelinjen nedenfor vil initialisere intA Array på nytt for å ha en størrelse på 2 (Husk - en Array -indeks begynner på 0!)
1 | ReDim intA (1) som heltall |
Så koden inkludert ReDim -setningen vil se ut som eksemplet nedenfor.
1234567891011121314151617 | Sub TestDynamicArray ()'erklærer matrisenDim intA () Som heltallReDim intA (2)'fyll ut matrisen med tallintA (0) = 2intA (1) = 5intA (2) = 9'vis tallet i posisjon 1Debug.Print intA (1)'Rediger matrisen for å endre størrelsenReDim intA (3)intA (0) = 6intA (1) = 8'vis tallet i posisjon 1 denne gangenDebug.Print intA (1)Slutt Sub |
Hvis du kjører prosedyren ovenfor, vil verdien på 5 vises i det umiddelbare vinduet, og deretter vil verdien på 8 bli vist når vi har endret størrelsen på matrisen ved hjelp av ReDim og repopulert den. Siden vi imidlertid ikke har fylt ut IntA (2), og vi ikke brukte Re-Dim Preserve, vil verdien i den posisjonen i matrisen bli fjernet, og både posisjon 3 og 4 i matrisen vil være null.
Bruke ReDim Preserve
Hvis vi bruker ReDim Preserve, beholder det de opprinnelige verdiene i matrisen.
1234567891011121314151617 | Sub TestDynamicArray ()'erklærer matrisenDim intA () Som heltallReDim intA (2)'fyll ut matrisen med tallintA (0) = 2intA (1) = 5intA (2) = 9'vis tallet i posisjon 2Debug.Print intA (2)'redimere matrisenReDim intA (3)intA (0) = 6intA (1) = 8'vis nummeret i posisjon 2 igjenDebug.Print intA (2)Slutt Sub |
I begge meldingsboksene som vises ovenfor, vil tallet 9 vises da ReDim Preserve -setningen beholdt denne verdien i den posisjonen.