Multidimentionale Array uitbreiden voor input

Status
Niet open voor verdere reacties.

AvantiConLaCapra

Gebruiker
Lid geworden
11 sep 2016
Berichten
44
Hallo,

Ik wil een array vullen met informatie welke uit een aantal subroutines komt.
Elke subroutine bepaald een aantal waarden welke hij aan het einde in de array kwijt moet.
Ik heb een subroutine aangemaakt waarin de array gemaakt moet worden maar ik loop al gelijk tegen een probleem aan.

De subroutines die de array moeten gaan vullen kunnen 1 of meerdere rijen gaan vullen in de array.
De array moet daarom eerst worden voorzien van de juiste hoeveelheid rijen.
Omdat er meerdere subroutines zijn die dit doen moeten de reeds aanwezige gegevens niet gewist worden.

De array bestaat uit 6 kolommen en x-aantal rijen.

Ik heb al van alles geprobeerd maar na een aantal uren stoeien krijg ik geen goed beeld van wat ik fout doe.

Heeft iemand een voorbeeldje hoe ik de rijen uit kan breiden voordat ik ze ga vullen?
De subroutine die de rijen gaat toevoegen weet het aantal en kan dit meegeven.
 
Dan maak ik het even visueel :cool:
Onderstaande tabel is hoe de array er uit moet komen te zien:

array.jpg

ID11 wordt gevuld door subroutine 1
ID12 wordt gevuld door subroutine 2
ID13, 14 en 15 worden gevuld door subroutine 3

uit de array (deze tabel) moet een keuze gemaakt gaan worden, in dit geval de laagste som waarbij er een voorkeur is in de kolom uitlijning. (3 gaat voor 1)

Mijn vraag is:
Hoe maak ik een array welke automatisch het juiste aantal rijen toevoegt voordat deze gevuld gaan worden. Zie hiervoor het voorbeeld, ID13,14 en 15 zijn 3 rijen die door 1 subroutine toegevoegd worden.
 
Gelukkig kun je in dit forum gewoon Excelbestanden plaatsen ( inclusief VBA)
 
Code:
Public Sub ZD_ElementIndelingArray(Uitlijning As Integer, AantalPasElementen As Integer, AantalElementen As Integer, AantalSnijpunten As Integer)
Dim SnijPuntenArray   'Uitlijning, aantalpaselementen, aantalelementen, aantalsnijpunten,aantal per type, som

ReDim Preserve SnijPuntenArray(5, UBound(SnijPuntenArray, 2) + 1)

End Sub

Als ik met excel zou werken dan zou dat een goede hulp zijn inderdaad.
Ik werk echter met Access...
Maar goed, ik lees uit je opmerking dat je graag wilt dat ik de code die ik tot dusver heb even toevoeg, bij deze.

Het is niet veel maar dat zou volgens mij ook niet hoeven.
De melding die ik nu krijg is dat typen niet overeen komen.
Ik heb echter geen idee hoe ik dat zou moeten herstellen, als dat het probleem al is.
 
Kijk, zet je zo'n vraag in het Access forum, dan zie ik hem eerder .
Doe de database er maar eens bij, dat praat wat makkelijker.
 
Nou, dat blijkt nog lastig, een voorbeeldje maken... Even een algemene opmerking, op basis van je plaatje dan maar: waarom wil je dit met een matrix doen? Dat kan perfect allemaal met queries en recordsets. Ik hou van moeilijke oplossingen, maar dit is zelfs voor mij een stap te ver :).
 
Ik was van mening dat dit kopje over VBA in zijn algemeenheid ging maar dat heb ik blijkbaar verkeerd ingeschat, mijn excuus!

Ik deel je mening en eerlijk gezegd heb ik het ook al draaien in een tijdelijke tabel, aangesproken door een recordset.
De reden waarom ik dit wil doen is omdat ik vanwege mijn studie een array moest maken en ik dit in mijn huidige werk wilde combineren. Zodoende kwam ik op een vrij complexe array (voor mij in elk geval omdat ik nog nooit met arrays gewerkt heb).
Ik was van mening dat het op een vrij eenvoudige manier gerealiseerd moet kunnen worden maar dat is wat te eenvoudig bedacht zo te lezen :D

De reden waarom ik juist dit in een array wilde proberen is omdat de gegevens van tijdelijke aard zijn. Ze moeten verzameld worden in een array waarna er een sommering plaats moet vinden en het juiste antwoord verder gaat. Daarna kunnen de gegevens weer weg.

Kun je me misschien vertellen wanneer een array wel toepasbaar is? of gebruik je altijd een recordset wanneer je de neiging krijgt een array te gebruiken? :o
 
Ik was van mening dat dit kopje over VBA in zijn algemeenheid ging maar dat heb ik blijkbaar verkeerd ingeschat, mijn excuus!
Daar heb je op zich geen ongelijk in, maar als je de verschillende fora eens bekijkt, dan zul je zien dat 99% van het Excel forum bijvoorbeeld over VBA vragen gaat. Die zouden ook hier naartoe moeten :). En in Word idem dito. Je zou kunnen zeggen dat dit forum bedoeld zou moeten zijn voor algemene vragen over VBA, maar dat is denk ik 'wishful thinking' mijnerzijds.
Kortom: je vraag mag best hier staan, maar vanwege je onderwerp heb ik 'm in eerste instantie laten lopen. En in het Access forum (waar dus ook 80% over VBA gaat) had ik 'm gelijk opgepakt. Dat was de reden van mijn opmerking.

Ik gebruik zelf array's als ik gegevens uit een Excelsheet o.i.d. in moet lezen. En als ik data uit een keuzelijst moet bewerken bijvoorbeeld. Maar het soort array dat jij nu wilt maken, is in essentie niks anders als een recordset, en daar kun je ook nog eens veel meer mee doen ook (met de recordset). Als je het tóch met een array wilt proberen, doe er dan een database bij met data zodat we wat hebben om mee te werken :).
 
Duidelijk :thumb:
Ik zal er voortaan op letten dat ik in het access forum mijn berichten plaats.

Dat is nou juist de truck, de array zou moeten worden gevuld vanuit een subroutine, niet vanuit een tabel...

Maar waar ik tegen aan liep waren meldingen die ik niet kon plaatsen, ik zal een voorbeeld geven:

Code:
        Dim intArray(10, 10, 10) As Integer
        ReDim Preserve intArray(10, 10, 20)
        ReDim Preserve intArray(10, 10, 15)
        ReDim intArray(10, 10, 10)

bron: https://msdn.microsoft.com/en-us/library/w8k3cys2.aspx

Dit is een voorbeeld van een multidimensionale array die je kunt wijzigen in grootte (redim) waarbij de aanwezige data blijft bestaan (preserve)
Pas ik dat toe:

Code:
Public Sub ElementAfmetingenArray()
Dim ElementAfmetingArray() As Integer
ReDim Preserve ElementAfmetingArray(10, 20)
End Sub

dan krijg ik de melding: "Array already dimensioned"

In tegenstelling tot een paar dagen geleden lees ik nu de help wel goed :o en zie ik dat je alleen een redim kunt doen als je een array geen grootte meegeeft bij het dimensioneren. Dat maakt hem namelijk statisch.
bron: https://msdn.microsoft.com/en-us/library/office/gg278891(v=office.15).aspx

De code in post 5 had ik de dimensie ook niet opgegeven maar had ik de haakjes () niet geplaatst achter de array -detail- :confused:

Kortom, in het voorbeeld staat dus onterecht dat je een statische array kunt wijzigen in grootte en heb ik weer eens een aantal uren verspeeld aan een typefout :rolleyes:
 
