Dimension aanroepen in loop

Status
Niet open voor verdere reacties.

AvantiConLaCapra

Gebruiker
Lid geworden
11 sep 2016
Berichten
44
Hallo,

Ik heb een routine waarin meerdere dimensies worden gedeclareerd met een volgnummer.
Deze worden gevuld en vervolgens in een array gezet.

Voorbeeld idee:

Dim P01 as double
Dim P02 as double
Dim P03 as double
etc..

Array(1,1,1) = P01
Array(1,1,1) = P02
Array(1,1,1) = P03
etc...


Dit is redelijk RSI gevoelig werk als je dit meerdere malen moet toepassen, daarom wil ik graag een loopje maken om de array te vullen.

Bijvoorbeeld:
For i = 1 to AantalDeclaraties
i = format(i,"00")
Array(i,1,1) = Pi
next i

Mijn vraag is nu:
Hoe roep ik de dimensie goed aan zodat de waarde in de declaratie in de array gezet wordt?
 
Hoe vul je jouw P01, P02, .?

wellicht kun je dit overslaan en eea meteen in jouw matrix stoppen
 
Dat is een idee, echter de P01 etc... zijn coördinaten waar ik ook verder mee reken.

Dus:
P01 is 1500
P02 = 3xP01 + 500

Als je dat direct aan een array hangt dan wordt de routine niet echt meer lekker leesbaar.
Daar komt bij dat ik de routine kopieer en aanpas voor een andere berekening.
Deze heeft dezelfde punten maar andere berekeningen.
 
Declareer jouw P as als een matrix:

Code:
Dim P(10) As Double

P(0) = 10
P(1) = P(0) * 3 + 10
'etc

plaats anders eens een voorbeeldbestandje
 
Laatst bewerkt:
Code:
Private Sub DRS_Berekenen_Drukbalk()
Dim STR01X As Double
Dim STR01Y As Double

'Punten links
Dim P01X As Double
Dim P01Y As Double
Dim P02X As Double
Dim P02Y As Double
Dim P03X As Double
Dim P03Y As Double
Dim P04X As Double
Dim P04Y As Double
Dim P05X As Double
Dim P05Y As Double
Dim P06X As Double
Dim P06Y As Double

'Punten rechts
Dim P07X As Double
Dim P07Y As Double
Dim P08X As Double
Dim P08Y As Double
Dim P09X As Double
Dim P09Y As Double
Dim P10X As Double
Dim P10Y As Double
Dim P11X As Double
Dim P11Y As Double
Dim P12X As Double
Dim P12Y As Double

'Driehoeken
Dim SZ01 As Double
Dim AZ02 As Double
Dim OZ03 As Double
Dim AZ03 As Double
Dim AZ04 As Double
Dim SZ05 As Double
Dim AZ06 As Double
Dim OZ06 As Double
Dim AZ07 As Double
Dim OZ07 As Double

'Overige gegevens
Dim HoogteAfgewerktPlafondZoldervloer As Double
Dim RuimteAfwerkingPlafondZoldervloer As Double
Dim DikteRegelAfwerking As Double
Dim DikteAfwerkingPlafond As Double
Dim HoogteDrukbalk As Double
Dim DikteOplegregel As Double
Dim HoogteOplegregel As Double
Dim Hoeklinks As Double
Dim HoogteVerdiepingsvloer As Double
Dim DikteBinnenbeplatingKap As Double

'Gegevens instellen
STR01X = DblCoord(CStr(ARR_C_StramienPunten(1, 1, 1)), "X")
STR01Y = DblCoord(CStr(ARR_C_StramienPunten(1, 1, 1)), "Y")
HoogteAfgewerktPlafondZoldervloer = ARR_Woning(46, 1)
RuimteAfwerkingPlafondZoldervloer = ARR_Woning(48, 1)
DikteRegelAfwerking = 22
DikteAfwerkingPlafond = 8
HoogteDrukbalk = 140
DikteOplegregel = 44
HoogteOplegregel = 95
Hoeklinks = ARR_Woning(51, 1)
HoogteVerdiepingsvloer = ARR_Woning(50, 1)
DikteBinnenbeplatingKap = 12.5

'Berekenen
SZ01 = SZaz(Hoeklinks, DikteBinnenbeplatingKap)
P01Y = 0 - HoogteVerdiepingsvloer + HoogteAfgewerktPlafondZoldervloer + DikteRegelAfwerking + DikteAfwerkingPlafond + HoogteDrukbalk
AZ02 = AZoz(Hoeklinks, STR01Y - P01Y - SZ01)
P01X = STR01X - AZ02
OZ03 = HoogteDrukbalk + DikteRegelAfwerking
AZ03 = AZoz(Hoeklinks, OZ03)
AZ04 = AZoz(Hoeklinks, DikteRegelAfwerking)
OZ04 = DikteRegelAfwerking
SZ05 = SZoz(DikteOplegregel, Hoeklinks)
AZ06 = AZsz(Hoeklinks, HoogteOplegregel)
OZ06 = OZsz(Hoeklinks, HoogteOplegregel)
AZ07 = AZsz(Hoeklinks, DikteOplegregel)
OZ07 = OZsz(Hoeklinks, DikteOplegregel)

P06X = P01X - AZ03
P06Y = P01Y - OZ03
P04X = P06X + AZ04 + SZ05
P04Y = P06Y + OZ04
P03X = P04X - OZ07
P03Y = P04Y + AZ07
P02X = P03X + AZ06
P02Y = P03Y + OZ06
P05X = P04X + AZ06
P05Y = P04Y + OZ06

'Punten rechts instellen
P07X = -1 * P01X
P07Y = P01Y
P08X = -1 * P02X
P08Y = P02Y
P09X = -1 * P03X
P09Y = P03Y
P10X = -1 * P04X
P10Y = P04Y
P11X = -1 * P05X
P11Y = P05Y
P12X = -1 * P06X
P12Y = P06Y


'ARR_C_Drukbalk vullen
ARR_C_Drukbalk(1, 1, 1) = P01X & "/" & P01Y
ARR_C_Drukbalk(2, 1, 1) = P02X & "/" & P02Y
ARR_C_Drukbalk(3, 1, 1) = P03X & "/" & P03Y
ARR_C_Drukbalk(4, 1, 1) = P04X & "/" & P04Y
ARR_C_Drukbalk(5, 1, 1) = P05X & "/" & P05Y
ARR_C_Drukbalk(6, 1, 1) = P06X & "/" & P06Y
ARR_C_Drukbalk(7, 1, 1) = P07X & "/" & P07Y
ARR_C_Drukbalk(8, 1, 1) = P08X & "/" & P08Y
ARR_C_Drukbalk(9, 1, 1) = P09X & "/" & P09Y
ARR_C_Drukbalk(10, 1, 1) = P10X & "/" & P10Y
ARR_C_Drukbalk(11, 1, 1) = P11X & "/" & P11Y
ARR_C_Drukbalk(12, 1, 1) = P12X & "/" & P12Y

End Sub

Dit is een voorbeeld bestandje, de methode wordt in meerdere routines toegepast.
Wat ik zoek is dus een methode om herhalende regels voor het vullen van de array in een loopje te doen.
 
Laatst bewerkt:
Ik bedoel dus een Excel-bestandje als voorbeeld,

ipv
Code:
'Punten links
Dim P01X As Double
Dim P01Y As Double
Dim P02X As Double
Dim P02Y As Double
Dim P03X As Double
Dim P03Y As Double
Dim P04X As Double
Dim P04Y As Double
Dim P05X As Double
Dim P05Y As Double
Dim P06X As Double
Dim P06Y As Double

'Punten rechts
Dim P07X As Double
Dim P07Y As Double
Dim P08X As Double
Dim P08Y As Double
Dim P09X As Double
Dim P09Y As Double
Dim P10X As Double
Dim P10Y As Double
Dim P11X As Double
Dim P11Y As Double
Dim P12X As Double
Dim P12Y As Double

gebruik je

Code:
Dim P(1 To 2, 1 To 12) As Double

'waar 1 to 2 staat voor X en Y en 1 to 12 voor de numbering

P06X = "10" wordt dan P(1,6) = "10"

Nu kun je wel een loop gebruiken
 
Ik zal er eens eentje ombouwen, ik hou ervan om e.e.a. overzichtelijk te houden en twijfel of dat op deze manier gaat lukken omdat je dan vanuit array's array's gaat vullen. Maar zoals met alles weet je dat pas als je het probeert :d

Waar ik ook bang voor ben is het geheugen. Ik werk met veel array's en krijg af en toe meldingen dat het geheugen vol zit.
Nu kan dat ook zijn omdat ik er een aantal zeer grote routines in heb zitten. Deze ben ik momenteel aan het opdelen naar meerdere kleinere.
(Momenteel draaien de oude naast de nieuwe routines wat natuurlijk niet helpt qua geheugen)

Overigens gaat het hier om een stukje VBA welke in Access gebruikt wordt, niet in excel :thumb:

Ik twijfelde al of ik deze vraag in Access moest zetten of hier. Omdat het puur om VBA gaat heb ik hem hier neer gezet.
 
Ok Access...

Zoveel benoemde variabelen lijkt me sowieso niet zo efficient,
Dat loopen door de variabelen zoals je in eerste instantie wilde kan niet.
(hoewel daar waarschijnlijk ook wel weer een workaround voor te verzinnen is)

Wellicht kun je het wat simpeler houden door een Array PX te noemen en een andere PY
success iig
 
Thnx,

Ik ga er gewoon eentje proberen en dan blijkt vanzelf of het handig werkt of niet.
Uiteraard kan ik de array voor de P aan het einde van de routine wissen, dus de extra belasting voor het geheugen is maar tijdelijk.

Workarounds zijn altijd wel te bedenken maar safe & simpel heeft mijn voorkeur.

Wat bedoel je met zoveel benoemde variabelen?
Ook teveel aanslag op het geheugen?
 
Laatst bewerkt:
Ter illustructie:

Je hebt aan 2 arrays voldoende.
Wat 'uitgekommenteerd' staat kan weg als in de overige regels de array-elementen zijn ingevoerd (zoals ik in een groot aantal gevallen al voor je gedaan heb).

Ik ben bij dat je van overzichtelijkheid houdt.
Daarvan, noch van volledigheid heb ik iets in je code aangetroffen.

Code:
Sub DRS_Berekenen_Drukbalk()
  ReDim sn(25)

  'Gegevens instellen
  sp = Array(DblCoord(CStr(ARR_C_StramienPunten(1, 1, 1)), "X"), DblCoord(CStr(ARR_C_StramienPunten(1, 1, 1)), "Y"), ARR_Woning(46, 1), ARR_Woning(48, 1), 22, 8, 140, 44, 95, ARR_Woning(51, 1), ARR_Woning(50, 1), 12.5)

  'Berekenen
  SZ01 = SZaz(sp(9), sp(11))
  sn(13) = 0 - sp(10) + sp(2) + sp(4) + sp(5) + sp(6)
  sn(1) = sp(0) - AZoz(sp(9), sp(0) - sn(13) - SZ01)

'  OZ03 = HoogteDrukbalk + DikteRegelAfwerking
'  AZ03 = AZoz(Hoeklinks, OZ03)
'  AZ04 = AZoz(Hoeklinks, DikteRegelAfwerking)
'  OZ04 = DikteRegelAfwerking
'  SZ05 = SZoz(DikteOplegregel, Hoeklinks)
'  AZ06 = AZsz(Hoeklinks, HoogteOplegregel)
'  OZ06 = OZsz(Hoeklinks, HoogteOplegregel)
'  AZ07 = AZsz(Hoeklinks, DikteOplegregel)

  sn(6) = sn(1) - AZ03
  sn(18) = sn(13) - OZ03
  sn(4) = sn(6) + AZ04 + SZ05
  sn(16) = sn(18) + OZ04
  sn(3) = sn(4) - OZsz(Hoeklinks, DikteOplegregel)
  sn(15) = sn(16) + AZ07
  sn(2) = sn(3) + AZ06
  sn(14) = sn(15) + OZ06
  sn(5) = sn(4) + AZ06
  sn(17) = sn(16) + OZ06

'Punten rechts instellen
  sn(7) = -1 * sn(1)
  sn(19) = sn(13)
  sn(8) = -1 * sn(2)
  sn(20) = sn(14)
  sn(9) = -1 * sn(3)
  sn(21) = sn(15)
  sn(10) = -1 * sn(4)
  sn(22) = sn(16)
  sn(11) = -1 * sn(5)
  sn(23) = sn(17)
  sn(12) = -1 * sn(18)
  sn(24) = sn(18) 

  For j = 1 To 12
    ARR_C_Drukbalk(j, 1, 1) = sn(j) & "/" & sn(j + 12)
  Next
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan