VBA - Deklarera (Dim), skapa och initiera matrisvariabel

Denna handledning visar hur man deklarerar (dim), skapar och initierar matrisvariabler i VBA

Vad är en VBA Array -variabel?

En VBA -arrayvariabel kan ses som en grupp variabler, lagrade under samma namn och med samma datatyp. En array kan lagra text, siffror eller objekt.

Du hänvisar till ett element i en array med dess indexnummer.

Du kan deklarera en matrisvariabel på samma sätt som du skulle deklarera någon annan variabel genom att använda nyckelordet Dim, Statisk, Offentlig eller Privat.

Statiska matriser

Det finns två typer av matriser - statisk och dynamisk. En statisk matris deklareras med den angivna storleken när du initialt deklarerar matrisen. Det kallas också en Fixed Array.

1 Dim intA (4) som heltal

Ovanstående array deklareras med hjälp av Dim -satsen på en procedur- eller modulnivå, och matrisens storlek är 5 eftersom vi inte har deklarerat LBound -värdet för arrayen.

Nej, det är inget stavfel! Arraystorleken är 5, trots att 4 har matats in i matrisen. Detta beror på att arrayindex automatiskt börjar på noll.

Arrayindex

Arrayindex börjar automatiskt på noll om inte Alternativbas 1 deklareras högst upp i din kodmodul.

Om Alternativbas 1 deklareras då startar matriser automatiskt vid 1.

Jag tycker dock att det är problematiskt att deklarera variabler på ett sådant sätt. Kodgranskare kanske inte är medvetna om att matriser börjar vid noll eller om Option Base 1 -deklarationen

Istället föredrar jag att uttryckligen deklarera start- och slutpositionerna för matriser:

1 Dim intA (2 till 5) som heltal

Lägg märke till att när du gör det kan du starta arrayen med valfritt antal (inte bara 1 eller 0).

Dynamiska matriser

En Dynamic Array -variabel är en array vars storlek kan ändras vid körning. Du deklarerar dynamiska variabler utan storlek.

1 Dim intA () som heltal

Du kan använda ReDim -satsen för att ange storleken på matrisen efter att matrisen har skapats.

1 ReDim intA (2)

Du kan ändra storlek på en dynamisk matris när som helst. Men när du använder ReDim -uttalandet raderas alla befintliga värden. För att bevara befintliga matrisvärden, använd ReDim Preserve istället.

1 ReDim Preserve intA (2)

Du kan deklarera en dynamisk array på en procedur-, modul- eller global nivå, men du kan bara använda ReDim -satsen inom en procedur.

Varianter

Variantarrayer är dynamiska matriser som är lättare att arbeta med.

1 Dim varNames ()

Lägg märke till att du inte behöver ange datatyp (det antas vara variant) eller matrisstorlek.

Som vi ser nedan kan du initiera variantarrayer med Array -funktionen (du behöver inte ändra storlek på matriser först)!

Deklarera modul och offentliga matriser

Som visas ovan kan matriser deklareras inom procedurer, för användning inom det förfarandet:

1234 Sub StaticArray ()'deklarera matrisen med ett LBound -värde på 1 och ett UBound -värde på 4Dim IntA (1 till 4) som heltalAvsluta Sub

Men de kan också deklareras på modul- eller global nivå.

1234567 Alternativ Explicit'deklarera matrisen med ett LBound -värde på 1 och ett UBound -värde på 4Dim IntA (1 till 4) som heltalSub StaticArray ()Avsluta Sub

I det här exemplet kan arrayvariabeln kallas var som helst inom denna kodmodul. Istället kan du deklarera en offentlig array som kan användas under hela ditt VBA -projekt (se nästa avsnitt).

Förklarar en offentlig matris

Du deklarerar en offentlig statisk matris som du skulle förklara en offentlig variabel.

1 Public strNames (3) som String

Denna deklaration måste överst i din modul, under Alternativ Explicit. Det kan sedan användas under hela ditt VBA -projekt i valfri modul eller procedur.

Om du deklarerar Array högst upp i modulen, men med Dim -nyckelordet, är användningen av den arrayen begränsad till den enskilda modulen. Att försöka använda matrisen i en separat modul skulle resultera i ett fel.

Initiera matriser

Du kan tilldela värden till en statisk array på följande sätt.