Met de kennis van zojuist de array even gemaakt. Het is flauwekul aangezien ik de array vul met gegevens uit een tabel maar goed, het gaat mij er om dat ik weet hoe een multidimensionele array werkt :d (en misschien heeft iemand anders hier wat aan uiteraard)

dit is hem geworden:
Code:
Public Sub ElementAfmetingenArray()
Set db = CurrentDb
Dim RS1 As Recordset
Set RS1 = db.OpenRecordset("tbl_element")
Dim ElementAfmetingArray() As Integer
Dim Bericht As String

RS1.MoveLast
RS1.MoveFirst

If Not RS1.EOF Then
For i = 1 To RS1.RecordCount
    ReDim Preserve ElementAfmetingArray(3, i)
    ElementAfmetingArray(1, i) = RS1!ElementLocatie
    ElementAfmetingArray(2, i) = RS1!Elementbreedtestraanzicht
    ElementAfmetingArray(3, i) = RS1!ElementLengtestraanzicht
    RS1.MoveNext
Next i
Else
End If

Bericht = "Nr: " & "Lengte: " & "Breedte: " & vbCrLf
For j = 1 To UBound(ElementAfmetingArray, 2)
Bericht = Bericht & Format(ElementAfmetingArray(1, j), "00") & ":  " & ElementAfmetingArray(2, j) & " - " & ElementAfmetingArray(3, j) & vbCrLf
Next j

MsgBox Bericht, vbInformation, "Afmetingen elementen"

'Recordset sluiten
RS1.Close
Set RS1 = Nothing
Set db = Nothing


End Sub

Met als resultaat:
array msgbox.jpg

Ik zou hem nu aan toe kunnen passen in mijn routines, ik weet alleen niet of ik dat ga doen aangezien het al werkt met een tabel :cool:
Ik hou hem zeker even paraat voor de toekomst :thumb:
 
Laatst bewerkt:
Je zal vast ook al wel bedacht hebben dat het nog wat slimmer kan...
Code:
Public Sub ElementAfmetingenArray()
Dim RS1 As DAO.Recordset
Dim arr() As Integer, i As Integer
Dim Bericht As String

    Set RS1 = CurrentDb.OpenRecordset("tbl_element")
    With RS1
        .MoveLast
        .MoveFirst
        ReDim Preserve arr(3, .RecordCount)
        Do While Not .EOF
            arr(1, i) = !ElementLocatie
            arr(2, i) = !Elementbreedtestraanzicht
            arr(3, i) = !ElementLengtestraanzicht
            i = i + 1
            .MoveNext
        Loop
    End With
    Bericht = "Nr: " & "Lengte: " & "Breedte: " & vbCrLf
    For j = LBound(arr) To UBound(arr)
        Bericht = Bericht & Format(arr(1, j), "00") & ":  " & arr(2, j) & " - " & arr(3, j)
        If Not j = UBound(arr) Then Bericht = Bericht & vbCrLf
    Next j
    MsgBox Bericht, vbInformation, "Afmetingen elementen"

End Sub
 
Netjes, thnx!

Ik programmeer pas sinds kort en hou me voornamelijk nog bezig op de functionaliteit. Langzamerhand leer ik mezelf wel aan om korter en netter te schrijven maar prioriteit heeft het nog niet.
Dit was wel een reden om een array te gebruiken omdat dit sneller zou werken dan een tabel en minder geheugen in beslag zou nemen.

In jouw code stel je nergens i = 1. Dit is niet noodzakelijk?
 
In jouw code stel je nergens i = 1. Dit is niet noodzakelijk?
Dat heb je alleen nodig als je Option Base 1 gebruikt. In dat geval begint een array vanaf 1 te tellen, anders is de eerste waarde in de array altijd 0. En een integer die je dimt begint ook op 0. Vandaar dat de regel i=i+1 ná het vullen staat. Als je Option Base 1 wél gebruikt, moet die regel dus naar boven worden verplaatst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan