Arrayer i Visual Basic for Application

Arrayer i Visual Basic for Application är strukturer som vanligtvis lagrar uppsättningar av relaterade variabler av samma typ. Matrisposter nås via deras numeriska index.

Till exempel finns det ett team på 20 personer vars namn behöver sparas för senare användning i VBA-kod. Man kan helt enkelt deklarera 20 variabler för att hålla varje namn, så här:

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

Men du kan använda ett mycket enklare och mer organiserat sätt - lagra en lista med gruppmedlemmarnas namn i en uppsättning av 20 variabler som Sträng:

Dim Team_Members(1 Till 20) Som sträng

På raden som visas ovan har vi deklarerat en array. Låt oss nu skriva ett värde till vart och ett av dess element, så här:

Team_Members(1) = "John Smith"

En ytterligare fördel med att lagra data i en array, jämfört med att använda separata variabler, blir uppenbar när det blir nödvändigt att utföra samma åtgärd på varje element i arrayen. Om namnen på gruppmedlemmarna lagrades i 20 separata variabler skulle det ta 20 rader kod att skriva varje gång för att utföra samma åtgärd på var och en av dem. Men om namnen är lagrade i en array kan du utföra önskad åtgärd med var och en av dem med en enkel loop.

Hur det fungerar visas nedan med ett kodexempel som skriver ut namnen på varje gruppmedlem sekventiellt i kolumncellerna. A aktivt Excel-kalkylblad.

För i = 1 till 20 celler(i,1).Value = Team_Members(i) Nästa i

Att arbeta med en array som lagrar 20 namn är naturligtvis mycket mindre krångligt och mer exakt än att använda 20 separata variabler. Men vad händer om dessa namn inte är 20, utan 1000? Och om det dessutom är obligatoriskt att hålla efternamn och patronymer separat?! Det är klart att det snart kommer att bli helt omöjligt att hantera en sådan mängd data i VBA-kod utan hjälp av en array.

Flerdimensionella arrayer i Excel Visual Basic

Visual Basic-matriserna som diskuteras ovan anses vara endimensionella. Det betyder att de lagrar en enkel lista med namn. Matriser kan dock ha flera dimensioner. Till exempel kan en tvådimensionell matris jämföras med ett rutnät av värden.

Låt oss säga att du vill spara de dagliga försäljningssiffrorna för januari för 5 olika team. Detta kommer att kräva en tvådimensionell array som består av 5 uppsättningar mätvärden under 31 dagar. Låt oss deklarera en array så här:

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

För att komma åt arrayelement Jan_Säljsiffror, måste du använda två index som anger månadens dag och kommandonumret. Till exempel adressen till ett element som innehåller försäljningssiffror för 2-åh lag för 15: e Januari skulle skrivas så här:

Jan_Sales_Figures(15, 2)

På samma sätt kan du deklarera en array med 3 eller fler dimensioner – lägg bara till ytterligare dimensioner till arraydeklarationen och använd ytterligare index för att referera till elementen i denna array.

Deklarera arrayer i Excel Visual Basic

Tidigare i den här artikeln har vi redan tittat på flera exempel på att deklarera arrayer i VBA, men det här ämnet förtjänar en närmare titt. Som visas kan en endimensionell array deklareras så här:

Dim Team_Members(1 Till 20) Som sträng

En sådan deklaration talar om för VBA-kompilatorn att arrayen Gruppmedlemmar består av 20 variabler som kan nås vid index från 1 till 20. Vi kan dock tänka oss att numrera våra matrisvariabler från 0 till 19, i vilket fall matrisen ska deklareras så här:

Dim Team_Members(0 Till 19) Som sträng

Faktum är att som standard börjar numreringen av arrayelement från 0, och i arraydeklarationen kanske det initiala indexet inte specificeras alls, så här:

Dim Team_Members(19) Som sträng

VBA-kompilatorn kommer att behandla en sådan post som att deklarera en array med 20 element med index från 0 till 19.

Samma regler gäller när man deklarerar flerdimensionella Visual Basic-matriser. Som redan visas i ett av exemplen, när du deklarerar en tvådimensionell array, separeras indexen för dess dimensioner med ett kommatecken:

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

Men om du inte anger ett startindex för båda dimensionerna av arrayen och deklarerar det så här:

Dim Jan_Sales_Figures(31, 5) Som valuta

då kommer denna post att behandlas som en tvådimensionell array, vars första dimension innehåller 32 element med index från 0 till 31, och den andra dimensionen av arrayen innehåller 6 element med index från 0 till 5.

Dynamiska matriser

Alla arrayer i exemplen ovan har ett fast antal dimensioner. Men i många fall vet vi inte i förväg vilken storlek vår array ska ha. Vi kan ta oss ur situationen genom att deklarera en enorm uppsättning, vars storlek säkerligen kommer att vara större än nödvändigt för vår uppgift. Men en sådan lösning kommer att kräva mycket extra minne och kan sakta ner programmet. Det finns en bättre lösning. Vi kan använda en dynamisk array – detta är en array vars storlek kan ställas in och ändras hur många gånger som helst under exekveringen av ett makro.

En dynamisk array deklareras med tomma parenteser, så här:

Dim Team_Members() Som sträng

Därefter måste du deklarera dimensionen för arrayen under kodexekveringen med hjälp av uttrycket ReDim:

ReDim Team_Members(1 till 20)

Och om du under exekveringen av koden behöver ändra storleken på arrayen igen, kan du använda ReDim-uttrycket igen:

Om Team_Size > 20 Då ReDim Team_Members(1 To Team_Size) End If

Tänk på att storleksändring av en dynamisk array på detta sätt kommer att resultera i att alla värden som är lagrade i arrayen går förlorade. För att lagra data som redan finns i arrayen måste du använda nyckelordet Bevaraenligt nedanstående:

Om Team_Size > 20 Då ReDim Bevara Team_Members(1 To Team_Size) End If

Tyvärr nyckelordet Bevara kan endast användas för att ändra den övre gränsen för en matrisdimension. Den nedre gränsen för en array kan inte ändras på detta sätt. Om arrayen har flera dimensioner, använd nyckelordet Bevara, endast den sista dimensionen av arrayen kan ändras storlek.

Kommentera uppropet