Hoe Excel VBA-array te gebruiken?
U kunt de macro's uitvoeren vanuit de Visual Basic Editor door uw cursor in de macro te plaatsen en op de F5-toets te drukken, of vanuit Excel door het dialoogvenster Macro's (ALT+F8) te openen, de macro te kiezen die u wilt uitvoeren en op Uitvoeren te klikken. Het is het beste om deze macro's uit te voeren vanuit Visual Basic Editor met behulp van Debug > Stap in (door op F8) te drukken zodat u ze kunt bekijken terwijl ze werken. Instructie Als het tabblad Ontwikkelaar niet in het lint staat…
- Excel openen.
- Ga naar VBA-editor (druk op Alt + F11)
- Ga naar het onmiddellijke venster. (Ctrl+G)
- Schrijf hieronder Code.
- Application.ShowDevTools = True
VBA-code invoegen in Excel
- Ga naar Ontwikkelaar Tabblad > Code Groep > Visuele Basis
- Klik Invoegen > Module.
- Opent een lege module voor u.
- Schrijf / plak de verstrekte code in die module
VBA-code uitvoeren in Excel
- Selecteer ergens tussen de code, Sub… Einde Sub
- Klik op Uitvoeren & Sub uitvoeren of F5
Statische matrixvariabelen
In plaats van verschillende unieke variabelen te gebruiken om informatie op te slaan, kunt u een arrayvariabele gebruiken.
Als u weet hoeveel elementen u in de array moet opslaan, kunt u een statische arrayvariabele als deze gebruiken:
Code
Sub TestStaticArray()
' slaat 10 namen op in de werkmap in de arrayvariabele MyNames()
Dim MyNames (1 tot 10) As String ' declareert een statische arrayvariabele
Dim iCount als geheel getal
Voor iCount = 1 Naar ThisWorkbook.Sheets.Count
MyNames(iCount) = ThisWorkbook.Sheets(iCount).Name
Debug.Print MyNames (iCount)
Volgende iCount
Erase MyNames() ' verwijdert de variabele inhoud, maakt wat geheugen vrij
Einde sub
Decoderen
Dim MyNames (1 tot 10) als string
We hebben een enkele echte MyNames als een string, die 10 items kan bevatten. Dus MyNames veriable is een array-type.
Dim iCount als geheel getal
We hebben een enkele variabele iCount gedeclareerd als een geheel getal, dat alleen numeriek geheel getal type waarde kan bevatten
Voor iCount = 1 Naar ThisWorkbook.Sheets.Count
ThisWorkbook.Sheets.Count geeft ons het aantal bladen in een werkmap. ThisWorkbook, verwijst naar de Workbook, waarin code is geschreven.
MyNames(iCount) = ThisWorkbook.Sheets(iCount).Name
Met behulp van een lus wijzen we de naam van elk blad toe aan een enkele veriable genaamd MyNames. MyNames is een echt array-type, dus het zal elke bladnaam in elk array-item opslaan.
Debug.Print MyNames (iCount)
Net nadat de waarde aan elk item van een array is toegewezen, wordt dezelfde waarde afgedrukt in ImmediateWindow, standaard onder in het VBA-venster. U kunt de toewijzing van elke waarde bekijken en de waarde ervan weergeven in ImmediateWindow.
Volgende iCount
Next wordt gebruikt om For Loop in Excel VBA te vertellen om dezelfde taak opnieuw te herhalen, door de iCount-teller te verhogen, totdat iCount het totale aantal bladen in de werkmap heeft bereikt.
Dynamische matrixvariabelen
Dynamische array-variabelen zijn handig als u van tevoren niet weet over hoeveel elementen u informatie moet opslaan.
Je declareert dynamische arrayvariabelen net als een statische arrayvariabele, behalve dat je geen informatie geeft over de arraygrootte.
In bovenstaand voorbeeld (Dim MyNames (1 tot 10) als string) als het aantal vellen groter is dan 10, zal dit door een fout gebeuren, omdat MyNames niet meer dan 10 items kan opslaan.
Code
SubtestDynamicArray()
' slaat alle namen in de werkmap op in de arrayvariabele MyNames()
Dim MyNames() As String ' declareert een dynamische arrayvariabele
Dim iCount als geheel getal
Dim Max als geheel getal
Max = ThisWorkbook.Sheets.Count ' vindt de maximale arraygrootte
ReDim MyNames(1 To Max) ' declareert de arrayvariabele met de benodigde grootte
Voor iCount = 1 tot max
MyNames(iCount) = ThisWorkbook.Sheets(iCount).Name
MsgBox MijnNamen (iCount)
Volgende iCount
Erase MyNames() ' verwijdert de variabele inhoud, maakt wat geheugen vrij
Einde sub
Decoderen
Dim MyNames() als string
We hebben een enkele veriable MyNames als een string, die een array-type is, vanwege het openen en sluiten van Paranthesis, achter de echte naam, maar we kunnen er geen gegevens in opslaan, omdat we het UpperLevel niet hebben opgegeven.
ReDim MyNames (1 tot Max)
Redim wordt gebruikt om de array opnieuw te dimensioneren. Het zal nu het bovenste niveau van het arraytype Veriable toewijzen.
In dit geval het totale aantal bladen in de werkmap (Max = ThisWorkbook.Sheets.Count)
MsgBox MijnNamen (iCount)
In het laatste voorbeeld hebben we de waarde in variabelen in het onmiddellijke venster afgedrukt, deze keer drukken we de waarde af in een MessageBox, die er als volgt uitziet …
Als je weet dat je een arrayvariabele met 1000 items nodig hebt, gebruik dan een statische variabele. Het nadeel is dat je geheugen voor 1000 items per keer gebruikt, ook in het geval dat je slechts informatie over 10 items opslaat. Als u een dynamische array-variabele gebruikt, gebruikt u het geheugen efficiënter.
Soms is het niet mogelijk om te berekenen hoe groot de arrayvariabele moet zijn. In deze gevallen moet de grootte van de arrayvariabele indien nodig worden vergroot. Wanneer u een ReDim-statement om de grootte van de arrayvariabele te wijzigen, de inhoud van de variabele wordt ook gewist om te voorkomen dat de inhoud van de variabele wordt verwijderd wanneer u Redim de arrayvariabele die je nodig hebt om de . te gebruiken ReDim behouden-uitspraak.
Code
Sub GetFileNameList()
' slaat alle bestandsnamen op in de huidige map
Dim FolderFiles() As String ' declareert een dynamische arrayvariabele
Dim tmp als string, fCount als geheel getal
fAantal = 0
tmp = Dir("D:\Test\*.*")
Terwijl tmp leeg is
fCount = fCount + 1
ReDim Preserve FolderFiles (1 tot fCount)
' declareert de array-variabele opnieuw (size+1)
FolderFiles(fCount) = tmp
tmp = Dir
Wend
MsgBox fCount & " bestandsnamen zijn te vinden in de map " & CurDir
Wis FolderFiles ' verwijdert de variabele inhoud, maak wat geheugen vrij
Einde sub
Decoderen
Dim FolderFiles() As String
We hebben een enkele veriable FolderFiles als een string gedimensioneerd, wat een array-type is, vanwege het openen en sluiten van Paranthesis, achter de echte naam, maar we kunnen er geen gegevens in opslaan, omdat we het UpperLevel niet hebben opgegeven.
tmp = Dir("D:\Test\*.*")
De opdracht Dir werkt als een verkenner, die de naam van alle bestanden en mappen in een map kan bevatten. U kunt alle bestanden ook beperken tot een aantal specifieke criteria. Dir("D:\Test\*.pdf") beperkt alle bestanden tot alleen PDF-bestanden of extensies.
Terwijl tmp leeg is
In plaats van For-lus in Excel VBA herhalen we deze keer dezelfde actie, met Excel VBA WHILE LOOP, waarbij de criteria om de lus te beëindigen waren ingesteld als tmp niet gelijk aan leeg. Dus, totdat er enige waarde in tmp waarneembaar was, zal de lus werken.
ReDim Preserve FolderFiles (1 tot fCount)
Array veriable FolderFiles hebben geen hoger niveau op de startpositie. Maar bij elke herhaling zal het zijn bovenste niveau verhogen door de opdracht ReDim. In de eerste run 1, dan 2… enzovoort, tot fCount. Maar met elke keer dat het bovenste niveau wordt verhoogd, gaan alle reeds toegewezen variabelen verloren. Door de opdracht Preserve te gebruiken, kunnen we de reeds toegewezen waarde vasthouden of opslaan.
Wend
Wend vertelde For Loops in VBA dat hij dezelfde taak opnieuw moest herhalen totdat aan de criteria voldeed.
MsgBox fCount & " bestandsnamen zijn te vinden in de map " & CurDir
Bij elke herhaling zal fcout toenemen met +1, en de uiteindelijke waarde zal het aantal bestanden zijn dat in die map / map wordt gevonden. CurDir-opdracht geeft de naam van de huidige directory. In dit geval “D:\Test”