Arrays i Visual Basic for Application

Matriser i Visual Basic for Application er strukturer som vanligvis lagrer sett med relaterte variabler av samme type. Matriseoppføringer er tilgjengelige ved deres numeriske indeks.

For eksempel er det et team på 20 personer hvis navn må lagres for senere bruk i VBA-kode. Man kan ganske enkelt erklære 20 variabler for å holde hvert navn, slik:

Dim Team_Member1 As String Dim Team_Member2 As String ... Dim Team_Member20 As String

Men du kan bruke en mye enklere og mer organisert måte – lagre en liste over teammedlemsnavn i en rekke med 20 variabler som String:

Dim Team_Members(1 Til 20) Som streng

På linjen vist ovenfor har vi erklært en matrise. La oss nå skrive en verdi til hvert av elementene, slik:

Team_Members(1) = "John Smith"

En ekstra fordel med å lagre data i en matrise, sammenlignet med å bruke separate variabler, blir tydelig når det blir nødvendig å utføre den samme handlingen på hvert element i matrisen. Hvis navnene på teammedlemmene ble lagret i 20 separate variabler, ville det ta 20 linjer med kode å skrive hver gang for å utføre den samme handlingen på hver av dem. Men hvis navnene er lagret i en matrise, kan du utføre ønsket handling med hver av dem ved å bruke en enkel sløyfe.

Hvordan det fungerer er demonstrert nedenfor med et kodeeksempel som skriver ut navnene på hvert teammedlem sekvensielt i kolonnecellene. A aktivt Excel-regneark.

For i = 1 til 20 celler(i,1). Verdi = Team_Members(i) Neste i

Å jobbe med en matrise som lagrer 20 navn er åpenbart mye mindre tungvint og mer nøyaktig enn å bruke 20 separate variabler. Men hva om disse navnene ikke er 20, men 1000? Og hvis det i tillegg er påkrevd å holde etternavn og patronymer separat?! Det er klart at det snart vil bli helt umulig å håndtere et slikt datavolum i VBA-kode uten hjelp av en array.

Flerdimensjonale arrays i Excel Visual Basic

Visual Basic-matrisene diskutert ovenfor anses endimensjonale. Dette betyr at de lagrer en enkel navneliste. Matriser kan imidlertid ha flere dimensjoner. For eksempel kan en todimensjonal matrise sammenlignes med et rutenett av verdier.

La oss si at du vil lagre de daglige salgstallene for januar for 5 forskjellige team. Dette vil kreve en todimensjonal matrise bestående av 5 sett med beregninger i 31 dager. La oss erklære en matrise som dette:

Dim Jan_Sales_Figures(1 til 31, 1 til 5) som valuta

For å få tilgang til array-elementer Jan_Salg_Tall, må du bruke to indekser som indikerer dagen i måneden og kommandonummeret. For eksempel adressen til et element som inneholder salgstall for 2-å lag for 15. januar vil bli skrevet slik:

Jan_Sales_Figures(15, 2)

På samme måte kan du deklarere en matrise med 3 eller flere dimensjoner – bare legg til flere dimensjoner til matriseerklæringen og bruk ytterligere indekser for å referere til elementene i denne matrisen.

Erklære matriser i Excel Visual Basic

Tidligere i denne artikkelen har vi allerede sett på flere eksempler på å deklarere arrays i VBA, men dette emnet fortjener en nærmere titt. Som vist kan en endimensjonal matrise deklareres slik:

Dim Team_Members(1 Til 20) Som streng

En slik erklæring forteller VBA-kompilatoren at arrayen Lag medlemmer består av 20 variabler som kan nås ved indekser fra 1 til 20. Vi kan imidlertid tenke på å nummerere våre matrisevariabler fra 0 til 19, i så fall bør matrisen deklareres slik:

Dim Team_Members(0 Til 19) Som streng

Faktisk, som standard, starter nummereringen av matriseelementer fra 0, og i matriseerklæringen kan det hende at den første indeksen ikke er spesifisert i det hele tatt, slik:

Dim Team_Members(19) Som streng

VBA-kompilatoren vil behandle en slik oppføring som å deklarere en rekke med 20 elementer med indekser fra 0 til 19.

De samme reglene gjelder når du deklarerer flerdimensjonale Visual Basic-matriser. Som allerede vist i et av eksemplene, når du erklærer en todimensjonal matrise, er indeksene til dimensjonene atskilt med et komma:

Dim Jan_Sales_Figures(1 til 31, 1 til 5) som valuta

Men hvis du ikke spesifiserer en startindeks for begge dimensjonene til matrisen og erklærer den slik:

Dim Jan_Sales_Figures(31, 5) Som valuta

da vil denne oppføringen bli behandlet som en todimensjonal matrise, hvor den første dimensjonen inneholder 32 elementer med indekser fra 0 til 31, og den andre dimensjonen av matrisen inneholder 6 elementer med indekser fra 0 til 5.

Dynamiske matriser

Alle arrays i eksemplene ovenfor har et fast antall dimensjoner. Men i mange tilfeller vet vi ikke på forhånd hvilken størrelse arrayet vårt skal ha. Vi kan komme oss ut av situasjonen ved å erklære et stort utvalg, hvis størrelse helt sikkert vil være større enn nødvendig for vår oppgave. Men en slik løsning vil kreve mye ekstra minne og kan bremse programmet. Det finnes en bedre løsning. Vi kan bruke en dynamisk matrise - dette er en matrise hvis størrelse kan settes og endres et hvilket som helst antall ganger under utførelsen av en makro.

En dynamisk matrise er deklarert med tomme parenteser, slik:

Dim Team_Members() Som streng

Deretter må du deklarere dimensjonen til matrisen under kjøring av kode ved å bruke uttrykket ReDim:

ReDim Team_Members(1 til 20)

Og hvis du under kjøringen av koden må endre størrelsen på arrayet igjen, kan du bruke ReDim-uttrykket igjen:

Hvis Team_Size > 20 Så ReDim Team_Members(1 To Team_Size) End If

Husk at å endre størrelse på en dynamisk matrise på denne måten vil resultere i tap av alle verdier som er lagret i matrisen. For å lagre data som allerede er i arrayet, må du bruke nøkkelordet Bevaresom vist nedenfor:

Hvis Team_Size > 20 Da ReDim Bevar Team_Members(1 To Team_Size) End If

Dessverre nøkkelordet Bevare kan bare brukes til å endre den øvre grensen for en matrisedimensjon. Den nedre grensen til en matrise kan ikke endres på denne måten. Hvis matrisen har flere dimensjoner, bruker du også nøkkelordet Bevare, kan bare den siste dimensjonen av matrisen endres.

Legg igjen en kommentar