Når jeg looper og finder data der matcher mine kriterier, så kender jeg oftest ikke størrelsen på arrayet, fordi der først er efter gennemløbet jeg kender mængden at data der matchede.
Her er et eksempel, som fylder dit array med cellerne A1 til A10
Sub test()
Dim MyArray(10) As Integer
For i = 1 To 10 MyArray(i) = Cells(i, 1) Next
End Sub
Du kan placere de betingelser du ønsker inde i for-loopet. Option base 1, betyder at dit array starter fra 1 og ikke fra 0. Det kan jeg personligt godt lide at bruge.
@Jessen Undskyld, hvis jeg trykte mig dårligt ud...
Jeg har behov for attilføje en data mere til arrayet for hvert loop (hvis nogle kriterier er opfyldt), og derfor kender jeg ikke størrelse på array i forvejen...
Prøv lige at kommereter hvad ddu gør undervej i din kode... 1. Du sætter n til værdien 1 med Range("A1").CurrentRegion.Rows.Count 2. derefter redimentionerer du array til 1 3. så prøver du at løbe arrayet igennem med 10 loops, men den fejler jo allerede i andet loop når arrayet er redimentioneret til 1
MyArray = ThisWorkbook.Sheets("Ark1").Range(Cells(1, 1), Cells(Range("A1").CurrentRegion.Rows.Count, 3)) ' indlæser kolonne A B og C i array, og kun brugte rækker
@Jessen Jeg kan ikke se at dit forslag løser det jeg søger... Jeg har lige omskrevet dit forslag lidt for at se om det er muligt at tilføje en ny tom plads i arrayet med ReDim, for så vil jeg jo ad den omvej kunne tilføje en ny værdi for hvert loop. Når jeg tester med nedenstående kode der anvende ReDim på mit array, så kan jeg konstatere at arrayet mister sine allerede eksisterende værdier. Prøv lige selv at teste både med linien ReDim slået til og fra med kommentartegnet '
Sub TestAddToArray1()
Dim MyArray() As Variant Dim ArrayCount As Integer MyArray = Array("Apples", "Bananas", "Oranges", "PineApples")
ArrayCount = UBound(MyArray, 1)
'ReDim MyArray(ArrayCount + 1) ' tilføjer en ekstra plads i MyArray
MsgBox "Array har nu størrelsen " & UBound(MyArray, 1) & " startende med index 0"
For i = 0 To UBound(MyArray, 1) MsgBox "Værdi på arryets nøgle " & i & " er " & MyArray(i) Next i
Det er rigtigt, at redim tømmer dit array. Jeg troede, at du kunne sætte størrelsen til en start, og så ville det virke.
Hvis du skal ændre størrelse efter dit array har fået data, skal du skrive "ReDim Preserve" i stedet for blot "Redim". Så skulle dit array beholde sit indhold.
Måske: Indsætte "de relevante data" i en String variabel m/skilletegn efter "hver match". Når udtræk er afsluttet - Split tekststrengen via skilletegnet i en variabel af typen Variant. Ubound(Varianten) som mål for antal elementer.
Ja det ændrede jo det hele at vi fik ændret ReDim til ReDim Preserve.
Nu lykkes det at udvide arrayet med en ekstra plads uden at miste oprindelige data. Det betyder at jeg kan gøre det "on the fly" når jeg looper data igennem. Alletiders.
Min lille test-procedure kommer derfor til at se således ud.
Sub TestAddToArray1()
Dim MyArray() As Variant ' erklærer mit array Dim ArrayCount As Integer MyArray = Array("Apples", "Bananas", "Oranges", "PineApples") ' og lægger data i mit array
ArrayCount = UBound(MyArray, 1) ' måler størrelsen på mit array MsgBox "oprindelig størrelse på Array er " & ArrayCount & " startende med index 0"
ReDim Preserve MyArray(ArrayCount + 1) ' udvider med en ekstra plads i MyArray
MsgBox "Array har nu størrelsen " & UBound(MyArray, 1) & " startende med index 0" For i = 0 To UBound(MyArray, 1) MsgBox "Værdi på arryets nøgle " & i & " er " & MyArray(i) Next i
vba er 20 år gammelt og meget low-level simpelt. Det betyder ikke så meget når man anvender de office objekter der løser opgaven (som cells og range i excel), men når det kommer til arrays er det værd at efterligne de features fra andre sprog der fungerer på et højere nivea. Eksempelvis javascripts 'push'
Først en function der returnere strengrepræsentationen af arrayet - til testudskrift i immediate vinduet - der arbejdes med 1 dimensionelle men potentielt ragged arrays (array indhold kan være arrays - også recursivt)
Function arr2str(arr, Optional indent = 0) ´´´´Dim i, ai ´´´´For Each i In arr ´´´´´´´´If IsArray(i) Then ´´´´´´´´´´´´arr2str = arr2str & arr2str(i, indent + 1) ´´´´´´´´Else ´´´´´´´´´´´´arr2str = arr2str & "n" & indent & "> " & Space(4 * indent) & i & vbCrLf ´´´´´´´´End If ´´´´Next End Function
Sub push(V, i, Optional rLevel = 0) ´´´´Dim ai ´´´´If IsArray(i) And (rLevel <> 0) Then ´´´´´´´´For Each ai In i ´´´´´´´´´´´´push V, ai, rLevel - 1: Next ´´´´Else´´´´ ´´´´´´´´If IsEmpty(V) Then V = Array() ´´´´´´´´ReDim Preserve V(UBound(V) + 1) ´´´´´´´´If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i ´´´´End If End Sub
Function flatArray(jaggedThing) ´´´´push flatArray, jaggedThing, -1 End Function
Med disse: Function test1() ´´´´push test1, 3 ´´´´'other codelines ´´´´push test1, "små" ´´´´push test1, "kinesere" End Function
Function test2() ´´´´Dim myVar ´´´´'VIGTIGT - DIMENSIONSLØST ARRAY - ikke myVar() ´´´´push myVar, 3 ´´´´push myVar, Array("små", "kinesere") ´´´´test2 = myVar End Function
Nu hvor jeg vil bruge det i praksis har jeg krerert min egen function til at måle arrayets størrelse, tilføje en post og smide en værdi ind på den tilføjede post.
Function AddToArray(MyArray() As Variant, Addition As String) ' function der modtager et enkeldimentionelt array og tilføjer en post hvori der smides en tekststreng
Dim ArrayCount As Integer
ArrayCount = UBound(MyArray, 1) ' måler størrelsen på mit array
ReDim Preserve MyArray(ArrayCount + 1) ' udvider med en ekstra plads i MyArray
MyArray(ArrayCount + 1) = Addition ' smider den tekststreng der skulle tilføjes ind på sidste plads
AddToArray = MyArray
End Function
Og i proceduren herunder laver jeg først mit array med 4 poster (strings), hvorefter jeg med min egen function udvider arrayet med en post og tilføjer en ekstra post.
Sub TestAddToArray()
Dim MyArray() As Variant Dim ArrayCount As Integer MyArray = Array("Apples", "Bananas", "Oranges", "PineApples") Dim InsertValue As String
ArrayCount = UBound(MyArray, 1) InsertValue = "FruitNr_" & 5 ' sammensætter den værdi jeg vil tilføje til arrayet
MyArray = AddToArray(MyArray, InsertValue) ' her laver jeg functionskaldet hvor jeg tilføjer en post
'herunder løber jeg lige arrayet igennem og svarer med en msgbox på hvad hver enkelt post indeholder For i = 0 To UBound(MyArray, 1) MsgBox "Værdi på arryets nøgle " & i & " er " & MyArray(i) Next i
Undskyld. der skal vist et nyt batteri i mit tastatur. der skulle stå: Jeg forstår det blot ikke til bunds, men måske det skyldes at jeg aldrig er blevet helt fortrolig med immediate-vinduet...
Det er vist ikke batteriet (mit tastatur er jo ikke trådløst). Jeg tror snarere det er den javascript-baserede formular som vi skal skrive vores kommentarer i, der driller.
En eller anden måde at nedbryde til mindre dele og teste disse isoleret, er en del af at programmere. Funktion arr2str bruges i #12 til udskrift af et array i immediate vinduet - på den måde kan array test resultater vises I Excel kan man også udskrive til celleområder, men det er enklere at småtest udskrive til immediate (dansk: brugerudtryk) vinduet og kodelinierne illusterer enklere hvad der sker. Jeg kan se at jeg har gjort det sværere at forstå, ved at give en vis kontrol med tilføjelse af array's til array -jeg ku ikke lade være ;) Bemærk at jeg bruger funktionsnavnet som eneste variabel - denne returnere et array med elementerne 1, 2 og 3.
Function f() f=array(1,2,3) End Function
eller
Function f() push f,1 push f,2 push f,3 End Function
?f()(1),ubound(f()) 2 2
Synes godt om
Ny brugerNybegynder
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.