Hierdie tutoriaal sal VBA-skikking, verskeie skikkingtipes, variantskikking en skikkingmetodes verduidelik met behulp van programmeringsvoorbeelde:
'n Gereelde VBA-veranderlike is 'n plekhouer wat die waarde van 'n enkele data. Dit het 'n 1 tot 1-verwantskap, dit wil sê 1 veranderlike vir 1 waarde.
Stel jou nou voor dat jy veelvuldige waardes stoor wat van dieselfde tipe is. In plaas daarvan om veelvuldige veranderlikes te skep, kan jy net een veranderlike skep en al dieselfde tipe waardes stoor. Hierdie veranderlike word 'n ARRAY genoem.
In hierdie tutoriaal, jy sal leer weet wat 'n VBA-skikking, eendimensionele en tweedimensionele skikkings is saam met die verskillende tipes skikkings soos Fixed en Dynamic. Ons sal ook verskeie skikkingsmetodes verstaan wat in VBA gebruik word.
VBA Skikking
Skikkings is 'n spesiale soort veranderlike wat veelvuldige waardes van dieselfde datatipe kan stoor .
Byvoorbeeld, as jy die name van 100 werknemers het, dan kan jy in plaas daarvan om 100 veranderlikes van datatipe string te skep, net een skikking veranderlike van tipe string skep en 100 waardes toewys na dieselfde skikkingsveranderlike.
Eendimensionele skikking
'n Skikking wat al die elemente in 'n enkele ry of in 'n enkele kolom het, word 'n Eendimensionele skikking genoem. Om die name van al die studente in die klas in 'n enkele kolom te lys, is 'n voorbeeld van 'n eendimensionele skikking. Dit word verklaar soos aangeduiskikking word verklaar soos hieronder getoon.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Voorbeeld: Dim punte(1 tot 3) , 0 Tot 2) As Heelgetal
V #3) Hoe om Reeks na Skikking om te skakel?
Antwoord: Ons kan die Transponeerfunksie gebruik om die reeks om te skakel na 'n skikking. Hierdie kode sal Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
V #4) Wat is 'n skikkingsvariant in VBA?
Antwoord: 'n Variante skikking sal alle soorte datatipes vir sy indeks aanvaar, dit wil sê jy kan verskillende tipes waardes in 'n enkele skikking stoor.
Voorbeeld:
Dim arrayData(3) As Variant
arrayData(0) = “Vikas Vipal”
arrayData(1) = 411234567890#
Die maniere om die grootte van die skikking te verander tydens runtime en ook die bewaar van die waardes met behulp van redim preserve is met voorbeelde bespreek. Laastens het ons Array-metodes geleer wat ons sal help om verskeie bewerkings uit te voer.
hieronder.Dim arrayname(lowerbound to UpperBound) As DataType
Daar is verskeie maniere om 'n skikking te verklaar. Hieronder is 'n paar voorbeelde.
Voorbeeld:
#1) Dim MyArrayExample(0 To 3) As Heelgetal
Skep 'n skikking met ligging 0,1,2,3 wat heelgetalwaardes sal aanvaar.
#2) Dim MyArray2(3) As String
Verstek vanaf 0 tot 3 en skep 'n skikking met ligging 0,1,2,3 wat Stringwaardes sal aanvaar.
#3) Dim MyArray2(13 tot 15) As Double
Skep 'n skikking vanaf 13 d.w.s. 13, 14 en 15, en aanvaar Dubbelwaardes. Ons het die ondergrens as 13 genoem, dus sal die skikking waardes begin toeken vanaf ligging 13 eerder as 0.
Kom ons skep 'n eenvoudige kode en verstaan al die 3 maniere van skikkingverklaring.
Let wel: Om VB-kode te skryf, maak Microsoft Excel oop (ondersteunde weergawes is Excel 2007, 2010, 2013, 2016, 2019). Gaan na Ontwikkelaaroortjie -> Visual Basic (Alternatiewelik gebruik kortpad Alt+F11). Klik in die VB-redigeerder op Voeg in -> Module en plak die onderstaande kode.
Oorweeg die onderstaande prosedure wat die verskillende tipes verklarings wys.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String ‘creates array with index 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "First Quarter in calendar " & " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String ‘creates array with index 0,1,2 secondQuarter(0) = "April" secondQuarter(1) = "May" secondQuarter(2) = "June" MsgBox "Second Quarter in calendar " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String ‘creates array with index 13,14,15 thirdQuarter(13) = "July" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep" MsgBox "Third Quarter in calendar " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " " & thirdQuarter(15) End Sub
Tik F5 of druk die hardloopknoppie op die nutsbalk om die kode uit te voer.
Regular Variable vs Array Variable
Ons weet nou hoe 'n eendimensionele skikking werk. Laat ons dus 'n oomblik neem om te verstaan waarom skikkings so belangrik is inprogrammeertale.
Veronderstel dat jy die salaris van 5 werknemers moet invoer. Om dit te bereik deur 'n gewone veranderlike te gebruik, moet jy 5 veranderlikes skep.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Declare variable for each student Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Read student marks from cell Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" & 5).Value Emp5 = shet.Range("A" & 6).Value ' Print student marks Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Kom ons bou nou dieselfde kode deur 'n Array-veranderlike te gebruik.
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
Hier, ons het pas een skikkingsveranderlike gebruik wat al die werknemersname sal stoor. Gestel jy moet nog 100 werknemersname byvoeg, dan hoef jy net die skikkinggrootte te verander en hoef nie 'n nuwe veranderlike te skep nie.
Dit sal die aantal reëls in die kode verminder en dit daardeur maklik maak verstaanbaar en leesbaar.
Tweedimensionele Skikking
'n 2-dimensionele skikking het 2 indekse – die eerste indeks sal die rye verteenwoordig en die 2de indeks sal die kolom verteenwoordig. Dit het veelvuldige rye en kolomme en word gewoonlik in 'n tabelformaat voorgestel.
Verklaring van 'n 2-dim-skikking is soos volg:
Dim ArrayName(FirstIndex) To LastIndex, FirstIndex To LastIndex) As DataType.
Beskou 'n voorbeeld van die stoor van punte van 2 studente wat in 3 vakke behaal is. Ons sal dus 'n 2-dimensionele skikking skep wat 2 rye en 3 kolomme neem.
Ons sal die skikking van ry 1 tot ry 2 en kolom 1 na kolom 3 begin.
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(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
Tik F5 of Druk die hardloop-knoppie op die nutsbalk om die kode uit te voer.
Ry 2 en Kolom 2
Ry 1 en Kolom 3
Vaste skikkings
Vaste skikkings ook genoem statiesSkikkings het 'n vaste ondergrens en boonste grens en hierdie grootte kan nie tydens looptyd verander word nie. Die grootte van die skikking word tydens die verklaring binne die hakies gespesifiseer. Al die bogenoemde voorbeelde is Vaste skikkings aangesien ons die grootte daarvan tydens die verklaring genoem het.
Vaste skikkings word gewoonlik gebruik wanneer jy seker is oor die grootte van die skikking. Byvoorbeeld, die aantal dae in 'n week, jy kan 'n skikking met ondergrens 0 en boonste grens 6 skep en seker wees dat jy nooit die grootte daarvan sal verander nie.
Dinamiese skikkings
Dynamiese skikkings stel ons in staat om die grootte van die skikking gedurende die looptyd te verander. Dit is nuttig wanneer jy nie seker is oor die grootte van die skikking nie. Gestel in kollege-toelating is jy dalk nie seker van hoeveel studente werklik die toelating sal kry nie, so jy kan nie die grootte by die ontwerp- of verklaringstyd bepaal nie.
Verklaring van 'n dinamiese skikking is soortgelyk aan 'n Static skikking met leë hakies.
Dim Employee() As String
REDIM
Wanneer ons die grootte wil verander, moet ons gebruik REDIM , ons moet daarop let dat die onderste grens nie verander kan word nie, ons kan net die boonste grens van die skikking verander.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ‘ Redim will help to change the array size during runtime dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are “ & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Nou, ons weet ons kan verander die grootte van die skikking tydens looptyd, daarom kan ons die ReDim-stelling gebruik wanneer ons die ubound van 'n skikking moet verhoog. Kom ons probeer om die skikking nog een keer te vergroot en 'n nuwe by te voegstudent se naam.
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 will reinitialise the array and destroy the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Jy sou opgemerk het dat die resultaat nie die name van die studente wat voorheen bygevoeg is, vertoon het nie, dit gee 'n nulwaarde. Dit is omdat die Redim-stelling 'n nuwe skikking met 'n nuwe grootte sal skep en die ou waardes sal vernietig.
ReDim Preserve
Represerve-stelling help ons om die beperking van ReDim te oorkom deur die ou waardes te bewaar en daardeur die grootte van die skikking te vergroot.
Kom ons herskryf die bogenoemde kode deur ReDim Preserve te gebruik.
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 will retain the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Soos ons gebruik het die bewaar sleutelwoord, die voorheen ingevoerde waardes gaan nie verlore nie en die nuwe waarde word suksesvol bygevoeg.
Variant Array
Tot nou toe het ons 'n skikking gesien wat dieselfde tipe waardes aanvaar. Kom ons verklaar nou die skikking as 'n variant en stoor die verskillende tipes data soos String, Date, Long, Heelgetal in 'n enkele skikking.
Voorbeeld:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Details of person " & arrayData(0) & " is " & " Phone No " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
VBA-skikkingsmetodes
Daar is verskeie metodes in VBA-skikkings wat ons sal help om verskillende funksies uit te voer, soos hieronder genoem.
Sl. No | Naam | Sintaksis | Beskrywing |
---|---|---|---|
1 | Skikking | Array(arglist) | Skakel 'n gereelde variant om veranderlike in 'n skikking. |
2 | Vee uit | Vee skikkingsnaam uit | Gebruik om die vaste grootte skikking te herïntialiseer en maak die geheue vry vir Dynamicskikking. |
3 | IsArray | IsArray (veranderlikenaam) | Bepaal of 'n veranderlike is 'n skikking. |
4 | Lbound | LBound( ArrayName, [Dimensie] ) | Gee die laagste subskripsie van 'n skikking. |
5 | Ubound | UBound( ArrayName , [Dimensie] ) | Gee die hoogste subskripsie van 'n skikking. |
6 | Verdeel | Verdeel(uitdrukking, [ skeier, [ limiet, [ vergelyk ]]]) | Dit verdeel 'n string in veelvuldige substringe en gee 'n nulgebaseerde skikking terug. |
7 | Sluit aan | Sluit aan (bronskikking, [ skeier ]) | Sluit aan verskeie substringe in 'n skikking en gee 'n stringwaarde terug . |
8 | Filter | Filter(bronskikking, pas, [ sluit in, [ vergelyk ]]) | Filter sal ons in staat stel om 'n gespesifiseerde pasmaat van 'n skikking te soek. |
Kom ons bespreek elkeen van hulle in detail met 'n voorbeeld.
#1) Skikking
Kom ons verklaar 'n gereelde variant veranderlike en gebruik dit as 'n skikking. Wanneer jy 'n gereelde variant veranderlike in 'n skikking wil verander, moet ons 'n ARRAY -funksie gebruik soos in die onderstaande voorbeeld getoon.
Skikkingfunksies aanvaar 'n argument wat komma-geskeide waardes bevat . Hierdie waardes word as 'n element van die skikking toegeken.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Details of person " & varData(0) & " is " & " Phone No " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Jy moet 'n skikkingsveranderlike identifiseer deur 'n indeks te gebruik,in die voorbeeld hierbo word die waardes dus herwin as varData(0) varData(2) varData(3).
#2) Vee
Hierdie funksie uitvee al die waardes wat ingevoer is vir 'n vaste grootte skikking en sal die geheuespasie vir 'n dinamiese skikking vrystel.
Sintaksis: Vee skikkingnaam uit
Vee uit het verskillende gedrag vir verskillende datatipes soos gegee hieronder.
- Vir 'n vaste numeriese: Al die waardes word na nul teruggestel.
- Vir 'n vaste string datatipe: Al die waardes word teruggestel na nul lengte.
- Vir 'n dinamiese skikking: Maak die geheue wat deur die skikking gebruik word vry.
Voorbeeld :
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 " Values before Erase " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Free the memory ' All values are erased. MsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Resultaat voor gebruik van die Erase-funksie
Resultaat na die gebruik van Erase
#3) IsArray
Hierdie funksie word gebruik om te bepaal of die gegewe invoerveranderlike 'n skikking is of nie. Dit gee waar as die veranderlike wat ingevoer is waar is, anders gee dit vals terug.
Sintaksis : IsArray (veranderlikenaam)
Voorbeeld:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2)) End
Die resultaat van die eerste Msgbox
Die resultaat van die tweede Msgbox
#4) Lbound
Dit gee die laagste subskripsie van die skikking wat gespesifiseer is as die argument vir die Lbound-funksie.
Sintaksis: LBound( ArrayName, [Dimensie] )
ArrayName is die naam van die skikking.
Dimensie is die opsionele heelgetalwaarde, as die skikking veelvuldige dimensies het, dan kan jy spesifiseer omwatter dimensie jy die Lbound wil bepaal.
Voorbeeld:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Returns 1. Result2 = LBound(ArrayValue, 3) ' Returns 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Dit gee die boonste subskripsie van die skikking wat as 'n argument in die Ubound-funksie gespesifiseer is terug.
Sintaksis: UBound( ArrayName, [Dimension] )
ArrayName is die naam van die skikking.
Dimensie is die opsionele heelgetalwaarde, as die skikking veelvuldige dimensies het, dan kan jy spesifiseer watter dimensie jy die Ubound wil bepaal.
Voorbeeld:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#6) Verdeel
Dit gee 'n skikking terug met 'n aantal substringe afgelei van die gegewe hele string.
Sintaksis: Verdeel(uitdrukking, [ skeier, [ limiet, [ vergelyk ]]])
- Uitdrukking: Dit is die hele string wat gebruik sal word om produseer substringe.
- Delimiter: Deur die gespesifiseerde afbakener te gebruik, sal substringe gegenereer word. As dit nie genoem word nie, word spasie as die afbakener beskou.
- Beperk: Aantal substringe wat teruggestuur moet word.
- Vergelyk: Na die substring geproduseer word, kan jy verskillende vergelykingsopsies gebruik om die resultaat te toets.
Voorbeeld: In die onderstaande voorbeeld gebruik ons skeidingsteken as – en beperk as 3.
Daarom sal die verdeelfunksie die hele string skei in substring gebaseer op die skeidingsteken. Maar ons het ook die limiet as 3 genoem sodat substringe nie na die limiet 3 gevorm sal word nie. Dus die laaste afbakener –sal oorgeslaan word.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "This is the example for-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Sluit aan
Dit is net die omgekeerde van die verdeling, Sluit aan sal een string skep deur verskeie substringe te kombineer.
Sintaksis: Sluit aan (bronskikking, [ afskeiding ])
Bronskikking: Eendimensionele reeks stringe wat jy in een wil aansluit.
Delimiter: Gespesifiseerde skeidingsteken sal na elke string bygevoeg word tydens aansluiting.
Voorbeeld:
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 "Date after joining " & Result End Sub
Al die 3 waardes is saamgevoeg en \ word tussen elke woord geplaas, soos ons genoem het \ as die skeidingsteken.
#8) Filter
Die filter sal ons toelaat om soek vir 'n gespesifiseerde pasmaat vanaf 'n skikking. Gebaseer op die filterkriteria, sal die subset van 'n stringskikking teruggestuur word.
Sintaksis: Filter(bronskikking, pas, [sluit in, [vergelyk ]])
Voorbeeld:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Found " & UBound(Mystring) - LBound(Mystring) + 1 & " words matching the criteria " End Sub
Hierdie voorbeeld sal vir die woord "help" in al die skikkingstring soek deur die filterfunksie te gebruik.
Gereelde Vrae
V #1) Hoe om die lengte van 'n skikking in VBA te kry?
Antwoord: Om die lengte van 'n skikking, gebruik ons die Ubound-funksie. Hierdie funksie sal vir ons 'n boonste subskripsie van 'n gespesifiseerde skikking gee.
V #2) Hoe om 'n skikking in VBA te verklaar?
Antwoord: Een- dimensionele skikking word verklaar soos hieronder getoon.
Dim skikkingnaam(ondergrens na bogrens) as datatipe
Voorbeeld: Dim myskikking(0 tot 2) as heelgetal
'n Tweedimensionele