In een 'gewone' of enkelvoudige geheugenvariabele kan je één waarde opslaan. Je kan uiteraard de waarde wijzigen doch dan is de originele overschreven. Een groep waarden die met mekaar verband houden kan je echter beter opslaan in een geïndiceerde variabele of matrix of array.
Voorbeeld:
Je wil de middagtemperaturen voor één week noteren en daarna het gemiddelde berekenen. In de sub VoorbeeldArray01 zie je hoe dit gerealiseerd kan worden:
| Public Sub VoorbeeldArray01() Dim asngTemp(7) As Single 'zie bespreking punt 1 + 2 Dim intTeller As Integer,varTeller Dim sngSom As Single 'Opvullen array - zie bespreking punt 3 For intTeller = 1 To 7 asngTemp(intTeller) = InputBox("Dag " & Str(intTeller)) Next intTeller 'Afdrukken array + gemiddelde berekenen sngSom = 0 For Each varTeller In asngTemp 'Bespreking punt 4 sngSom = sngSom + asngTemp(varTeller) Debug.Print "Element " & Str(varTeller) & ":" & Str(asngTemp(varTeller)) Next varTeller 'Gemiddelde afdrukken Debug.Print "Gemiddelde: "; sngSom / 7 'Bewerkingen met elementen uit de array Debug.Print asngTemp(4) ' zie bespreking punt 5 Debug.Print asngTemp(2) + asngTemp(4) End Sub |
Bespreking:
| element | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| waarde | 0 | 19.6 | 20.5 | 19 | 16 | 19 | 21.6 | 21.6 |
Je merkt dat in de array het element met volgnummer 0
voorkomt en niet zinvol gebruikt wordt. Je kan dit
voorkomen door de elementen te laten nummeren vanaf 1.
Dit doe je door in het declaratiegedeelte van de module
de opdracht 'Option Base 1' te schrijven.
Elementen waar je zelf geen waarde in plaatst worden
opgevuld met een standaardwaarde: nul voor numerieke
arrays (integer, single, double), een lege string voor
stringarrays, 0:00:00 voor datumarrays, onwaar voor
arrays met elementen van het type Boolean.
opm:
Wil je de temperaturen voor december bijhouden, dan maak je een array met 31 elementen in plaats van 7. De rest van de tekst blijft onveranderd:
Dim asngTemp(31) As Single
...
'Opvullen array
For intTeller = 1 To 31
asngTemp(intTeller) = InputBox("Dag " &
Str(intTeller))
Next intTeller
Zonder array zou je dus 31 variabelen nodig hebben, 31
regels om de tabel op te vullen,...
| Syntax: For Each telvariabele In arraynaam |
De telvariabele moet dan wel van het type Variant zijn.
Er weze nog op gewezen dat je arrays niet als dusdanig kan gebruiken; je werkt steeds met de elementen ervan! Hierop is één uitzondering: je kunt een volledige array verplaatsen naar een Variant, zodat u één variabele van het type variant krijgt die de volledige array bevat:
Voorbeeld:
Dim varMijnArray As Variant
varMijnArray = asngTemp
De variabele varMijnArray is dan 'ingericht' als een array. Je verwijst dus met de subscriptnotatie of index zoals voor een 'gewone' array naar de onderdelen van de array in de variant. Bijvoorbeeld:
varMijnArray(3) = varMijnArray(1) + varMijnArray(5)
Een tweedimensionele tabel bevat een aantal rijen en een aantal kolommen.
Stel je wil de ochtend-, middag- en avondtemperatuur gedurende één week registreren. Je kan de gegevens in een tweedimensionele tabel met 3 kolommmen en 7 rijen opslaan.
| Public Sub VoorbeeldArray02() 'Declaratie van de variabelen Dim asngTemp2(7, 3) As Single Dim intRij, intKolom As Integer Dim strTekst As String 'Opvullen van de array rij per rij For intRij = 1 To 7 For intKolom = 1 To 3 strTekst = "Temperatuur " & Str(intKolom) strTekst = strTekst + " van dag " & Str(intRij) & ": " asngTemp2(intRij, intKolom) = InputBox(strTekst) Next Next 'Afdrukken rij per rij For intRij = 1 To 7 For intKolom = 1 To 3 strTekst = "Temperatuur " & Str(intRij) strTekst = strTekst + " van dag " & Str(intKolom) & ": " Debug.Print "Dag " & Str(intRij) & ": "; asngTemp2(intRij, intKolom); Next Debug.Print 'Nieuwe regel nemen in venster 'Foutopsporing' Next End Sub |
Bespreking:
Je kan een array declareren zonder opgave van het
aantal dimensies en het aantal elementen per dimensie. Je
kan dit achteraf tijdens de uitvoering van de
programmacode doen. Dergelijke array is een dynamische
array.
Je declareert deze op de gewone manier bijvoorbeeld met
DIM doch laat de haakjes leeg: Dim sngarray() As
Single. Later kunt u in een procedure die binnen het
bereik van de array valt, de instructie ReDim
gebruiken om het aantal dimensies in te stellen en het
aantal elementen plus de onder- en bovengrens voor elke
dimensie. Met de instructie ReDim kunt u de dynamische
array wijzigen zo vaak u wilt. Voeg je de term 'Preserve'
toe aan Redim dan behouden de reeds opgevulde elementen
hun actuele waarde.
| Public Sub VoorbeeldArray03() Dim aintMijnArray() Dim intTeller, intAantal As Integer intAantal = InputBox("Hoeveel elementen wil je?") ReDim aintMijnArray(intAantal) 'Opvullen For intTeller = 1 To intAantal aintMijnArray(intTeller) = intTeller Next intTeller 'Afdrukken For intTeller = 1 To intAantal Debug.Print aintMijnArray(intTeller) Next intTeller ReDim aintMijnArray(intAantal * 2) 'Opvullen For intTeller = 1 To intAantal * 2 aintMijnArray(intTeller) = intTeller * 2 Next intTeller 'Afdrukken For intTeller = 1 To intAantal * 2 Debug.Print aintMijnArray(intTeller) Next intTeller ReDim Preserve aintMijnArray(intAantal * 3) 'Opvullen For intTeller = intAantal * 2 + 1 To intAantal * 3 aintMijnArray(intTeller) = intTeller * 3 Next intTeller 'Afdrukken For intTeller = 1 To intAantal * 3 Debug.Print aintMijnArray(intTeller) Next intTeller End Sub |
Welke getallen worden afgedrukt indien voor 'intAantal' 2 wordt ingevuld?
| Tip: Je vindt alle sleutelwoorden die op een onderwerp betrekking hebben netjes samen wanneer je in het tabblad 'Index' van het helpscherm 'Sleutelwoordenoverzicht' (of een deel ervan) typt. Je kiest dan uit de getoonde lijst bijvoorbeeld 'array' en je ziet alle sleutelwoorden i.v.m. arrays. Je merkt dan ook wel dat in bovenstaande tekst niet alles werd verteld... |