- VBA Array Quick Sheet
- VBA Array Hurtige eksempler
- Array fordele? - Hastighed!
- Opret / erklær et array (dim)
- Angiv matrixværdier
- Tildel rækkevidde til array
- 2D / flerdimensionale arrays
- Eksempler på flere dimensioner
- Array længde / størrelse
- Loop Through Array
- Andre opgaver
- Brug af arrays i Access VBA
I VBA, en Array er en enkelt variabel, der kan indeholde flere værdier. Tænk på en matrix som en række celler: hver celle kan gemme en værdi. Arrays kan være endimensionale (tænk på en enkelt kolonne), todimensionel (tænk på flere rækker og kolonner) eller multidimensionale. Arrayværdier kan tilgås af deres position (indeksnummer) i arrayet.
VBA Array Quick Sheet
Arrays
BeskrivelseVBA -kodeskabDim arr (1 til 3) Som variantarr (1) = "en"
arr (2) = “to”
arr (3) = “tre”Opret fra ExcelDim arr (1 til 3) Som variant
Dim cell As Range, i As Integer
i = LBound (arr)
For hver celle i området ("A1: A3")
i = i + 1
arr (i) = celle.værdi
Næste celleLæs alle varerDim i som lang
For i = LBound (arr) Til UBound (arr)
MsgBox arr (i)
Næste iSletteSlet arrArray til strengDim sName som streng
sName = Deltag (arr, “:”)Forøg størrelseReDim Bevar arr (0 til 100)Indstil værdiarr (1) = 22
VBA Array Hurtige eksempler
Lad os se på et komplet eksempel, før vi dykker ned i specifikationer:
12345678910 | Sub ArrayExample ()Dim strNames (1 til 4) som strengstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"msgbox strNames (3)Afslut Sub |
Her har vi oprettet det endimensionale strengarray: strNames med størrelse fire (kan indeholde fire værdier) og tildelt de fire værdier. Sidst viser vi den tredje værdi i en meddelelsesboks.
I dette tilfælde er fordelen ved at bruge et array lille: kun en variabel erklæring kræves i stedet for fire.
Lad os dog se på et eksempel, der viser den sande kraft i et array:
12345678 | Sub ArrayExample2 ()Dim strNames (1 til 60000) som strengDim i så længeFor i = 1 Til 60000strNames (i) = Celler (i, 1) .VærdiNæste iAfslut Sub |
Her har vi oprettet et array, der kan indeholde 60.000 værdier, og vi har hurtigt udfyldt arrayet fra kolonne A i et regneark.
Array fordele? - Hastighed!
Du tænker måske på arrays, der ligner Excel -regneark:
- Hver celle (eller element i en matrix) kan indeholde sin egen værdi
- Hver celle (eller element i en matrix) kan tilgås ved række og kolonne.
- Arbejdsark Eks. celler (1,4) .value = “Række 1, kolonne 4”
- Array Ex. arrVar (1,4) = “Række 1, kolonne 4”
Så hvorfor gider Arrays? Hvorfor ikke bare læse og skrive værdier direkte til celler i Excel? Et ord: Hastighed!
At læse / skrive til Excel -celler er en langsom proces. Arbejde med arrays er meget hurtigere!
Opret / erklær et array (dim)
Bemærk: Arrays kan have flere "dimensioner". For at holde tingene enkle, starter vi med kun at arbejde med endimensionelle arrays. Senere i selvstudiet introducerer vi dig til flere dimensioner arrays.
Statisk matrix
Statiske arrays er arrays, der ikke kan ændre størrelse. Omvendt Dynamiske arrays kan ændre størrelse. De erklæres lidt anderledes. Lad os først se på statiske arrays.
Bemærk: Hvis dit array ikke ændres i størrelse, skal du bruge et statisk array.
Deklaration af en statisk array -variabel ligner meget på at erklære en regulær variabel, bortset fra at du skal definere matrixens størrelse. Der er flere forskellige måder at indstille størrelsen på en matrix på.
Du kan eksplicit erklære start- og slutpositionerne for et array:
123456789101112 | Sub StaticArray1 ()'Opretter array med positioner 1,2,3,4Dim arrDemo1 (1 til 4) som streng'Opretter array med positioner 4,5,6,7Dim arrDemo2 (4 til 7) så længe'Opretter array med positioner 0,1,2,3Dim arrDemo3 (0 til 3) så længeAfslut Sub |
Eller du kan kun indtaste matrixstørrelsen:
123456 | Sub StaticArray2 ()'Opretter array med positioner 0,1,2,3Dim arrDemo1 (3) Som strengAfslut Sub |
Vigtig! Bemærk, at som standard starter arrays på position 0. Så Dim arrDemo1 (3) opretter en matrix med positioner 0,1,2,3.
Du kan erklære Option Base 1 øverst på dit modul, så arrayet starter i position 1 i stedet:
12345678 | Option Base 1Sub StaticArray3 ()'Opretter array med positioner 1,2,3Dim arrDemo1 (3) Som strengAfslut Sub |
Jeg synes dog, at det er meget lettere (og mindre forvirrende) bare eksplicit at erklære start- og slutpositioner for arrays.
Træt af at søge efter eksempler på VBA -kode? Prøv AutoMacro!
Dynamisk matrix
Dynamiske arrays er arrays, hvis størrelse kan ændres (eller hvis størrelse ikke skal defineres).
Der er to måder at erklære et dynamisk array.
Variant arrays
Den første måde at erklære et dynamisk array er ved at indstille arrayet til at skrive Variant.
1 | Dim arrVar () Som variant |
Med en Variant Array, du behøver ikke at definere matrixstørrelsen. Størrelsen justeres automatisk. Husk bare, at Array starter med position 0 (medmindre du tilføjer Option Base 1 til toppen af dit modul)
12345678910111213 | Sub VariantArray ()Dim arrVar () Som variant'Definer værdier (størrelse = 0,1,2,3)arrVar = Array (1, 2, 3, 4)'Ændre værdier (størrelse = 0,1,2,3,4)arrVar = Array ("1a", "2a", "3a", "4a", "5a")'Outputposition 4 ("5a")MsgBox arrVar (4)Afslut Sub |
Ikke-variant dynamiske arrays
Med ikke-variantarrays skal du definere matrixstørrelsen, før du tildeler værdier til arrayet. Processen til at oprette arrayet er dog en smule anderledes:
1234567 | Sub DynamicArray1 ()Dim arrDemo1 () Som streng'Ændrer størrelsen på array med positioner 1,2,3,4ReDim arrDemo1 (1 til 4)Afslut Sub |
Først erklærer du arrayet, der ligner det statiske array, medmindre du udelader arraystørrelsen:
1 | Dim arrDemo1 () Som streng |
Når du nu vil angive matrixstørrelsen, bruger du ReDim kommando for at størrelse arrayet:
12 | 'Ændrer størrelsen på array med positioner 1,2,3,4ReDim arrDemo1 (1 til 4) |
ReDim ændrer størrelsen på matrixen. Læs nedenfor for forskellen mellem ReDim og ReDim Preserve.
ReDim vs. ReDim Preserve
Når du bruger ReDim kommando, du rydder alle eksisterende værdier fra arrayet. I stedet kan du bruge ReDim Preserve for at bevare arrayværdier:
12 | 'Ændrer størrelsen på array med positioner 1,2,3,4 (Bevar eksisterende værdier)ReDim Bevar arrDemo1 (1 til 4) |
Deklarere arrays forenklet
Du føler dig måske overvældet efter at have læst alt ovenfor. For at holde tingene enkle vil vi for det meste arbejde med statiske arrays i resten af artiklen.
Angiv matrixværdier
Det er meget let at indstille arrayværdier.
Med et statisk array skal du definere hver position i arrayet, en ad gangen:
12345678 | Sub ArrayExample ()Dim strNames (1 til 4) som strengstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Afslut Sub |
Med en Variant Array kan du definere hele arrayet med en linje (kun praktisk til små arrays):
123456 | Sub ArrayExample_1Line ()Dim strNames () Som variantstrNames = Array ("Shelly", "Steve", "Neema", "Jose")Afslut Sub |
Hvis du forsøger at definere en værdi for en matrixplacering, der ikke findes, modtager du en fejl i abonnement uden for område:
1 | strNames (5) = "Shannon" |
I afsnittet 'Tildel område til matrix' nedenfor viser vi dig, hvordan du bruger en loop til hurtigt at tildele store værdier til arrays.
Få Array -værdi
Du kan hente matrixværdier på samme måde. I eksemplet herunder skriver vi matrixværdier til celler:
1234 | Område ("A1"). Værdi = strNames (1)Område ("A2"). Værdi = strNames (2)Område ("A3"). Værdi = strNames (3)Område ("A4"). Værdi = strNames (4) |
VBA -programmering | Kodegenerator virker for dig!
Tildel rækkevidde til array
For at tildele et område til et array kan du bruge en loop:
12345678 | Sub RangeToArray ()Dim strNames (1 til 60000) som strengDim i så længeFor i = 1 Til 60000strNames (i) = Celler (i, 1) .VærdiNæste iAfslut Sub |
Dette vil gå gennem cellerne A1: A60000 og tildele celleværdierne til arrayet.
Output Array til område
Eller du kan bruge en loop til at tildele en array til et område:
123 | For i = 1 Til 60000Celler (i, 1) .Værdi = strNames (i)Næste i |
Dette vil gøre det modsatte: tildel array -værdier til celler A1: A60000
2D / flerdimensionale arrays
Indtil videre har vi udelukkende arbejdet med endimensionale (1D) arrays. Arrays kan dog have op til 32 dimensioner.
Tænk på et 1D -array som en enkelt række eller kolonne med Excel -celler, et 2D -array som et helt Excel -regneark med flere rækker og kolonner, og et 3D -array er som en hel projektmappe, der indeholder flere ark, der hver indeholder flere rækker og kolonner (Du kunne også tænke på et 3D -array som en Rubiks kube).
Eksempler på flere dimensioner
Lad os nu demonstrere eksempler på arbejde med arrays af forskellige dimensioner.
VBA -programmering | Kodegenerator virker for dig!
1D Array Eksempel
Denne procedure kombinerer de tidligere matrixeksempler til en procedure, der viser, hvordan du kan bruge arrays i praksis.
1234567891011121314 | Sub ArrayEx_1d ()Dim strNames (1 til 60000) som strengDim i så længe'Tildel værdier til arrayFor i = 1 Til 60000strNames (i) = Celler (i, 1) .VærdiNæste i'Output -arrayværdier til områdeFor i = 1 Til 60000Ark ("Output"). Celler (i, 1) .Værdi = strNames (i)Næste iAfslut Sub |
2D Array Eksempel
Denne procedure indeholder et eksempel på et 2D -array:
123456789101112131415161718 | Sub ArrayEx_2d ()Dim strNavne (1 til 60000, 1 til 10) som strengDim i As Long, j As Long'Tildel værdier til arrayFor i = 1 Til 60000For j = 1 til 10strNames (i, j) = Celler (i, j) .VærdiNæste jNæste i'Output -arrayværdier til områdeFor i = 1 Til 60000For j = 1 til 10Ark ("Output"). Celler (i, j) .Værdi = strNames (i, j)Næste jNæste iAfslut Sub |
Eksempel på 3D -array
Denne procedure indeholder et eksempel på et 3D -array til arbejde med flere ark:
12345678910111213141516171819202122 | Sub ArrayEx_3d ()Dim strNavne (1 til 60000, 1 til 10, 1 til 3) som strengDim i så længe, j så længe, k så længe'Tildel værdier til arrayFor k = 1 til 3For i = 1 Til 60000For j = 1 til 10strNames (i, j, k) = Sheets ("Sheet" & k). Celler (i, j) .VærdiNæste jNæste iNæste k'Output -arrayværdier til områdeFor k = 1 til 3For i = 1 Til 60000For j = 1 til 10Ark ("Output" & k). Celler (i, j) .Værdi = strNames (i, j, k)Næste jNæste iNæste kAfslut Sub |
Array længde / størrelse
Indtil videre har vi introduceret dig til de forskellige typer arrays og lært dig, hvordan du deklarerer arrays og får/indstiller array -værdier. Dernæst vil vi fokusere på andre nødvendige emner til arbejde med arrays.
VBA -programmering | Kodegenerator virker for dig!
UBound og LBound funktioner
Det første trin for at få længden / størrelsen på en matrix er at bruge funktionerne UBound og LBound til at få matrixens øvre og nedre grænser:
123456 | Sub UBoundLBound ()Dim strNavne (1 til 4) som strengMsgBox UBound (strNames)MsgBox LBound (strNames)Afslut Sub |
Ved at trække de to (og tilføje 1) får du længden:
1 | GetArrLength = UBound (strNames) - LBound (strNames) + 1 |
Array længde funktion
Her er en funktion til at få en enkeltdimensions array længde:
1234567 | Offentlig funktion GetArrLength (a som variant) så længeHvis er tom (a) SåGetArrLength = 0AndetGetArrLength = UBound (a) - LBound (a) + 1Afslut HvisAfslut funktion |
Skal du beregne størrelsen på et 2D -array? Tjek vores selvstudium: Beregn matrixstørrelse.
Loop Through Array
Der er to måder at sløjfe igennem et array. De første sløjfer gennem heltalene, der svarer til matrixens talpositioner. Hvis du kender matrixstørrelsen, kan du angive den direkte:
12345678910111213 | Sub ArrayExample_Loop1 ()Dim strNavne (1 til 4) som strengDim i så længestrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"For i = 1 til 4MsgBox strNames (i)Næste iAfslut Sub |
Men hvis du ikke kender matrixstørrelsen (hvis arrayet er dynamisk), kan du bruge LBound- og UBound -funktionerne fra det forrige afsnit:
12345678910111213 | Sub ArrayExample_Loop2 ()Dim strNavne (1 til 4) som strengDim i så længestrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"For i = LBound (strNames) Til UBound (strNames)MsgBox strNames (i)Næste iAfslut Sub |
For hver Array Loop
Den anden metode er med en For Every Loop. Dette går gennem hvert element i arrayet:
12345678910111213 | Sub ArrayExample_Loop3 ()Dim strNavne (1 til 4) som strengDim objektstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"For hvert element i strNamesMsgBox VareNæste elementAfslut Sub |
For hver matrix-loop fungerer sammen med multidimensionale arrays ud over endimensionale arrays.
VBA -programmering | Kodegenerator virker for dig!
Loop Through 2D Array
Du kan også bruge UBound- og LBound-funktionerne til også at gå gennem et multidimensionalt array. I dette eksempel går vi gennem et 2D -array. Bemærk, at UBound- og LBound -funktionerne giver dig mulighed for at angive, hvilken dimension af arrayet der skal findes de øvre og nedre grænser (1 for første dimension, 2 for anden dimension).
1234567891011121314151617181920 | Sub ArrayExample_Loop4 ()Dim strNavne (1 til 4, 1 til 2) som strengDim i As Long, j As LongstrNames (1, 1) = "Shelly"strNames (2, 1) = "Steve"strNames (3, 1) = "Neema"strNames (4, 1) = "Jose"strNames (1, 2) = "Shelby"strNames (2, 2) = "Steven"strNames (3, 2) = "Nemo"strNames (4, 2) = "Jesse"For j = LBound (strNames, 2) Til UBound (strNames, 2)For i = LBound (strNames, 1) Til UBound (strNames, 1)MsgBox strNames (i, j)Næste iNæste jAfslut Sub |
Andre opgaver
Klar matrix
For at rydde en hel matrix skal du bruge sletningserklæringen:
1 | Slet strNames |
Eksempel på brug:
12345678910 | Sub ArrayExample ()Dim strNames (1 til 4) som strengstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Slet strNamesAfslut Sub |
Alternativt kan du også ReDim arrayet for at ændre størrelsen på det, og ryd en del af arrayet:
1 | ReDim strNames (1 til 2) |
Dette ændrer størrelsen på arrayet til størrelse 2, og sletter position 3 og 4.
Count Array
Du kan tælle antallet af positioner i hver dimension af en matrix ved hjælp af UBound- og LBound -funktionerne (diskuteret ovenfor).
Du kan også tælle antallet af indtastede elementer (eller elementer, der opfylder visse kriterier) ved at gå gennem arrayet.
Dette eksempel går gennem en række objekter og tæller antallet af ikke-tomme strenge, der findes i arrayet:
123456789101112131415 | Sub ArrayLoopandCount ()Dim strNavne (1 til 4) som strengDim i As Long, n As LongstrNames (1) = "Shelly"strNames (2) = "Steve"For i = LBound (strNames) Til UBound (strNames)Hvis strNames (i) "" Sån = n + 1Afslut HvisNæste iMsgBox n & "ikke-tomme værdier fundet."Afslut Sub |
VBA -programmering | Kodegenerator virker for dig!
Fjern dubletter
På et tidspunkt vil du måske fjerne dubletter fra et array. Desværre har VBA ikke en indbygget funktion til at gøre dette. Vi har dog skrevet en funktion til at fjerne dubletter fra et array (det er for lang tid at inkludere i denne vejledning, men besøg linket for at lære mere).
Filter
VBA -filterfunktionen giver dig mulighed for at filtrere et array. Det gør det ved at oprette et nyt array med kun de filtrerede værdier. Nedenfor er et hurtigt eksempel, men sørg for at læse artiklen for flere eksempler til forskellige behov.
1234567891011121314 | Sub Filter_Match ()'Definer ArrayDim strNames som variantstrNames = Array ("Steve Smith", "Shannon Smith", "Ryan Johnson")'Filter ArrayDim strSubNames som variantstrSubNames = Filter (strNames, "Smith")'Tæl filtreret matrixMsgBox "Fundet" og UBound (strSubNames) - LBound (strSubNames) + 1 & "navne."Afslut Sub |
IsArray -funktion
Du kan teste, om en variabel er en matrix ved hjælp af IsArray -funktionen:
123456789101112 | Sub IsArrayEx ()'Opretter array med positioner 1,2,3Dim arrDemo1 (3) Som streng'Opretter regelmæssig strengvariabelDim str Som strengMsgBox IsArray (arrDemo1)MsgBox IsArray (str)Afslut Sub |
Deltag i Array
Du kan hurtigt “slutte sig til” et helt array sammen med Join -funktionen:
123456789101112 | Sub Array_Join ()Dim strNavne (1 til 4) som strengDim joinNames som strengstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"joinNames = Deltag i (strNames, ",")MsgBox joinNamesAfslut Sub |
VBA -programmering | Kodegenerator virker for dig!
Opdel streng i array
VBA -splitfunktionen vil opdele en tekststreng i et array, der indeholder værdier fra den originale streng. Lad os se på et eksempel:
123456789 | Sub Array_Split ()Dim navne () som strengDim sluttede sig til Navne som strengjoinedNames = "Shelly, Steve, Nema, Jose"Names = Split (joinedNames, ",")MsgBox navne (1)Afslut Sub |
Her opdeler vi denne tekststreng “Shelly, Steve, Nema, Jose” i en matrix (størrelse 4) ved hjælp af en kommaafgrænser (, ”).
Const Array
Et array kan ikke erklæres som en konstant i VBA. Du kan dog omgå dette ved at oprette en funktion, der skal bruges som et array:
123456789 | 'Definer ConstantArrayFunktion ConstantArray ()ConstantArray = Array (4, 12, 21, 100, 5)Afslut funktion'Retrive ConstantArray -værdiSub RetrieveValues ()MsgBox ConstantArray (3)Afslut Sub |
Copy Array
Der er ingen indbygget måde at kopiere et array ved hjælp af VBA. I stedet skal du bruge en loop til at tildele værdierne fra et array til et andet.
12345678910111213141516171819 | Sub CopyArray ()Dim Arr1 (1 til 100) så længeDim Arr2 (1 til 100) så længeDim i så længe'Opret array1For i = 1 til 100Arr1 (i) = iNæste i'CopyArray1 til Array2For i = 1 til 100Arr2 (i) = Arr1 (i)Næste iMsgBox Arr2 (74)Afslut Sub |
Transponere
Der er ingen indbygget VBA-funktion, der giver dig mulighed for at transponere et array. Vi har dog skrevet en funktion til Transpose a 2D Array. Læs artiklen for at lære mere.
VBA -programmering | Kodegenerator virker for dig!
Funktion Return Array
Et almindeligt spørgsmål, VBA -udviklere har, er, hvordan man opretter en funktion, der returnerer en matrix. Jeg tror, at de fleste vanskeligheder er løst ved at bruge Variant Arrays. Vi har skrevet en artikel om emnet: VBA Function Return Array.
Brug af arrays i Access VBA
De fleste af Array -eksemplerne ovenfor fungerer nøjagtig det samme i Access VBA, som de gør i Excel VBA. Den ene store forskel er, at når du ønsker at udfylde en matrix ved hjælp af Access -data, skal du gå gennem RecordSet -objektet frem for Range -objektet.
1234567891011121314151617181920212223 | UnderområdeToArrayAccess ()Ved fejl Genoptag næsteDim strNames () Som strengDim i så længeDim iCount så længeDim dbs som databaseDim første som rekordsætIndstil dbs = CurrentDbIndstil rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Med første.Flyt sidste.MoveFirstiCount = .RecordCountReDim strNames (1 til iCount)For i = 1 Til iCountstrNames (i) = rst.Fields ("ClientName").MoveNextNæste iAfslut medførst. lukIndstil rst = IntetIndstil dbs = IntetAfslut Sub |
Array Tutorials | |
---|---|
Array Mega-Guide | Ja |
Få matrixstørrelse | |
Klar matrix | |
Filter Array | |
Transpose Array | |
Funktion Return Array | |
Fjern dubletter | |