Denne tutorial forklarer VBA Array, forskellige array-typer, variant array og array-metoder ved hjælp af programmeringseksempler:
En almindelig VBA-variabel er en pladsholder, der gemmer værdien af en enkelt data. Den har et 1-til-1-forhold, dvs. 1 variabel for 1 værdi.
Forestil dig nu at gemme flere værdier af samme type. I stedet for at oprette flere variabler kan du blot oprette én variabel og gemme alle de samme typer af værdier. Denne variabel kaldes en ARRAY.
I denne tutorial får du at vide, hvad et VBA-array er, hvad et endimensionelt og todimensionelt array er, samt de forskellige typer af arrays som f.eks. faste og dynamiske arrays. Vi vil også forstå forskellige array-metoder, der bruges i VBA.
VBA-array
Arrays er en særlig type variabel, som kan gemme flere værdier af samme datatype.
For eksempel, Hvis du har navnene på 100 medarbejdere, kan du i stedet for at oprette 100 variabler af datatypen string oprette én arrayvariabel af typen string og tildele 100 værdier til den samme arrayvariabel.
En-dimensionale arrays
Et array, der har alle elementer i en enkelt række eller i en enkelt kolonne, kaldes et endimensionelt array. En liste med navnene på alle eleverne i klassen i en enkelt kolonne er et eksempel på et endimensionelt array. Det er deklareret som vist nedenfor.
Dim arrayname(lowerbound To UpperBound) As DataType
Der er flere måder at deklarere et array på. Nedenfor er et par eksempler.
Eksempel:
#1) Dim MyArrayExample(0 To 3) As Integer
Opretter et array med placering 0,1,2,3, der accepterer Integer-værdier.
#2) Dim MyArray2(3) As String
Standardværdierne er fra 0 til 3 og opretter et array med placering 0,1,2,3, der accepterer String-værdier.
#3) Dim MyArray2(13 til 15) As Double
Opretter et array startende fra 13, dvs. 13, 14 og 15, og accepterer Double-værdier. Vi har angivet den nedre grænse som 13, så arrayet vil begynde at allokere værdier fra placering 13 i stedet for 0.
Lad os lave en simpel kode og forstå alle de 3 måder at deklarere et array på.
Bemærk: Sådan skriver du VB-kode Åbn Microsoft Excel (understøttede versioner er Excel 2007, 2010, 2013, 2016, 2019). Naviger til Udviklerfanen -> Visual Basic (Alternativt kan du bruge genvejen Alt+F11). I VB-editoren skal du klikke på Indsæt -> Modul og indsæt nedenstående kode.
Se nedenstående procedure, der viser de forskellige typer af erklæringer.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String 'opretter array med indeks 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "Første kvartal i kalender " & " & " & firstQuarter(0) & " " & firstQuarter(1) & " " & " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String 'opretter array med indeks 0,1,2secondQuarter(0) = "April" secondQuarter(1) = "Maj" secondQuarter(2) = "Juni" MsgBox "Andet kvartal i kalender " & " " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String 'opretter array med indeks 13,14,15 thirdQuarter(13) = "July" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep"MsgBox "Tredje kvartal i kalender " & " " & tredje kvartal(13) & " " & tredje kvartal(14) & " " & " " & tredje kvartal(15) End Sub
Tryk på F5 eller tryk på knappen Kør på værktøjslinjen for at udføre koden.
Almindelig variabel Vs Array-variabel
Vi ved nu, hvordan et endimensionelt array fungerer, så lad os tage et øjeblik til at forstå, hvorfor arrays er så vigtige i programmeringssprog.
Antag, at du har brug for at indtaste lønnen for 5 medarbejdere. For at opnå dette ved hjælp af en almindelig variabel skal du oprette 5 variabler.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Deklarere variabel for hver elev Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Læs elevkarakterer fra celle Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" &5).Værdi Emp5 = shet.Range("A" & 6).Værdi ' Udskriv studenterkarakterer Debug.Print "Emp Navn" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Lad os nu opbygge den samme kode ved hjælp af en Array-variabel.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Her har vi blot brugt en array-variabel, som gemmer alle medarbejdernavne. Hvis du har brug for at tilføje 100 flere medarbejdernavne, skal du blot ændre array-størrelsen og behøver ikke oprette en ny variabel.
Dette vil reducere antallet af linjer i koden og dermed gøre den lettere at forstå og læse.
To-dimensionalt felt
Et 2-dimensionelt array har 2 indekser - det første indeks repræsenterer rækkerne og det andet indeks repræsenterer kolonnen. Det har flere rækker og kolonner og er normalt repræsenteret i tabelformat.
Deklarationen af et 2 dim array er som følger:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Tag et eksempel med opbevaring af 2 elevers karakterer i 3 fag. Vi opretter derfor et 2-dimensionelt array med 2 rækker og 3 kolonner.
Vi starter arrayet fra række 1 til række 2 og fra kolonne 1 til kolonne 3.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Total Marks in Row 2 and column 2 is " &totalMarks(2,2) Msgbox "Total Marks in Row 1 and column 3 is " &totalMarks(1,3) End Sub
Tryk på F5 eller tryk på knappen Kør på værktøjslinjen for at udføre koden.
Række 2 og kolonne 2
Række 1 og kolonne 3
Faste arrays
Faste arrays, også kaldet statiske arrays, har en fast nedre og øvre grænse, og denne størrelse kan ikke ændres på køretid. Arrayets størrelse angives i parentesen under deklarationen. Alle ovenstående eksempler er faste arrays, da vi har angivet størrelsen under deklarationen.
Faste arrays bruges normalt, når du er sikker på arrayets størrelse. For eksempel, antallet af dage i en uge, kan du oprette et array med en nedre grænse på 0 og en øvre grænse på 6 og være sikker på, at du aldrig vil ændre størrelsen på det.
Dynamiske arrays
Dynamiske arrays giver os mulighed for at ændre størrelsen på arrayet i løbet af køretiden. De er nyttige, når du ikke er sikker på arrayets størrelse. Antag, at du ikke er sikker på, hvor mange studerende der rent faktisk vil blive optaget på et college, så du kan ikke bestemme størrelsen på design- eller deklarationstidspunktet.
Deklarationen af et dynamisk array svarer til et statisk array med tomme parenteser.
Dim Employee() As String
REDIM
Når vi ønsker at ændre størrelsen, skal vi bruge REDIM skal vi være opmærksomme på, at den nedre grænse ikke kan ændres, vi kan kun ændre den øvre grænse for arrayet.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim vil hjælpe med at ændre arrayets størrelse under kørslen dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Nu ved vi, at vi kan ændre arrayets størrelse under kørslen, og derfor kan vi bruge ReDim-anvisningen, når vi har brug for at øge et array. Lad os prøve at øge arrayets størrelse endnu en gang og tilføje et nyt elevnavn.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", ", " & dynArray(2) ReDim dynArray(3) ' Redim vil reinitialisere arrayet og ødelægge de gamle værdierdynArray(3) = "John" MsgBox "Studerende indskrevet indtil " & curdate & " er " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " , " & dynArray(3) End Sub
Du ville have bemærket, at resultatet ikke viser navnene på de elever, der blev tilføjet før, men at det giver en nulværdi. Det skyldes, at Redim-anvisningen opretter et nyt array med en ny størrelse og ødelægger de gamle værdier.
ReDim Preserve
Represerve-anvisningen hjælper os med at overvinde begrænsningen ved ReDim ved at bevare de gamle værdier og dermed øge arrayets størrelse.
Lad os omskrive ovenstående kode ved hjælp af ReDim Preserve.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", ", " & dynArray(2) ReDim preserve dynArray(3) ' Redim preserve vil bevare de gamle værdierdynArray(3) = "John" MsgBox "Studerende indskrevet indtil " & curdate & " er " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " , " & dynArray(3) End Sub
Da vi har brugt nøgleordet preserve, går de tidligere indtastede værdier ikke tabt, og den nye værdi tilføjes med succes.
Variant Array
Indtil nu har vi set et array, der accepterer den samme type værdier. Lad os nu erklære arrayet som en variant og gemme de forskellige datatyper som String, Date, Long, Integer i et enkelt array.
Eksempel:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Detaljer om person " & arrayData(0) & " er " & " Telefon nr " & " Telefon nr " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
VBA Array-metoder
Der er flere metoder i VBA-arrays, som hjælper os med at udføre forskellige funktioner, som nævnt nedenfor.
Sl. nr. | Navn | Syntaks | Beskrivelse |
---|---|---|---|
1 | Array | Array(arglist) | Konverterer en almindelig variant variabel til en Array. |
2 | Slet | Slet arrayname | Bruges til at reinitialisere arrayet med fast størrelse og frigør hukommelsen til Dynamic array. |
3 | IsArray | IsArray (variablenavn) | Bestemmer, om en variabel er et array. |
4 | Lbound | LBound( ArrayName, [Dimension] ) | Returnerer den laveste subscript af et array. |
5 | Ubound | UBound( ArrayName, [Dimension] ) | Returnerer det højeste subscript af et array. |
6 | Split | Split(udtryk, [ delimiter, [ limit, [ limit, [ compare ]]]]) | Den opdeler en streng i flere understrenge og returnerer et nulbaseret array. |
7 | Tilmeld dig | Join(sourcearray, [ delimiter ]) | Samler flere understrenge i et array og returnerer en strengværdi. |
8 | Filter | Filter(sourcearray, match, [ include, [ compare ]]]) | Filter vil give os mulighed for at søge i en angivne match fra et array. |
Lad os gennemgå hver af dem i detaljer med et eksempel.
#1) Array
Lad os erklære en almindelig variantvariabel og bruge den som et array. Når du ønsker at ændre en almindelig variantvariabel til et array, skal vi bruge en ARRAY funktion som vist i nedenstående eksempel.
Array-funktioner accepterer et argument, der indeholder værdier adskilt ved kommaer. Disse værdier tildeles som et element i arrayet.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Oplysninger om person " & varData(0) & " er " & " & " Telefon nr " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Du skal identificere en arrayvariabel ved hjælp af et indeks, og derfor hentes værdierne i ovenstående eksempel som varData(0) varData(2) varData(3).
#2) Sletning
Denne funktion sletter alle de indtastede værdier for et array af fast størrelse og frigør plads i hukommelsen til et dynamisk array.
Syntaks: Slet arraynavn
Sletning har forskellig adfærd for forskellige datatyper som angivet nedenfor.
- For en fast numerisk: Alle værdier nulstilles til nul.
- For en fast strengdatatype: Alle værdier nulstilles til nul længde.
- For et dynamisk array: Frigør den hukommelse, der bruges af arrayet.
Eksempel:
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Værdier før sletning " & (NumArray(0)) & (NumArray(0)) & "," & (decArray(1)) & " , " , " & (strArray(1))) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Frigør hukommelsen ' Altværdierne slettes. MsgBox " Værdier efter sletning " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Resultat før brug af sletningsfunktionen
Resultat efter brug af Erase
#3) IsArray
Denne funktion bruges til at afgøre, om den angivne indgangsvariabel er et array eller ej. Den returnerer sandt, hvis den angivne variabel er sand, ellers returnerer den falsk.
Syntaks : IsArray (variablenavn)
Eksempel:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Er arr1 et Array : " & IsArray(arr1))) MsgBox ("Er arr2 et Array : " & IsArray(arr2)) End
Resultatet fra den første msgbox
Resultatet fra den anden msgbox
#4) Lbound
Den returnerer den laveste subscript i det array, der er angivet som argument for Lbound-funktionen.
Syntaks: LBound( ArrayName, [Dimension] )
ArrayName er navnet på arrayet.
Dimension er den valgfrie hele talværdi; hvis arrayet har flere dimensioner, kan du angive, hvilken dimension du vil bestemme Lbound til.
Eksempel:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Deklarere array-variabler. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Returnerer 1. Result2 = LBound(ArrayValue, 3) ' Returnerer 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Laveste subscript i første array " & Result1 & " laveste subscript i tredje array " & Result2 & " Lavestesubscript i Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Den returnerer den øverste subscript i det array, der er angivet som argument i Ubound-funktionen.
Syntaks: UBound( ArrayName, [Dimension] )
ArrayName er navnet på arrayet.
Dimension er den valgfrie hele talværdi, og hvis arrayet har flere dimensioner, kan du angive, hvilken dimension du ønsker at bestemme Ubound-værdien for.
Eksempel:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Deklarere array-variabler. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Laveste subscript i første array " & Result1 & " laveste subscript i 3. array " & Result2 & " Laveste subscript iArraywithoutlbound " & Result3 End Sub
#6) Split
Den returnerer et array med et antal understrenge, der er afledt af den givne hele streng.
Syntaks: Split(udtryk, [ delimiter, [ limit, [ limit, [ compare ]]])
- Udtryk: Dette er hele strengen, som vil blive brugt til at producere understrenge.
- Afgrænser: Ved hjælp af den angivne afgrænser genereres delstrenge. Hvis dette ikke er angivet, betragtes mellemrum som afgrænser.
- Grænse: Antal understrenge, der skal returneres.
- Sammenlign: Når delstrengen er produceret, kan du bruge forskellige sammenligningsmuligheder til at teste resultatet.
Eksempel: I nedenstående eksempel bruger vi delimiter som - og limit som 3.
Split-funktionen vil derfor opdele hele strengen i delstrenge baseret på afgrænseren. Men vi har også angivet grænsen som 3, så delstrenge vil ikke blive dannet efter grænsen 3. Den sidste afgrænser - vil således blive sprunget over.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "Dette er et eksempel på VBA-Split-funktionen" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Tilmeld dig
Dette er bare det omvendte af split, Join vil skabe en streng ved at kombinere flere understrenge.
Syntaks: Join(kildearray, [ afgrænser ])
Sourcearray: En-dimensionalt array af strenge, som du vil samle til én.
Afgrænser: Den angivne afgrænser tilføjes efter hver streng under sammenføjningen.
Eksempel:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Dato efter sammenføjning " & Result End Sub
Alle 3 værdier er sammenføjet, og \ er placeret mellem hvert ord, som vi har nævnt \ som afgrænsningsord.
#8) Filter
Filteret giver os mulighed for at søge efter et bestemt match fra et array. Baseret på filterkriterierne returneres delmængden af et string array.
Syntaks: Filter(sourcearray, match, [ include, [ compare ]]])
Eksempel:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Fandt " & UBound(Mystring) - LBound(Mystring) + 1 & " ord der matcher kriterierne " End Sub
Dette eksempel søger efter ordet "help" i alle array-strenge ved hjælp af filterfunktionen.
Ofte stillede spørgsmål
Spørgsmål #1) Hvordan får man længden af et array i VBA?
Svar: For at få længden af et array bruger vi funktionen Ubound. Denne funktion giver os en øvre subscript af et specificeret array.
Spørgsmål #2) Hvordan deklarerer man et array i VBA?
Svar: Et endimensionalt array er deklareret som vist nedenfor.
Dim arrayname(lowerbound To UpperBound) As DataType
Eksempel: Dim Myarray(0 To 2) As Integer
Et todimensionalt array er deklareret som vist nedenfor.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Eksempel: Dim marks(1 til 3, 0 til 2) Som heltal
Sp #3) Hvordan konverteres Range til Array?
Svar: Vi kan bruge funktionen Transpose til at konvertere intervallet til et array. Denne kode vil oprette Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
Spørgsmål #4) Hvad er en array-variant i VBA?
Svar: Et variant array accepterer alle slags datatyper som indeks, dvs. du kan gemme forskellige typer værdier i et enkelt array.
Eksempel:
Dim arrayData(3) As Variant
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Måderne til at ændre arrayets størrelse under kørslen og også bevare værdierne ved hjælp af redim preserve blev diskuteret med eksempler. Endelig lærte vi Array-metoder, som vil hjælpe os med at udføre flere operationer.