[VBA] Waarde in Update-query berekenen in VBA

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Naar aanleiding van mijn voirge topic waar het gebruik van Modulus wordt aangeraden stuit ik op het volgende probleem:
3 velden: tijdinseconden (INT), tijdMinuten (INT), TijdSeconden (INT. Ik zet de tijd in seconden (tijdinseconden) om naar een tijd in minuten:seconden. Dit in 2 velden i.v.m. de latere puntenberekening. Dit is vrij eenvoudig te doen met modulus, nl.:
TijdMinuten = tijdinseconden / 60
TijdSeconden = tijdinseconden MOD 60

Dit geeft een correct resultaat, ware het niet dat modulus niet standaard wordt ondersteund in Access, en dat ik dat dus via een functie in VBA moet doen, waarin modulus wel mogelijk is. Mijn vraag is nu, hoe doe ik dit, ik heb deze code zelf gemaakt maar die werkt helaas niet.
code:
1
2
3
4
5
6
Function Modulus(seconden)
Var seconden
Const deler
resultaat = (seconden MOD deler)
Print resultaat
End Function


Wat doe ik verkeerd, ik roep deze functie aan in de query in de volgende syntax:
code:
1
modulus("tijdinseconden")

De variabele tijdinseconden is variabel omdat de tijd per deelnemers moet worden omgezet en om nu per deelnemer een functie toe te voegen lijkt me toch niet helemaal nodig.

Acties:
  • 0 Henk 'm!

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:46
Twee "eerste gezicht" foutjes:
Haal bij het aanroepen van de functie die aanhalingstekens eens weg, je geeft nu de string "tijdinseconden" mee, da's geen integer.
En ik weet niet, maar misschien is het handig je programma ergens de tip me te geven dat deler 60 is.
Const deler as Integer = 60 will do.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de wijzigingen doorgevoerd en de code iets beter gemaakt, maar nu krijg ik bij het uitvoeren van de Query de fout 'Undefined Functio 'Modulus''', terwijl de functie toch gewoon aanwezig is, en zelfs te kiezen vanuit het 'Build'-menu binnen de Query-bouwer!
Enfin, de code is als volgt:
code:
1
2
3
4
5
6
7
Function Modulus(Var)
Dim Result As Integer
Dim Var
Const Deler As Integer = 60
Result = (var MOD deler)
Print Result
End Function

Is de code fout, of de aanroep (in de updatequery, in het veld 'Update to:'
code:
1
modulus([resultaten]![tijdinseconden])


Waar zit de fout? Ik kom er niet achter.

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 16-07 16:16

ATS

1) Je functie heeft geen type
2) Waarom gebruik je een vaste deler?
3) Var heeft geen type in de declaratie, en wordt daarna opnieuw gedeclareerd.
4) Je kan Result wel printen, maar daarmee komt deze waarde nog niet als resultaat terug
5) In dat vorige topic werdt ook aangeraden één veld te gebruiken voor je tijd, en geen 3

Een betere declaratie zou zijn:
code:
1
2
3
4
Public Function Modulo(Teller As Integer, Deler As Integer) As Integer
  ... (bereken je modulo)
  Modulo = resultaat
End Function

[ Voor 22% gewijzigd door ATS op 20-10-2004 20:55 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

Verwijderd

hm. je teller zou misschien te groot kunnen worden voor een integer, maak er toch maar een long van. verder kunnen we het beperkt houden, aangezien je altijd voor seconden uitrekent, ik zou dus geen deler als argument meegeven. de functienaam modulus vind ik in dit kader ook en beetje te vaag, maar dat is muggezifterij. samenvattend:

code:
1
2
3
function SecondenRest(byval Seconden as long) as integer
  secondenrest=(seconden mod 60)
end function

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verwijderd schreef op 20 oktober 2004 @ 18:00:
[knip]

Dit geeft een correct resultaat, ware het niet dat modulus niet standaard wordt ondersteund in Access, en dat ik dat dus via een functie in VBA moet doen, waarin modulus wel mogelijk is. Mijn vraag is nu, hoe doe ik dit, ik heb deze code zelf gemaakt maar die werkt helaas niet.
[knip]
Welke versie van access gebruik je dan? Zowel in 97 als in 2k kun je MOD gewoon gebruiken als operand in query's en tekstvakken.
Select X mod Y as Z etc

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1