Avatar billede kriskrisk Nybegynder
02. juni 2005 - 12:37 Der er 10 kommentarer og
1 løsning

Definition af array

Jeg vil gerne lave et array af typen:

Dim array(antal) as variant

array(0)="xxx"
array(1))"yyy"
osv. så man selv kan fylde flere elementer på undervejs.

Problemet er, at antallet af elementer i "Dim array(antal)" skal være kendt. Kan det ikke lade sig gøre på en måde ikke at definere antallet af elementer på forhånd?

Jeg ville personligt lave:

liste="xxx"
liste=liste & "," & "yyy"
liste=liste & "," & "zzz"

...men det er ikke godt nok til "kunden", der gerne vil tilføje nye elementer på formen:

array(tal)="zzz"

Hvordan kan det gøres?
Avatar billede kabbak Professor
02. juni 2005 - 12:51 #1
Global

Dim I as integer
Dim array(antal) as variant


sub

Antal(i) ="xxx"
I = I + 1
ReDim Preserve antal(i)

nend sub
Avatar billede kriskrisk Nybegynder
02. juni 2005 - 12:59 #2
Jeg er ikke helt sikker på, hvad du mener.

Er "i" det samme som "I"?
Med "antal(i)" mener du "array(i)" som defineret?

Kan man på den måde bare tilføje et nyt element i array'et ved at tilføje én enkelt linje: array(4)="kkk" ?
Avatar billede kabbak Professor
02. juni 2005 - 13:14 #3
I er en tæller, der holder øje med hvor mange data du har i Arrayet

ReDim Preserve antal(I)
, gør klar til næste data og du beholder de gamle
Avatar billede kriskrisk Nybegynder
02. juni 2005 - 15:26 #4
Nu kan jeg godt se, hvad du mener, men det lever ikke rigtigt op til kravene. Hvis man alligevel skal tilføje tre linjer pr. element, kan man lige så godt ændre antallet i "Dim array(antal)", hvis der skal tilføjes nyt.
Avatar billede martin_moth Mester
02. juni 2005 - 15:53 #5
huh?
Avatar billede martin_moth Mester
02. juni 2005 - 15:55 #6
hvad er det for "tre linier" pr "elementer"?

redim preserve redimensionerer et array, og gemmer alt der var i det i forvejen...
Avatar billede martin_moth Mester
02. juni 2005 - 15:58 #7
Og måden man bruger det på er:

Dim array() as variant 'Angivet UDEN størrelse

Hvis du så vil fylde 5 elementer i arrayet:

dim i as long
for i = 0 to 4
  ReDim Preserve array(i)
  Array(i) ="element nr " & i
  i = i + 1
next i



Og hvis du vil have enenu et element i:

i = ubound(array) +1 'Ubound() returnerer arryets aktuelle størrelse
redim preserve array(i)
array(i) = "Endnu et element"
Avatar billede martin_moth Mester
02. juni 2005 - 16:05 #8
Ups - du må IKKE kalde et array for "array" - der er et reserveret navn. Og jeg har en tæller for meget med.

Copy-paste nedenstående - det virker, og viser hvordan du kan bruge et dynamisk array:

Dim Myarray() As Variant 'Angivet UDEN størrelse

Dim i As Long
For i = 0 To 4
  ReDim Preserve Myarray(i)
  Myarray(i) = "Element nr " & i
Next i

i = UBound(Myarray) + 1 'Ubound() returnerer arryets aktuelle størrelse
ReDim Preserve Myarray(i) 'Forøger størrelsen med EN
Myarray(i) = "Endnu et element" 'Tilføjer et element

For i = 0 To UBound(Myarray)
  MsgBox "Test af arrayindhold, i = " & i & ": " & Myarray(i)
Next i
Avatar billede kriskrisk Nybegynder
02. juni 2005 - 17:13 #9
Martin: Med kabbak's forslag, skal der tilføjes tre linjer pr. nyt element. Det samme ser ud til at være tilfældet for dit forslag, hvis jeg forstår det rigtigt:

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Æbler"

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Pærer"

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Bananer"

Er det ikke rigtigt forstået?

Det skal bruges til en person med begrænsede programmeringsevner, der gerne ville have det meget nemt at opdatere. Der mener jeg, at mit eget forslag:

liste="xxx"
liste=liste & "," & "yyy"
liste=liste & "," & "zzz"

arr_liste=split(liste,",")

osv.

...er lettere at tilføje et nyt element, da personen blot skal tilføje et nyt liste=liste & "," & "kkk" under de andre, og så kører det. Han ville gerne have, at han blot kunne tilføje

arr_liste(3)="kkk"

under

arr_liste(0)="xxx"
arr_liste(1)="yyy"
arr_liste(2)="zzz"

Det kræver, at man ikke behøver fortælle arrayet, hvor mange elementer der er i det, men det kan man så ikke, kan jeg forstå.
Avatar billede kriskrisk Nybegynder
02. juni 2005 - 17:13 #10
Martin: Med kabbak's forslag, skal der tilføjes tre linjer pr. nyt element. Det samme ser ud til at være tilfældet for dit forslag, hvis jeg forstår det rigtigt:

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Æbler"

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Pærer"

i = UBound(Myarray) + 1
ReDim Preserve Myarray(i)
Myarray(i) = "Bananer"

Er det ikke rigtigt forstået?

Det skal bruges til en person med begrænsede programmeringsevner, der gerne ville have det meget nemt at opdatere. Der mener jeg, at mit eget forslag:

liste="xxx"
liste=liste & "," & "yyy"
liste=liste & "," & "zzz"

arr_liste=split(liste,",")

osv.

...er lettere at tilføje et nyt element, da personen blot skal tilføje et nyt liste=liste & "," & "kkk" under de andre, og så kører det. Han ville gerne have, at han blot kunne tilføje

arr_liste(3)="kkk"

under

arr_liste(0)="xxx"
arr_liste(1)="yyy"
arr_liste(2)="zzz"

Det kræver, at man ikke behøver fortælle arrayet, hvor mange elementer der er i det, men det kan man så ikke, kan jeg forstå.
Avatar billede bak Seniormester
04. juni 2005 - 11:44 #11
Man kan sagtens gøre som du beskriver, kriskrisk.
Et alternativ er her. kræver 2 linier. Arrayet er dimensioneret tilpas stort og først efter at alle elementer er lagt ind, bliver de redimensioneret igen.

Sub ArrayInput()
Dim arr_liste()
ReDim arr_liste(100)
arr_liste(i) = "xxx"
i = i + 1
arr_liste(i) = "yyy"
i = i + 1
arr_liste(i) = "zzz"
i = i + 1
arr_liste(i) = "kkk"

ReDim Preserve arr_liste(i)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester