lørdag den 19. november 2016

Makroer med arrays

Jeg har i flere artikler benyttet arrays til at håndtere data. En variabel er en midlertidig erstatning for en værdi, hvor et array er en midlertidig erstatning for en liste af værdier.

I eksemplerne tildeles variable og arrays værdier i koden, men i virkeligheden vil værdierne være generiske, og f.eks. komme fra celler i et regneark, en InputBox eller blive indlæst fra en fil.

Name="John"    'Variabel
Names()=Array("Peter", "Poul", "Birthe", "Anne") 'Array


Jeg navngiver array'et Names() men kunne lige så godt have skrevet Names.

Vi kan undersøge om en variabel indeholder et array:

IsArray (Names())        'True

Indholdet af et array kan vi finde frem med et indeks:

Print Names(1)            '"Poul"

Som standard er et array indeks-nul, hvilket betyder at det første element i array'et har indeks 0. Det er muligt at anvende indeks 1, men det er upraktisk, og i resten af artiklen antager vi at vi benytter indeks-nul.

LBound(Names()) udtrykker den nederst grænse, hvilket normalt er 0.

UBound (Names()) udtrykker den øverste grænse, altså hvor mange elementer der er (men husk at lægge en til, for at kompensere for indeks-nul).

UBound af et tomt array returnerer -1:

NavneArray=Array()
Print UBound(NavneArray)     '-1 hvis array er tom


Et lidt større eksempel:

Sub SimpleArray
    Names=Array("Peter", "Poul", "Birthe", "Anne")
    Print IsArray(Names)    'True
    Print Names(1)        'Poul
    Print LBound(Names)    '0
    Print UBound(Names)    '3
End Sub


Arrays er tollerante for datatyper:

Names=Array("Peter", "Poul", "Birthe", "Anne", 15)
Print UBound(Names)    '4
Print Names(4)    '15


Vi kan også tildele elementer på en anden måde:

Dim Persons(4)
Persons(0) = "Peter" : Persons(1) = "Poul": Persons(2) = "Birthe" : Persons(3) = "Anne" : Persons(4) = 15


Hvis du ønsker at tilføje et nyt element til et eksisterende array, skal du først gøre plads (redimensionere):

ReDim Persons(5)
Persons(5) = "John"


Et array kan også indeholde flere dimensioner:

Sub ComplexArray
Dim Persons(3,2)
Persons(0,0)="Peter":Persons(1,0)="Poul":Persons(2,0)="Birthe":Persons(3,0)="Anne"
Persons(0,1)=17:Persons(1,1)=21:Persons(2,1)=45:Persons(3,1)=12
Persons(0,2)="Mand":Persons(1,2)="Mand":Persons(2,2)="Kvinde":Persons(3,2)="Kvinde"

For i=0 to UBound(Persons(),1)          'Øvre grænse første dimension
    v=""                                'Nulstil
    For j = 0 to UBound(Persons(),2)    'Øvre grænse anden dimension
        v= v+Persons(i,j) + chr(13)     'chr(13) = linjeskift
    Next j
    MsgBox(v)
Next i
End Sub

Vi kan konvertere tekst til arrray og omvendt. 
Split opdeler en tekststreng, og returnerer et array.
Join samler elementerne fra et array og returnerer en tekststreng.

Eksempel:

Sub Split_Join
Navneliste="Peter, Poul, Birthe, Anne"    'Tekststreng
Print IsArray(Navneliste)
NavneArray()=Split(Navneliste,",")
Print IsArray(NavneArray)
For i = 0 to UBound(NavneArray)
    NavneArray(i) = Trim(NavneArray(i))   'Fjern mellemrum
Next i
NyNavneListe()= Join(NavneArray,"#")      'Ny tekststreng
Print NyNavneListe                        'Peter#Poul#Birthe#Anne
End Sub