VBA massiivid

VBA -s on a Massiiv on üks muutuja, mis võib sisaldada mitut väärtust. Mõelge massiivile nagu lahtrivahemik: iga lahter võib salvestada väärtuse. Massiivid võivad olla ühemõõtmelised (mõelge ühele veerule), kahemõõtmelised (mõelge mitmele reale ja veerule) või mitmemõõtmelised. Massiivi väärtustele pääseb juurde nende asukoha (indeksi numbri) järgi massiivis.

VBA massiivi kiirleht

Massiivid

KirjeldusVBA koodLooDim arr (1 kuni 3) Variandina
arr (1) = "üks"
arr (2) = “kaks”
arr (3) = "kolm"Loo ExcelistDim arr (1 kuni 3) Variandina
Dim dimmer As Range, i As Integer
i = LBound (arr)
Iga lahtri vahemikus ("A1: A3")
i = i + 1
arr (i) = rakk.väärtus
Järgmine lahterLugege kõiki punkteDim i kui pikk
I = LBound (arr) kuni UBound (arr)
MsgBox arr (i)
Edasi iKustutaKustuta arrMassiiv stringileDim sName nagu string
sName = Liitu (arr, “:”)Suurenda suurustReDim Preserve arr (0 kuni 100)Määra väärtusarr (1) = 22

VBA massiivi kiirnäited

Vaatame täielikku näidet, enne kui hakkame üksikasjadesse laskuma:

12345678910 AlammassNäide ()Dim strNames (1 kuni 4) stringinastrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"msgbox strNames (3)End Sub

Siin oleme loonud ühemõõtmelise stringimassiivi: strNames suurusega neli (mahutab neli väärtust) ja määranud neli väärtust. Lõpuks kuvame sõnumikastis kolmanda väärtuse.

Sellisel juhul on massiivi kasutamisest kasu vähe: nelja asemel tuleb esitada ainult üks muutujadeklaratsioon.

Kuid vaatame näidet, mis näitab massiivi tegelikku võimsust:

12345678 AlammassNäide2 ()Dim strNames (1 kuni 60000) stringinaDim i As LongI = 1 kuni 60000strNames (i) = Lahtrid (i, 1). VäärtusEdasi iEnd Sub

Siin oleme loonud massiivi, mis mahutab 60 000 väärtust, ja oleme massiivi kiiresti töölehe veerust A täitnud.

Massiivi eelised? - Kiirus!

Võite mõelda Exceli töölehtedega sarnastele massiividele:

  • Iga lahter (või massiivi üksus) võib sisaldada oma väärtust
  • Igale lahtrile (või massiivi üksusele) pääseb juurde rea ja veeru asukoha järgi.
    • Tööleht Ex. lahtrid (1,4). väärtus = "1. rida, veerg 4"
    • Massiiv Ex. arrVar (1,4) = "Rida 1, veerg 4"

Miks siis massiividega vaeva näha? Miks mitte lugeda ja kirjutada väärtusi otse Exceli lahtritesse? Üks sõna: Kiirus!

Exceli lahtritesse lugemine / kirjutamine on aeglane protsess. Massiividega töötamine on palju kiirem!

Massiivi loomine / deklareerimine (Dim)

Märkus. Massiividel võib olla mitu „mõõdet”. Asjade lihtsuse hoidmiseks alustame ainult ühemõõtmeliste massiividega. Hiljem õpetuses tutvustame teile mitmemõõtmelisi massiive.

Staatiline massiiv

Staatilised massiivid on massiivid, mille suurust ei saa muuta. Vastupidi, Dünaamilised massiivid saab suurust muuta. Neid deklareeritakse veidi erinevalt. Kõigepealt vaatame staatilisi massiive.

Märkus. Kui teie massiivi suurus ei muutu, kasutage staatilist massiivi.