1234567891011 Sub StaticArray ()'deklarera matrisen med ett LBound -värde på 1 och ett UBound -värde på 4Dim IntA (1 till 4) som heltal'initiera matrisenIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'visa resultatet av position 2 i matrisen i det omedelbara fönstretDebug.Print IntA (2)Avsluta Sub

Om du kör ovanstående procedur visas värdet 20 i det omedelbara fönstret.

Du kan också tilldela värdena till en dynamisk matris på samma sätt

12345678910111213 Sub DynamicArray ()'deklarera en dynamisk array men utelämna de bundna värdenaDim IntA () som heltal'initiera matrisenReDim IntA (1 till 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'visa resultatet av position 2 i matrisen i det omedelbara fönstretDebug.PrintIntA (2)Avsluta Sub

Array -funktion

Dock, endast med variantmatrisen, kan du använda Array -funktionen som kan vara enklare än att använda standardmetoden.

12 'fyll i matrisenintA () = Array (10, 20, 30, 40)

Populate Array med Loop

Du kan också fylla i matriser genom att gå igenom en rad celler i Excel

1234567891011121314151617 Sub TestDynamicArrayFromExcel ()'förklarar matrisenDim strNames () Som sträng'deklarera ett heltal för att räkna raderna i ett intervallDim n Som heltal'deklarera ett heltal för slinganDim i As Integer'räkna raderna i intervalletn = Range ("A1", Range ("A1"). End (xlDown)). Rows.Count'redim arrayen till antalet rader i intervallet.ReDim strNames (n)För i = 0 Till nstrNames (i) = Range ("A1"). Offset (i + 1, 0)Nästa i'visa värdena i matrisenMsgBox Join (strNames ())Avsluta Sub

Återinitiera matriser

Du kan initiera din array igen när som helst i din kod, men du kommer då att förlora det ursprungliga värdet som finns i den positionen i din array.

1234567891011121314 Sub StaticArray ()'deklarera matrisen med ett LBound -värde på 1 och ett UBound -värde på 4Dim IntA (1 till 4) som heltal'initiera matrisenIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'visa resultatet av position 2 i matrisen i det omedelbara fönstretDebug.Print IntA (2)'initiera matrisen igenintA (2) = 200Debug.Print IntA (2)Avsluta Sub

I exemplet ovan behåller den statiska matrisen alla värden, förutom värdet i position 2 - det värdet ändras till 200.

Använda ReDim

Om du använder en dynamisk matris används ReDim -satsen för att ange storleken på din matris. Du kan använda ReDim -uttalandet senare i din kod för att ändra storleken på matrisen så många gånger du behöver. Kodraden nedan kommer att initiera om intA Array för att ha en storlek på 2 (Kom ihåg - ett Array -index börjar med 0!)

1 ReDim intA (1) som heltal

Så koden inklusive ReDim -uttalandet skulle se ut som exemplet nedan.

1234567891011121314151617 Sub TestDynamicArray ()'förklarar matrisenDim intA () som heltalReDim intA (2)'fyll i matrisen med siffrorintA (0) = 2intA (1) = 5intA (2) = 9'visa siffran i position 1Debug.Print intA (1)'redim arrayen för att ändra storlekenReDim intA (3)intA (0) = 6intA (1) = 8'visa numret i position 1 den här gångenDebug.Print intA (1)Avsluta Sub

Om du kör ovanstående procedur visas värdet 5 i det omedelbara fönstret och sedan visas värdet 8 när vi har ändrat storleken på arrayen med ReDim och återbefolkat den. Eftersom vi inte har fyllt i IntA (2) och vi inte använde Re-Dim Preserve kommer värdet i den positionen i gruppen att tas bort och både position 3 och 4 i matrisen kommer att vara noll.

Använda ReDim Preserve

Om vi ​​använder ReDim Preserve behålls de ursprungliga värdena i matrisen.

1234567891011121314151617 Sub TestDynamicArray ()'deklarera matrisenDim intA () som heltalReDim intA (2)'fyll i matrisen med siffrorintA (0) = 2intA (1) = 5intA (2) = 9'visa siffran i position 2Debug.Print intA (2)'redim arrayenReDim intA (3)intA (0) = 6intA (1) = 8'visa numret i position 2 igenDebug.Print intA (2)Avsluta Sub

I båda meddelanderutor som visas ovan kommer siffran 9 att visas när ReDim Preserve -satsen höll det värdet i den positionen.

Du kommer att bidra till utvecklingen av webbplatsen, dela sidan med dina vänner

wave wave wave wave wave