Tässä opetusohjelmassa selitetään VBA Array, erilaiset array-tyypit, variantti array ja array-metodit ohjelmointiesimerkkien avulla:
Tavallinen VBA-muuttuja on paikanhaltija, joka tallentaa yksittäisen datan arvon. Sillä on 1:1-suhde eli 1 muuttuja vastaa 1 arvoa.
Kuvittele nyt, että tallennat useita samantyyppisiä arvoja. Useiden muuttujien luomisen sijaan voit luoda vain yhden muuttujan ja tallentaa kaikki samantyyppiset arvot. Tätä muuttujaa kutsutaan ARRAY:ksi.
Tässä opetusohjelmassa saat tietää, mikä on VBA-määritys, yksiulotteiset ja kaksiulotteiset määritykset sekä erilaiset määritystyypit, kuten kiinteät ja dynaamiset määritykset. Ymmärrämme myös erilaiset VBA:ssa käytettävät määritysmenetelmät.
VBA-muotoilu
Sarjat ovat erityyppisiä muuttujia, jotka voivat tallentaa useita saman tietotyypin arvoja.
Esimerkiksi, jos sinulla on 100 työntekijän nimet, voit luoda 100 merkkijonotyyppistä muuttujaa sen sijaan, että loisit 100 muuttujaa, luoda vain yhden merkkijonotyyppisen array-muuttujan ja määrittää 100 arvoa samaan array-muuttujaan.
Yksiulotteinen joukko
Joukkoa, jonka kaikki elementit ovat yhdellä rivillä tai yhdellä sarakkeella, kutsutaan yksiulotteiseksi joukoksi. Esimerkki yksiulotteisesta joukosta on luokan kaikkien oppilaiden nimien listaaminen yhteen sarakkeeseen. Se on ilmoitettu alla esitetyllä tavalla.
Dim arrayname(lowerbound To UpperBound) As DataType
Joukko voidaan ilmoittaa usealla eri tavalla. Alla on muutamia esimerkkejä.
Esimerkki:
#1) Dim MyArrayExample(0 To 3) As Integer (kokonaisluku)
Luo kokonaislukuarvoja vastaanottavan matriisin, jonka sijainti on 0,1,2,3.
#2) Dim MyArray2(3) As String
Oletusarvot ovat 0-3 ja luo merkkijonoarvoja vastaanottavan matriisin, jonka sijainti on 0,1,2,3.
#3) Dim MyArray2(13-15) As Double
Luo matriisin, joka alkaa arvosta 13 eli 13, 14 ja 15, ja hyväksyy Double-arvot. Olemme maininneet alarajaksi 13, joten matriisi alkaa varata arvoja paikasta 13 eikä 0.
Luodaan yksinkertainen koodi ja ymmärretään kaikki 3 array-ilmoitustapaa.
Huom: VB-koodin kirjoittaminen Avaa Microsoft Excel (tuetut versiot ovat Excel 2007, 2010, 2013, 2016, 2019). Siirry kohtaan Kehittäjä-välilehti -> Visual Basic (Vaihtoehtoisesti käytä pikanäppäintä Alt+F11). Napsauta VB-editorissa kohtaa Lisää -> Moduuli ja liitä alla oleva koodi.
Tarkastellaan alla olevaa menettelyä, jossa esitetään erityyppiset ilmoitukset.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String 'luo array indeksillä 0,1,2 firstQuarter(0) = "tammikuu" firstQuarter(1) = "helmikuu" firstQuarter(2) = "maaliskuu" MsgBox "Ensimmäinen vuosineljännes kalenterissa " & " " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String 'luo array indeksillä 0,1,2.secondQuarter(0) = "huhtikuu" secondQuarter(1) = "toukokuu" secondQuarter(2) = "kesäkuu" MsgBox "Toinen vuosineljännes kalenterissa " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String 'luo joukon, jonka indeksit ovat 13,14,15 thirdQuarter(13) = "heinäkuu" thirdQuarter(14) = "elokuu" thirdQuarter(15) = "syyskuun"MsgBox "Kolmas vuosineljännes kalenterissa " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " " & thirdQuarter(15) End Sub
Suorita koodi painamalla F5-näppäintä tai työkalurivin run-painiketta.
Säännöllinen muuttuja Vs Array-muuttuja
Tiedämme nyt, miten yksiulotteinen matriisi toimii, joten käydäänpä hetki läpi, miksi matriisit ovat niin tärkeitä ohjelmointikielissä.
Oletetaan, että sinun on syötettävä 5 työntekijän palkat. Jotta tämä onnistuu tavallisen muuttujan avulla, sinun on luotava 5 muuttujaa.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Ilmoita muuttuja jokaiselle opiskelijalle Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Lue opiskelijan arvosanat solusta 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 ' Tulosta opiskelijan merkinnät Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Rakennetaan nyt sama koodi käyttämällä Array-muuttujaa.
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
Tässä olemme käyttäneet vain yhtä array-muuttujaa, johon tallennetaan kaikki työntekijöiden nimet. Jos haluat lisätä 100 työntekijän nimeä lisää, sinun tarvitsee vain muuttaa array-muuttujan kokoa, eikä sinun tarvitse luoda uutta muuttujaa.
Tämä vähentää koodin rivien määrää ja tekee siitä siten helposti ymmärrettävän ja luettavan.
Kaksiulotteinen joukko
Kaksiulotteisessa matriisissa on kaksi indeksiä - ensimmäinen indeksi edustaa rivejä ja toinen indeksi saraketta. Siinä on useita rivejä ja sarakkeita, ja se esitetään yleensä taulukkomuodossa.
2 dim array -joukon julistus on seuraava:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Tarkastellaan esimerkkiä, jossa tallennetaan kahden opiskelijan kolmessa oppiaineessa saamat arvosanat. Luodaan siis kaksiulotteinen joukko, jossa on 2 riviä ja 3 saraketta.
Aloitamme sarjan riviltä 1 riville 2 ja sarakkeelta 1 sarakkeelle 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(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Yhteensä merkit rivillä 2 ja sarakkeessa 2 on " &totalMarks(2,2) Msgbox "Yhteensä merkit rivillä 1 ja sarakkeessa 3 on " &totalMarks(1,3) End Sub
Paina F5-näppäintä tai paina työkalurivin Run-painiketta koodin suorittamiseksi.
Rivi 2 ja sarake 2
Rivi 1 ja sarake 3
Kiinteät joukot
Kiinteillä joukoilla, joita kutsutaan myös staattisiksi joukoiksi, on kiinteä ala- ja yläraja, eikä tätä kokoa voida muuttaa suoritusaikana. Joukon koko määritetään julistuksen aikana suluissa. Kaikki edellä mainitut esimerkit ovat kiinteitä joukoita, koska olemme maininneet niiden koon julistuksen aikana.
Kiinteitä matriiseja käytetään yleensä silloin, kun olet varma matriisin koosta. Esimerkiksi, viikon päivien lukumäärän, voit luoda joukon, jonka alaraja on 0 ja yläraja 6, ja olla varma, ettet koskaan muuta sen kokoa.
Dynaamiset sarjat
Dynaamiset joukot mahdollistavat joukon koon muuttamisen suoritusaikana. Ne ovat hyödyllisiä, kun et ole varma joukon koosta. Oletetaan, että korkeakoulun sisäänpääsyssä et ole varma siitä, kuinka monta opiskelijaa todella pääsee sisään, joten et voi määrittää kokoa suunnittelu- tai ilmoitusaikana.
Dynaamisen joukon julistus on samanlainen kuin staattisen joukon julistus tyhjillä sulkeilla.
Dim Employee() As String
REDIM
Kun haluamme muuttaa kokoa, meidän on käytettävä komentoa REDIM , on huomattava, että alarajaa ei voi muuttaa, vaan ainoastaan joukon ylärajaa.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim auttaa muuttamaan array-kokoa ajon aikana dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Nyt tiedämme, että voimme muuttaa matriisin kokoa ajon aikana, joten voimme käyttää ReDim-laitetta aina, kun haluamme kasvattaa matriisin uboundia. Yritetään kasvattaa matriisin kokoa vielä kerran ja lisätä uusi oppilaan nimi.
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 initialisoi joukon uudelleen ja tuhoaa vanhat arvot.dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Olisit huomannut, että tulos ei näytä aiemmin lisättyjen opiskelijoiden nimiä, vaan antaa nolla-arvon. Tämä johtuu siitä, että Redim-lause luo uuden uuden kokoisen array-määritteen ja tuhoaa vanhat arvot.
ReDim Preserve
Represerve-lause auttaa meitä voittamaan ReDimin rajoituksen säilyttämällä vanhat arvot ja lisäämällä siten matriisin kokoa.
Kirjoitetaan yllä oleva koodi uudelleen käyttämällä 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 säilyttää vanhat arvot.dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Koska olemme käyttäneet preserve-avainsanaa, aiemmin syötettyjä arvoja ei menetetä ja uusi arvo lisätään onnistuneesti.
Variantti Array
Tähän asti olemme nähneet saman tyyppisiä arvoja hyväksyvän array-määritteen. Nyt ilmoitetaan array-määrite variantiksi ja tallennetaan eri tietotyypit, kuten String, Date, Long ja Integer, yhteen array-määritteeseen.
Esimerkki:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Henkilön tiedot " & arrayData(0) & " on " & " Puhelinnumero " & arrayData(1) & " ,Id " & arrayData(2) & " ,syntymäaika " & arrayData(3) End Sub
VBA-määritysmenetelmät
VBA:n matriiseissa on useita menetelmiä, joiden avulla voimme suorittaa erilaisia toimintoja, kuten alla on mainittu.
Numero | Nimi | Syntaksi | Kuvaus |
---|---|---|---|
1 | Array | Array(arglist) | Muuntaa säännöllisen muunnoksen muuttuja Array-muuttujaksi. |
2 | Poista | Pyyhi arrayyname | Käytetään kiinteän kokoisen array:n uudelleenintialisaatioon. ja vapauttaa muistin Dynamic-joukkoa varten. |
3 | IsArray | IsArray (muuttujan nimi) | Määrittää, onko muuttuja array. |
4 | L-koodi | LBound( ArrayName, [Dimension] ) | Palauttaa alimman alaindeksin joukon. |
5 | Ubound | UBound( ArrayName, [Dimension] ) | Palauttaa korkeimman alaindeksin joukon. |
6 | Split | Split(expression, [ delimiter, [ limit, [ compare ]]]]) | Se jakaa merkkijonon useisiin osajonoihin ja palauttaa nollapohjaisen matriisin. |
7 | Liity | Join(sourcearray, [ delimiter ]) | Yhdistää useita osajonoja matriisissa ja palauttaa merkkijonoarvon. |
8 | Suodatin | Filter(sourcearray, match, [ include, [ compare ]]]) | Suodattimen avulla voimme etsiä määritetty ottelu joukosta. |
Keskustellaan jokaisesta niistä yksityiskohtaisesti esimerkin avulla.
#1) Array
Ilmoitetaan tavallinen varianttimuuttuja ja käytetään sitä array-muuttujana. Kun haluat muuttaa tavallisen varianttimuuttujan array-muuttujaksi, meidän on käytettävä muuttujaa ARRAY toiminto, kuten alla olevassa esimerkissä näytetään.
Array-funktiot hyväksyvät argumentin, joka sisältää pilkulla erotettuja arvoja. Nämä arvot määritetään array-elementiksi.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Henkilön tiedot " & varData(0) & " on " & " Puhelinnumero " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Joukkomuuttuja on tunnistettava indeksin avulla, joten edellä olevassa esimerkissä arvot haetaan varData(0) varData(2) varData(3).
#2) Poista
Tämä toiminto poistaa kaikki kiinteäkokoiselle joukolle syötetyt arvot ja vapauttaa muistitilaa dynaamiselle joukolle.
Syntaksi: Erase arrayname
Erase käyttäytyy eri tavoin eri tietotyypeille alla esitetyllä tavalla.
- Kiinteä numeerinen: Kaikki arvot nollataan.
- Kiinteän merkkijonotietotyypin osalta: Kaikki arvot nollataan nollapituuteen.
- Dynaaminen joukko: Vapauttaa joukon käyttämän muistin.
Esimerkki:
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 NumArray Erase decArray Erase strArray Erase DynaArray ' Vapauta muisti ' Kaikkiarvot poistetaan. MsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Tulos ennen pyyhkimistoiminnon käyttöä
Tulos pyyhkimisen jälkeen
#3) IsArray
Tätä funktiota käytetään määrittämään, onko annettu syötemuuttuja array vai ei. Se palauttaa true, jos syötetty muuttuja on true, muuten se palauttaa false.
Syntaksi : IsArray (muuttujan nimi)
Esimerkki:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Onko arr1 array : " & IsArray(arr1)) MsgBox ("Onko arr2 array : " & IsArray(arr2)) End
Ensimmäisen Msgbox-ruudun tulos
Toisen msgboxin tulos
#4) L-alkuinen
Se palauttaa Lbound-funktion argumenttina määritetyn matriisin alimman alaindeksin.
Syntaksi: LBound( ArrayName, [Dimension] )
ArrayName on joukon nimi.
Dimension on valinnainen kokonaislukuarvo, jos joukossa on useita ulottuvuuksia, voit määrittää, mihin ulottuvuuteen haluat määrittää Lboundin.
Esimerkki:
Sub lboundTest() Dim Tulos1, Tulos2, Tulos3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Julistetaan array-muuttujat. Dim Arraywithoutlbound(10) Tulos1 = LBound(ArrayValue, 1) ' Palauttaa 1. Tulos2 = LBound(ArrayValue, 3) ' Palauttaa 10. Tulos3 = LBound(Arraywithoutlbound) MsgBox "Alin alaindeksi ensimmäisessä matriisissa " & Tulos1 & " alin alaindeksi 3. matriisissa " & Tulos2 & " Lowestsubscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Se palauttaa Ubound-funktiossa argumenttina määritellyn matriisin ylemmän alaindeksin.
Syntaksi: UBound( ArrayName, [Dimension] )
ArrayName on joukon nimi.
Dimension on valinnainen kokonaislukuarvo, jos joukossa on useita ulottuvuuksia, voit määrittää, minkä ulottuvuuden mukaan haluat määrittää Uboundin.
Esimerkki:
Sub UboundTest() Dim Tulos1, Tulos2, Tulos3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Julistetaan array-muuttujat. Dim ArraywithoutUbound(10) Tulos1 = UBound(ArrayValue, 1) Tulos2 = UBound(ArrayValue, 3) Tulos3 = UBound(ArraywithoutUbound) MsgBox "Pienin subscript ensimmäisessä arrayssä " & Tulos1 & " pienin subscript kolmannessa arrayssä " & Tulos2 & " pienin subscript vuonnaArraywithoutlbound " & Result3 End Sub
#6) Jaa
Se palauttaa joukon, jossa on annettuun kokonaiseen merkkijonoon perustuvien osajonojen määrä.
Syntaksi: Split(expression, [ delimiter, [ limit, [ compare ]]]])
- Ilmaisu: Tämä on koko merkkijono, jota käytetään alimerkkijonojen tuottamiseen.
- Rajausmerkki: Jos tätä ei ole mainittu, välilyöntiä pidetään erottimena.
- Raja: Palautettavien merkkijonojen määrä.
- Vertaa: Kun osajono on tuotettu, voit testata tuloksen eri vertailuvaihtoehdoilla.
Esimerkki: Alla olevassa esimerkissä käytämme erotinmerkkinä - ja rajana 3.
Näin ollen split-funktio erottaa koko merkkijonon osajonoiksi erottimen perusteella. Mutta olemme myös maininneet rajaksi 3, joten osajonoja ei muodosteta rajan 3 jälkeen. Näin ollen viimeinen erotin - ohitetaan.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "Tämä on esimerkki VBA-Split-funktiosta" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Liity
Tämä on vain jaon käänteisoperaatio, Join luo yhden merkkijonon yhdistämällä useita alimerkkijonoja.
Syntaksi: Join(sourcearray, [ delimiter ])
Sourcearray: Yksiulotteinen joukko merkkijonoja, jotka haluat yhdistää yhdeksi merkkijonoksi.
Rajausmerkki: Määritelty erotin lisätään jokaisen merkkijonon jälkeen yhdistämisen aikana.
Esimerkki:
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 "Päiväys yhdistämisen jälkeen " & Result End Sub
Kaikki kolme arvoa yhdistetään ja \ sijoitetaan kunkin sanan väliin, kuten olemme maininneet \:n erottimena.
#8) Suodatin
Suodattimen avulla voimme etsiä määriteltyä vastaavuutta matriisista. Suodatinkriteerien perusteella palautetaan merkkijonomäärän osajoukko.
Syntaksi: Filter(sourcearray, match, [ include, [ compare ]]])
Esimerkki:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Löytyi " & UBound(Mystring) - LBound(Mystring) + 1 & " sanoja, jotka vastaavat kriteerejä " End Sub
Tässä esimerkissä etsitään sanaa "help" kaikesta array-merkkijonosta käyttäen suodatinfunktiota.
Usein kysytyt kysymykset
Q #1) Miten saadaan VBA:ssa array-määritteen pituus?
Vastaa: Joukon pituuden saamiseksi käytämme Ubound-funktiota. Tämä funktio antaa meille määritetyn joukon ylemmän alaindeksin.
Q #2) Miten ilmoitetaan joukko VBA:ssa?
Vastaus: Yksiulotteinen array on ilmoitettu alla esitetyllä tavalla.
Dim arrayname(lowerbound To UpperBound) As DataType
Esimerkki: Dim Myarray(0 To 2) As Integer
Kaksiulotteinen array ilmoitetaan alla esitetyllä tavalla.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Esimerkki: Dim marks(1-3, 0-2) As Integer (kokonaisluku)
Q #3) Kuinka muuntaa Range Array:ksi?
Vastaa: Voimme käyttää Transpose-funktiota alueen muuttamiseksi arrayksi. Tämä koodi luo Mys[10]:n.
Sub Esimerkki() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
Kysymys #4) Mikä on VBA:n array-muunnos?
Vastaa: Varianttijoukko hyväksyy kaikenlaisia tietotyyppejä indeksikseen, eli voit tallentaa erityyppisiä arvoja yhteen joukkoon.
Esimerkki:
Dim arrayData(3) As Variant
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Esimerkkien avulla käsiteltiin tapoja muuttaa array-kokoa ajon aikana ja säilyttää arvot redim preserve -menetelmällä. Lopuksi opimme Array-metodeja, jotka auttavat meitä useiden operaatioiden suorittamisessa.