Staatilise massiivi muutuja deklareerimine on väga sarnane tavalise muutuja deklareerimisega, välja arvatud juhul, kui peate määrama massiivi suuruse. Massiivi suuruse määramiseks on mitu erinevat võimalust.

Massiivi algus- ja lõpppositsiooni saate selgesõnaliselt deklareerida:

123456789101112 Sub StaticArray1 ()'Loob massiivi positsioonidega 1,2,3,4Dim arrDemo1 (1 kuni 4) stringina"Loob massiivi positsioonidega 4,5,6,7Dim arrDemo2 (4 kuni 7) nii kaua'Loob massiivi positsioonidega 0,1,2,3Dim arrDemo3 (0 kuni 3) nii kauaEnd Sub

Või võite sisestada ainult massiivi suuruse:

123456 Sub StaticArray2 ()'Loob massiivi positsioonidega 0,1,2,3Dim arrDemo1 (3) StringinaEnd Sub

Tähtis! Pange tähele, et vaikimisi algavad massiivid positsioonist 0. Nii Dim arrDemo1 (3) loob massiivi positsioonidega 0,1,2,3.

Saate deklareerida Valiku alus 1 oma mooduli ülaosas, nii et massiiv algab 1. positsioonist:

12345678 Valiku alus 1Sub StaticArray3 ()'Loob massiivi positsioonidega 1,2,3Dim arrDemo1 (3) StringinaEnd Sub

Siiski leian, et massiivide algus- ja lõpppositsioonide selgesõnaline deklareerimine on palju lihtsam (ja vähem segadusttekitav).

Kas olete väsinud VBA koodinäidete otsimisest? Proovige AutoMacrot!

Dünaamiline massiiv

Dünaamilised massiivid on massiivid, mille suurust saab muuta (või mille suurust pole vaja määratleda).

Dünaamilise massiivi deklareerimiseks on kaks võimalust.

Variatiivmassiivid

Esimene viis dünaamilise massiivi deklareerimiseks on massiivi tüübi määramine Variant.

1 Dim arrVar () Variandina

Koos Variant Array, massiivi suurust pole vaja määratleda. Suurus kohandub automaatselt. Pidage ainult meeles, et massiiv algab positsiooniga 0 (kui lisate mooduli ülaosale valikubaasi 1)

12345678910111213 AlamvariantArray ()Dim arrVar () Variandina"Määrake väärtused (suurus = 0,1,2,3)arrVar = massiiv (1, 2, 3, 4)Muuda väärtusi (suurus = 0,1,2,3,4)arrVar = massiiv ("1a", "2a", "3a", "4a", "5a")'Väljundpositsioon 4 ("5a")MsgBox arrVar (4)End Sub

Mittevariandilised dünaamilised massiivid

Mitte-variant-massiivide puhul peate enne massiivi väärtuste määramist määrama massiivi suuruse. Massiivi loomise protsess on aga pisut erinev:

1234567 Sub DynamicArray1 ()Dim arrDemo1 () Stringina'Muudab massiivi asukohtadega 1,2,3,4ReDim arrDemo1 (1 kuni 4)End Sub

Esiteks deklareerite massiivi sarnaselt staatilise massiiviga, välja arvatud juhul, kui jätate massiivi suuruse välja:

1 Dim arrDemo1 () Stringina

Kui soovite massiivi suurust määrata, kasutage ReDim käsk massiivi suuruse suurendamiseks:

12 'Suuruse muutmine positsioonidega 1,2,3,4ReDim arrDemo1 (1 kuni 4)

ReDim muudab massiivi suurust. Lugege allpool ReDim ja ReDim Preserve erinevusi.

ReDim vs ReDim Preserve

Kui kasutate ReDim käsuga kustutate massiivist kõik olemasolevad väärtused. Selle asemel saate kasutada ReDim Preserve massiivi väärtuste säilitamiseks:

