VBA (voor gevorderden, denk ik)

Status
Niet open voor verdere reacties.

flbos

Gebruiker
Lid geworden
5 feb 2004
Berichten
267
Hallo,

Onderstaande code is bedoeld om steeds het
voortschrijdend gemiddelde te berekenen van de waarden in de kolom t7omzet van vier opeenvolgende rijen (dus (rij1+rij2+rij3+rij4)/4 dan (rij2+rij3+rij4+rij5)/4 enz.) In rij 4 komt nu in de kolom t7vsgem de gemiddelde omzet uit rij 1 tot en met 4.

De werking van de code, hiermee kom ik ook meteen op mijn vraag, is als volgt:

Ik hoop dat ik het goed verwoord: je loopt als het ware record voor record door de tabel en rekent met waardes uit voorgaande records door deze steeds in variabele op te slaan. Mijn vraag is nu of ik op een of andere manier ook kan rekenen met waardes uit nog komende records (dus records die verder liggen dan de huidige record). Deze kun je met code zoals die hieronder denk ik niet opslaan in variabelen, omdat de records de revue nog niet zijn gepasseerd. Is er een manier om wel met 'nog komende records' te rekenen?

Ik zou bijvoorbeeld in rij3 het gemiddelde van de kolom 't7omzet' van de rijen 1 tot en met 4 willen zien (vervolgens in rij 4 het gemiddelde van de rijen 2 tot en met 5 enz.) Het probleem met onderstaande code is dat wanneer je in rij 3 zit de omzet uit rij 4 nog niet bekend is, hoe kom ik hier aan?



Private Sub Knop13_Click()

Dim oRS As DAO.Recordset
Dim dWaarde(3) As Double
Dim k As Long

Set oRS = Application.CurrentDb.TableDefs("t7ompmminpj").OpenRecordset
k = 0

With oRS
Do While Not .EOF
dWaarde(k) = !t7omzet
.Edit
!t7vsgem = (dWaarde(0) + dWaarde(1) + dWaarde(2) + dWaarde(3)) / 4
.Update

k = (k + 1) Mod 4
.MoveNext
Loop
End With

Set oRS = Nothing

End Sub
 
array gebruiken

Beste flbos,

Ik zie als oplossing twee keer door de recordset te lopen. De eerste keer van het begin tot het einde loop je alles langs en verzamel je de waarden in een array, je slaat alle waarden op in een array.

Dan terug naar het begin, en dan van boven naar beneden en komt het moment van schrijven naar het record.

------------------------------------------------------------------

Private Sub cmdOK_Click()

Dim oDB as DAO.Database
Dim oRS As DAO.Recordset
Dim dWaarde(3) As Double
Dim k As Long
Dim lngAantal as Long
Dim adblWaarden() as Double
Dim lngCounter as Long

Set oDB = CurrentDB()
Set oRS = oDB.OpenRecordset ("t7ompmminpj")
k = 0

With oRS

.MoveLast
lngAantal = .RecordCount
Redim adblWaarden(1 to lngAantal)

' Waarden verzamelen
.MoveFirst
For lngCounter = 1 to lngAantal
adblWaarden(lngCounter) = !t7omzet
.MoveNext
Next

' Waarden schrijven
.MoveFirst
For lngCounter = 1 to lngAantal
.Edit
' Dit stukje is rekenen met inhoud van de array - even goed uitzoeken en proberen en experimenteren
!t7vsgem = (_
adblWaarden(lngCounter-3) + _
adblWaarden(lngCounter-2) + _
adblWaarden(lngCounter-1) + _
adblWaarden(lngCounter-0) ) / 4
.Update
.MoveNext
Next

End With

Set oRS = Nothing
Set oDB = Nothing

End Sub

------------------------------------------------------------------

Succes.
 
Bedankt voor de reactie! Ik ga eens een poging wagen om deze code te gebruiken binnen mijn programma. Het is goed om te horen dat hetgeen dat ik wil in ieder geval mogelijk is. Dat je er er meteen een oplossing bij geeft is helemaal mooi. Hier was ik zelf nooit op gekomen.
 
Ik heb enige uren besteed aan het epxerimenteren met de code en na het doen van een paar kleine aanpassingen doet ie nu precies wat de bedoeling is. Ook zeer goed te gebruiken voor het maken van voorwaardes waarin velden uit verschillende records worden vergeleken. Ik heb de code zelf eenvoudig uit kunnen breiden voor alle andere berekeningen die ik moet doen. Nogmaals bedankt!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan