• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Er gaat iets fout met resizen en/of vullen van de array

Status
Niet open voor verdere reacties.

Excelbat

Gebruiker
Lid geworden
23 mrt 2012
Berichten
405
Goedemiddag,

Ik ben wat aan het spelen met arrays, en ik heb het idee dat de array niet goed gevuld wordt. Als de array naar rij twee gaat, wordt volgens mij rij één weer leeggehaald?
Of ik doe op het eind van de macro iets niet goed met resizen?
Of misschien zelfs een foutje in redim?
Kan iemand mij een zetje in de goede richting geven?

Code:
Sub VermenigvuldigTest()
Set Selrange = Range("B12:B15")
SN = Selrange.Value

For R = 1 To 4                  'Loopje door B12:B15

Waarde = SN(R, 1)               'Eerste loop: waarde uit B12 = 15
ReDim AR(Waarde, Waarde)
        For I = 1 To Waarde     'Loopje van 1 t/ 15
            AR(R, I) = Waarde   'Hier wordt een 15x de waarde 15 gekopieerd.
        Next I
Next R
    
    ActiveSheet.Cells(11, 3).Resize(UBound(AR), UBound(AR, 2) + 1) = AR

End Sub

Bekijk bijlage ResizeHelpMij.xlsb

Greetz/Excelbat
 
De instructie Redim maakt dat de array wordt gereset.
Mogelijk is een oplossing met Redim Preserve denkbaar, maar onderstaand werkt ook.
Code:
Sub tsh()
    sn = Range("B12:B15")
    
    waarde = Application.Max(sn)
    ReDim ar(waarde, waarde)
    For r = 1 To 4
        For i = 1 To sn(r, 1)
            ar(r, i) = sn(r, 1)
        Next
    Next
    ActiveSheet.Cells(11, 3).Resize(UBound(ar), UBound(ar, 2) + 1) = ar
End Sub
 
Bedankt Timshel,

Duidelijk en helder. Echter twee vragen:
01. ReDim AR(Waarde,Waarde) geeft een bereik van 18x18. Zou in dit geval beperkt kunnen worden tot 4x18 toch?
02. ActiveSheet.cells(11,3) is wat mij betreft cel $C$11. Waarom wordt de array dan 'neergegooid' vanaf $D$12?

Thanx and greetz/Excelbat
 
1. Inderdaad
2. De laagste indices van de array (de LBound) zijn 0. De eerste waarde is dus Ar(0,0) maar de array wordt gevuld vanaf Ar(1,1). De eerste rij en kolom van de array zijn dus leeg.

Je kunt arrays laten beginnen op index 1 met de instructie Option Base 1:
Code:
Option Explicit
Option Base 1

Sub tsh()
    Dim Sn, Ar
    Dim i As Long, r As Long
    
    Sn = Range("B12:B15")
    ReDim Ar(UBound(Sn), Application.Max(Sn))
    For r = 1 To UBound(Sn)
        For i = 1 To Sn(r, 1)
            Ar(r, i) = Sn(r, 1)
        Next
    Next
    ActiveSheet.Cells(12, 4).Resize(UBound(Sn), UBound(Ar, 2)) = Ar
End Sub
 
Omdat het denk ik niet zozeer om een werkende oplossing gaat maar meer over het werken met array's kan ik deze aanbevelen http://www.snb-vba.eu/VBA_Arrays.html;)

Om het binnen het probeersel te houden ook gezien een eerdere vraag die je had over het aanpassen van de grootte van een Array.

Code:
Option Base 1
Sub VermenigTest()
ar = Range("B12:B15")
ReDim ar1(UBound(ar), 1)
For r = 1 To UBound(ar)
    ReDim Preserve ar1(UBound(ar), ar(r, 1))
        For I = 1 To ar(r, 1)
            ar1(r, I) = ar(r, 1)
        Next I
    Next r
    ActiveSheet.Cells(11, 3).Resize(UBound(ar1), UBound(ar1, 2)) = ar1
End Sub
 
Hierom:

Code:
Sub M_snb()
    sn = Range("B12:B15")                        '    leest als 'default' de eigenschap 'value'
    ReDim sp(1 To UBound(sn), 1 To sn(1, 1))      ' lbound=0 (default), tenzij je die explciet aangeeft met '1 To ' of met 'Option Base 1'
    
    For j = 1 To UBound(sp)             '    Loop door de 4 rijen van array sp
       For jj = 1 To UBound(sp, 2)      '   Loop door de 15 kolommen van array sp
           sp(j, jj) = sn(1, 1)          '    plaats 15x de waarde 15
       Next
    Next
        
    ActiveSheet.Cells(11, 3).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub

Met 0 als lbound van 'sp' :

Code:
Sub M_snb()
    sn = Range("B12:B15")                        '    leest als 'default' de eigenschap 'value'
    ReDim sp(UBound(sn)-1, sn(1, 1)-1)      ' lbound=0 (default)
    
    For j = 0 To UBound(sp)             '    Loop per 'rij' van array sp  0 tot 3 ( =4 rijen)
       For jj = 0 To UBound(sp, 2)      '   Loop per 'kolom' van array sp  0 tot 14 ( =15 kolommen)
           sp(j, jj) = sn(1, 1)          '    Plaats 15x de waarde 15
       Next
    Next
        
    ActiveSheet.Cells(11, 3).Resize(UBound(sp)+1, UBound(sp, 2)+1) = sp
End Sub
 
Laatst bewerkt:
@VenA. Redim Preserve werkt alleen als de bronwaarden in B12:B15 oplopen en de array bij iedere stap wordt vergroot.
 
#4. Thanx Timshel. Ik wist dat het iets was dat Ubound begint met 0 (nul). Dank voor je uitleg hoe te beginnen met 1.
#5. Ook VenA bedankt. Ik lees altijd met interesse uw oplossing m.b.t. arrays. Wat betreft de site van SNB: die weet ik te vinden. Maar zoals SNB zelf stelt: VBA is een taal die je moet leren met een grammatica en woordenboek. Haar niveau ligt ergens way beyond university-niveau, en ik zit qua VBA nog ergens op de lagere school. Om de site van SNB volledig te kunnen begrijpen, mis ik wat tussenstapjes. En Helpmij is voor mij de site om stapje voor stapje verder te komen.
#6. SNB bedankt voor uw uitleg en leesbare code. Helpt mij om dit toe te passen in mijn eigen omgeving.

Greetz/Excelbat
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan