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.