12 'Suuruse muutmine positsioonidega 1,2,3,4 (olemasolevate väärtuste säilitamine)ReDim Preserve arrDemo1 (1 kuni 4)

Massiivide deklareerimine lihtsustatud

Pärast kõike ülaltoodud lugemist võite tunda end ülekoormatuna. Asjade lihtsuse huvides töötame artikli ülejäänud osas enamasti staatiliste massiividega.

Määrake massiivi väärtused

Massiivi väärtuste määramine on väga lihtne.

Staatilise massiivi korral peate massiivi iga positsiooni ükshaaval määratlema:

12345678 AlammassNäide ()Dim strNames (1 kuni 4) stringinastrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"End Sub

Variantide massiivi abil saate kogu massiivi määratleda ühe reaga (praktiline ainult väikeste massiivide puhul):

123456 AlammassiivNäide_1liin ()Dim strNames () VariandinastrNames = Massiiv ("Shelly", "Steve", "Neema", "Jose")End Sub

Kui proovite määratleda väärtust massiivi asukohale, mida pole olemas, kuvatakse tõrketeade vahemikust väljas:

1 strNames (5) = "Shannon"

Allpool jaotises „Määra vahemikule massiiv” näitame teile, kuidas kasutada tsüklit massiividele suure hulga väärtuste kiireks määramiseks.

Hankige massiivi väärtus

Massiivi väärtusi saate hankida samamoodi. Allolevas näites kirjutame lahtritesse massiivi väärtused:

1234 Vahemik ("A1"). Väärtus = strNames (1)Vahemik ("A2"). Väärtus = strNames (2)Vahemik ("A3"). Väärtus = strNames (3)Vahemik ("A4"). Väärtus = strNames (4)

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

Määrake massiivile vahemik

Massiivile vahemiku määramiseks võite kasutada tsüklit:

12345678 AlamvahemikToArray ()Dim strNames (1 kuni 60000) stringinaDim i As LongI = 1 kuni 60000strNames (i) = Lahtrid (i, 1). VäärtusEdasi iEnd Sub

See liigub läbi lahtrite A1: A60000, määrates massiivile lahtrite väärtused.

Väljundmassiiv vahemikku

Või kasutage massiivi vahemikule määramiseks silmust:

123 I = 1 kuni 60000Lahtrid (i, 1). Väärtus = strNames (i)Edasi i

See teeb vastupidi: määrake massiivi väärtused lahtritele A1: A60000

2D / mitmemõõtmelised massiivid

Siiani oleme töötanud eranditult ühemõõtmeliste (1D) massiividega. Massiividel võib aga olla kuni 32 mõõdet.

Mõelge 1D -massiivile, nagu Exceli lahtrite üks rida või veerg, 2D -massiivile, nagu terve Exceli tööleht, millel on mitu rida ja veergu, ning 3D -massiiv on nagu terve töövihik, mis sisaldab mitut lehte, millest igaüks sisaldab mitut rida ja veergu ( võiks ka mõelda 3D -massiivist nagu Rubiku kuubikust).

Mitmemõõtmelise massiivi näited

Nüüd näitame näiteid erinevate mõõtmetega massiividega töötamisest.

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

1D massiivi näide

See protseduur ühendab eelmised massiivi näited üheks protseduuriks, näidates, kuidas massiive praktikas kasutada.

1234567891011121314 AlammassiivEx_1d ()Dim strNames (1 kuni 60000) stringinaDim i As Long'Määrake massiivile väärtusedI = 1 kuni 60000strNames (i) = Lahtrid (i, 1). VäärtusEdasi i'Väljundmassiivi väärtused vahemikkuI = 1 kuni 60000Arvutustabelid ("Väljund"). Lahtrid (i, 1) .Väärtus = strNames (i)Edasi iEnd Sub

2D massiivi näide

See protseduur sisaldab 2D -massiivi näidet:

123456789101112131415161718 AlammassiivEx_2d ()Dim strNames (1 kuni 60000, 1 kuni 10) stringinaDim i As Long, j As Long'Määrake massiivile väärtusedI = 1 kuni 60000J = 1 kuni 10strNames (i, j) = Lahtrid (i, j). VäärtusJärgmine jEdasi i'Väljundmassiivi väärtused vahemikkuI = 1 kuni 60000J = 1 kuni 10Arvutustabelid ("Väljund"). Lahtrid (i, j) .Väärtus = strNames (i, j)Järgmine jEdasi iEnd Sub

3D -massiivi näide

See protseduur sisaldab 3D -massiivi näidet mitme lehega töötamiseks:

12345678910111213141516171819202122 AlammassiivEx_3d ()Dim strNames (1 kuni 60000, 1 kuni 10, 1 kuni 3) stringinaDim i As Long, j Nagu Long, k As Long'Määrake massiivile väärtusedK = 1 kuni 3I = 1 kuni 60000J = 1 kuni 10strNames (i, j, k) = Sheets ("Sheet" & k). Lahtrid (i, j) .VäärtusJärgmine jEdasi iJärgmine k'Väljundmassiivi väärtused vahemikkuK = 1 kuni 3I = 1 kuni 60000J = 1 kuni 10Arvutustabelid ("Väljund" & k). Lahtrid (i, j) .Väärtus = strNames (i, j, k)Järgmine jEdasi iJärgmine kEnd Sub

Massiivi pikkus / suurus

Siiani oleme tutvustanud teile erinevat tüüpi massiive ja õpetanud massiive deklareerima ning massiivi väärtusi hankima/seadistama. Järgnevalt keskendume teistele massiividega töötamiseks vajalikele teemadele.

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

Funktsioonid UBound ja LBound

Esimene samm massiivi pikkuse / suuruse saamiseks on UBound ja LBound funktsioonide kasutamine massiivi ülemise ja alumise piiri saamiseks:

123456 Sub UBoundLBound ()Dim strNames (1 kuni 4) stringinaMsgBox UBound (strNames)MsgBox LBound (strNames)End Sub

Nende kahe lahutamine (ja 1 lisamine) annab teile pikkuse:

1 GetArrLength = UBound (strNames) - LBound (strNames) + 1

Massiivi pikkuse funktsioon

Siin on funktsioon ühemõõtmelise massiivi pikkuse saamiseks:

1234567 Avalik funktsioon GetArrLength (variandina) nii kauaKui on tühi (a) SiisGetArrLength = 0MuiduGetArrLength = UBound (a) - LBound (a) + 1Lõpp KuiLõppfunktsioon

Kas peate arvutama 2D massiivi suuruse? Vaadake meie õpetust: massiivi suuruse arvutamine.

Silmus läbi massiivi

Massiivi läbimiseks on kaks võimalust. Esimesed aasad läbivad täisarvud, mis vastavad massiivi arvu positsioonidele. Kui teate massiivi suurust, saate selle otse määrata:

12345678910111213 AlammassiivExample_Loop1 ()Dim strNames (1 kuni 4) stringinaDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"I = 1 kuni 4MsgBox strNames (i)Edasi iEnd Sub

Kui te aga massiivi suurust ei tea (kui massiiv on dünaamiline), võite kasutada eelmise jaotise funktsioone LBound ja UBound:

12345678910111213 AlammassiivExample_Loop2 ()Dim strNames (1 kuni 4) stringinaDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"I = LBound (strNames) kuni UBound (strNames)MsgBox strNames (i)Edasi iEnd Sub

Iga massiivi silmuse jaoks

Teine meetod on iga silmuse jaoks. See liigub läbi massiivi iga üksuse:

12345678910111213 AlammassiivExample_Loop3 ()Dim strNames (1 kuni 4) stringinaHämardatud toodestrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Iga üksuse jaoks strNamesMsgBoxi üksusJärgmine kaupEnd Sub

Iga massiivi silmus töötab lisaks ühemõõtmelistele massiividele ka mitmemõõtmeliste massiividega.

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

2D massiivi läbimine

Samuti saate UBoundi ja LBoundi funktsioone kasutada mitmemõõtmelise massiivi läbimiseks. Selles näites vaatame läbi 2D massiivi. Pange tähele, et funktsioonid UBound ja LBound võimaldavad teil määrata, millisest massiivi mõõtmest leida ülemine ja alumine piir (1 esimese mõõtme jaoks, 2 teise mõõtme jaoks).

1234567891011121314151617181920 AlammassiivExample_Loop4 ()Dim strNames (1 kuni 4, 1 kuni 2) stringinaDim 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"J = LBound (strNames, 2) kuni UBound (strNames, 2)I = LBound (strNames, 1) kuni UBound (strNames, 1)MsgBox strNames (i, j)Edasi iJärgmine jEnd Sub

Muud massiiviülesanded

Selge massiiv

Kogu massiivi kustutamiseks kasutage kustutuslauset:

1 Kustuta strNames

Kasutamise näide:

12345678910 AlammassNäide ()Dim strNames (1 kuni 4) stringinastrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Kustuta strNamesEnd Sub

Teise võimalusena võite massiivi muuta, et selle suurust muuta, tühjendades massiivi osa:

1 ReDim strNames (1 kuni 2)

See muudab massiivi suuruseks 2, kustutades positsioonid 3 ja 4.

Krahv Array

Massiivi igas dimensioonis olevate positsioonide arvu saate lugeda UBoundi ja LBoundi funktsioonide abil (arutatud eespool).

Massiivi kaudu loopides saate ka sisestatud üksuste (või teatud kriteeriumidele vastavate üksuste) arvu lugeda.

See näide vaatab läbi objektide massiivi ja loeb massiivist leitud tühjade stringide arvu:

123456789101112131415 AlammassiivLoopandCount ()Dim strNames (1 kuni 4) stringinaDim i As Long, n As LongstrNames (1) = "Shelly"strNames (2) = "Steve"I = LBound (strNames) kuni UBound (strNames)Kui strNames (i) "" Siisn = n + 1Lõpp KuiEdasi iMsgBox n & "leitud tühjad väärtused."End Sub

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

Eemalda duplikaadid

Mingil hetkel võite soovida massiivist duplikaadid eemaldada. Kahjuks pole VBA-l selle tegemiseks sisseehitatud funktsiooni. Siiski oleme kirjutanud funktsiooni massiivist duplikaatide eemaldamiseks (sellesse õpetusse kaasamiseks on liiga pikk aeg, kuid lisateabe saamiseks külastage linki).

Filtreeri

Funktsioon VBA võimaldab filtreerida massiivi. Seda tehakse, luues uue massiivi, millel on ainult filtreeritud väärtused. Allpool on kiire näide, kuid lugege kindlasti artiklit, et saada rohkem näiteid erinevate vajaduste jaoks.

1234567891011121314 Alamfiltri_vaste ()'Defineeri massiivDim strNames VariantstrNames = Massiiv ("Steve Smith", "Shannon Smith", "Ryan Johnson")'Filter MassiivDim strSubNames VariantstrSubNames = Filter (strNames, "Smith")'Krahv filtreeritud massiivMsgBox "Leitud" & UBound (strSubNames) - LBound (strSubNames) + 1 & "nimed".End Sub

Funktsioon IsArray

Funktsiooni IsArray abil saate testida, kas muutuja on massiiv:

123456789101112 Sub IsArrayEx ()'Loob massiivi positsioonidega 1,2,3Dim arrDemo1 (3) Stringina'Loob tavalise stringimuutujaDim str nagu stringMsgBox IsArray (arrDemo1)MsgBox IsArray (str)End Sub

Liituge Arrayga

Saate kiiresti liituda kogu massiiviga koos liitumisfunktsiooniga:

123456789101112 Alammassiiv_liitumine ()Dim strNames (1 kuni 4) stringinaDim joinNames kui stringstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"joinNames = Liitu (strNames, ",")MsgBox joinNamesEnd Sub

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

Jagage string massiiviks

Funktsioon VBA Split jagab tekstistringi massiiviks, mis sisaldab algse stringi väärtusi. Vaatame näidet:

123456789 Alammassiiv_jaotamine ()Hämarad nimed () stringinaDim liitusNimed stringinajoinNames = "Shelly, Steve, Nema, Jose"Nimed = poolitatud (liitunudNimed, ",")MsgBoxi nimed (1)End Sub

Siin jagame selle tekstijada “Shelly, Steve, Nema, Jose” massiiviks (suurus 4), kasutades koma eraldajat (,).

Const Array

Massiiv ei saa deklareerida VBA -s konstantseks. Siiski saate sellest lahti saada, luues massiivina kasutatava funktsiooni:

123456789 Määrake ConstantArrayFunktsioon ConstantArray ()ConstantArray = massiiv (4, 12, 21, 100, 5)Lõppfunktsioon'Taasta ConstantArray väärtusSub RetrieveValues ​​()MsgBox ConstantArray (3)End Sub

Kopeeri massiiv

Massiivi kopeerimiseks VBA abil pole sisseehitatud viisi. Selle asemel peate väärtuste määramiseks ühest massiivist teise kasutama silmust.

12345678910111213141516171819 Sub CopyArray ()Dim Arr1 (1 kuni 100) nii kauaDim Arr2 (1 kuni 100) sama pikkDim i As Long„Loo massiiv 1I = 1 kuni 100Arr1 (i) = iEdasi i„CopyArray1 massiivi2I = 1 kuni 100Arr2 (i) = Arr1 (i)Edasi iMsgBox Arr2 (74)End Sub

Ülevõtmine

Massiivi ülevõtmiseks pole sisseehitatud VBA-funktsiooni. Siiski oleme kirjutanud funktsiooni 2D massiivi ülevõtmiseks. Lisateabe saamiseks lugege artiklit.

VBA programmeerimine | Koodigeneraator töötab teie jaoks!

Funktsiooni tagastamismassiiv

VBA arendajatel on tavaline küsimus, kuidas luua funktsioon, mis tagastab massiivi. Ma arvan, et enamik raskusi lahendatakse variatiivmasside abil. Oleme kirjutanud artikli sellel teemal: VBA funktsiooni tagastamise massiiv.

Massiivide kasutamine Access VBA -s

Enamik ülaltoodud massiivi näiteid töötab Access VBA -s täpselt samamoodi nagu Exceli VBA -s. Üks peamine erinevus on see, et kui soovite massiivi täita Accessi andmete abil, peate loopima objekti RecordSet, mitte vahemiku objekti.

1234567891011121314151617181920212223 AlamvahemikToArrayAccess ()Vea korral Jätka järgmistDim strNames () stringinaDim i As LongDim iCount nii kauaDim dbs andmebaasinaDim rst Esmalt salvestusenaMäära dbs = CurrentDbMäära rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Koos esimesega.MoveLast.MoveFirstiCount = .RecordCountReDim strNames (1 iCountile)I = 1 iCountilestrNames (i) = rst.Fields ("Kliendinimi").MoveNextEdasi iLõpetaesimene. SuleMäära esimene = mitte midagiMäära dbs = mitte midagiEnd Sub
Massiiviõpetused
Massiivi mega-juhendjah
Hankige massiivi suurus
Selge massiiv
Filter Massiiv
Massiivi ülevõtmine
Funktsiooni tagastamismassiiv
Eemalda duplikaadid

Te aitate arengu ala, jagades leht oma sõpradega

wave wave wave wave wave