Een teller aan een variabele koppelen

Status
Niet open voor verdere reacties.

Gaitie

Gebruiker
Lid geworden
20 mei 2012
Berichten
12
Code:
Option Compare Database
Option Explicit

Public Function WeekNrChecker()
With Screen.ActiveForm

    ' Declareer de variabelen...
    Dim strWeekNr As String
    Dim strMaandag As String
    Dim strDinsdag As String
    Dim strWoensdag As String
    Dim strDonderdag As String
    Dim strVrijdag As String
    Dim strZaterdag As String
    Dim strZondag As String
    Dim t As Integer
    Dim Teller As Integer
    
    ' Stel de weekteller in op week 1
    t = 0
    
    ' Stel de tellers in.
    For Teller = 1 To 10
    
    ' Tel week bij week op...
    t = t + 1
    
    strWeekNr = CStr("[" & "WeekNrWk" & (t) & "]")
    strMaandag = CStr("[" & "MaandagWk" & (t) & "]")
    strDinsdag = CStr("[" & "DinsdagWk" & (t) & "]")
    strWoensdag = CStr("[" & "WoensdagWk" & (t) & "]")
    strDonderdag = CStr("[" & "DonderdagWk" & (t) & "]")
    strVrijdag = CStr("[" & "VrijdagWk" & (t) & "]")
    strZaterdag = CStr("[" & "ZaterdagWk" & (t) & "]")
    strZondag = CStr("[" & "ZondagWk" & (t) & "]")
    
        ' Verberg de urenvelden als er geen weeknummer is ingevuld.
    If !strWeekNr.Value = 0 Then
        !strMaandag.Enabled = False
        !strDinsdag.Enabled = False
        !strWoensdag.Enabled = False
        !strDonderdag.Enabled = False
        !strVrijdag.Enabled = False
        !strZaterdag.Enabled = False
        !strZondag.Enabled = False
        
    ' Presenteer de urenvelden als er een weeknummer is ingevuld.
    Else:
        !strMaandag.Enabled = True
        !strDinsdag.Enabled = True
        !strWoensdag.Enabled = True
        !strDonderdag.Enabled = True
        !strVrijdag.Enabled = True
        !strZaterdag.Enabled = True
        !strZondag.Enabled = True
    End If
    
    DoEvents
    Next Teller
    
End With
End Function

Uitleg:
Deze code staat geschreven in een aparte Module.

Doel van het programma:
Controleren of de week nummers aan het begin van de rij (in het fomulier "ProjectUrenBoeken") zijn ingevuld.
Zo ja, "Enabled" de gekoppelde velden van die week. Zo nee, "Disable" deze velden dan.
Herhaal de deze stappen 10x (tien weken). Met andere woorden herhaal de zelfde stappen tien keer, maar hoog dan telkens de week-rij een stap hoger.

Probleem:

Doordat ik i.p.v.
Code:
![B][WeekNrWk1][/B].Value = 0
de variabele strWeekNr gebruikte hoopte ik dat ik op deze wijze automatisch de juiste tekstvelden kon benaderen. Maar helaas krijg ik steeds de melding: Fout 2465 tijdens uitvoering: Kan het veld strWeekNr niet vinden waarnaar wordt verwezen in de expressie.
Heeft iemand een idee hoe ik dit kan oplossen?

Alvast bedankt.
 
Maak eens een voorbeeldje; ik zie wel een paar beren op de weg liggen, maar sta niet te popelen om de situatie na te moeten bouwen :)
Liefst in 2003 format, dan kan ik er vandaag nog even naar kijken. Anders wordt het vanavond.
 
@ OctaFish: wat ben je ben je precies nodig en hoe moet ik het aanleveren?
 
Je hebt het over een formulier; dat dus in ieder geval. Daar zit vast een tabel achter, dus die ook. Eigenlijk moet alles in de db zitten wat nodig is om het probleem te reproduceren. Zonder gevoelige informatie uiteraard, en er hoeven ook maar een paar testrecords in de tabel te zitten. Liefst dus opgeslagen als Access 2003 db.
 
Ik zal kijken of ik dat voor elkaar kan krijgen. De database hangt met een aantal relaties aan elkaar. Ik kom er zo spoedig mogelijk op terug.
 
Bekijk bijlage TestDatabase.zip Ik kan helaas niet omzetten naar een andere versie. Ik gebruik op dit moment MS Office 2010. Alles wat je nodig zou moeten zijn zit in de database. Als de form "Urenbewaking" geopend word dan kan je een fout melding krijgen dat er geen 'active-form' is geladen. Gewoon even een keer omschakelen naar ontwerp modus en weer terug, Dan moet het goed gaan. Verder zul zodra je het eerste veld van de weeknummer wijzigt de foutmelding tegen komen.

Ik ben benieuwd...
 
Zal er vanavond een blik op werpen :)
 
Ik heb zelden zo'n slecht genormaliseerde database gezien, en ik raad je aan daar nog eens heel goed over na te denken, want ik zou 'm zo absoluut niet willen hebben. Maar het is jouw db ;)
Je code is dan ook dientengevolge vele malen moeilijker dan noodzakelijk. Maar hij doet 't weer. Overigens klopten je tekstvakken ook niet, dus daar liep hij ook nog eens op stuk. Maar dat was een kwestie van de naam aanpassen. Maar oei, wat zou ik deze niet graag hoeven te onderhouden :)
 

Bijlagen

@ OctaFish: Bedankt :thumb:, voor het aanpassen van de code en ja de database is op dit moment nog een zooitje :o (wordt aan gewerkt).

Maar mijn bedoeling was om de code die je nu direct aan het formulier hebt gekoppeld om die in een module te plaatsen voor eventueel hergebruik of onderhoud ( en eventuele fout controle ?).

(off topic)
Ik probeer de vaardigheden van Access in combinatie met VBA via zelfstudie (en door keihard op je b..k te gaan ;)) onder de knie te krijgen, dus excuses als sommige code niet helemaal volgens de voorgeschreven regels is opgebouwd. Maar ik heb ook gezien, door te kijken naar voorbeelden van anderen, dat er verschillende soorten 'stijlen' van programmeren zijn en ik ben nog zoekende wat mijn stijl uiteindelijk zou gaan worden. Grappig detail vond ik dat je geen gebruik maakt van pseudocode. Dat zal wel met routine en ervaring te maken hebben denk ik? Overigens tips zijn altijd welkom :).

(on topic)
Bijvoorbeeld hoe zorg je er nu voor dat je aan de betreffende module duidelijk maakt in welk formulier de gegevens gezet moet en vooral de manier van notatie let wel dus een soort en met van universeel :confused:
Ik gebruikte bijvoorbeeld: Screen.ActiveForm om zo aan de betreffende module duidelijk te maken om welk formulier het gaat en zo kon ik mijn code ook universeel houden.

Maar misschien wil ik te veel en is access niet geschikt om met met modulen te werken...(?) :confused:

Alvast bedankt.
 
Access is prima geschikt om met modulen te werken; sterker nog: elk formulier heeft een eigen module! Dat ik je procedure naar het formulier heb verplaatst, is niet omdat de procedure niet meer werkt als je hem in een eigen module zet (probeer maar, je zult zien dat hij nog steeds werkt) maar omdat je procedure in mijn ogen niet geschikt is om als algemene procedure te dienen.
De reden is simpel: jouw formulier is overduidelijk specifiek gemaakt voor één doel (namelijk dat ene formulier), en de code daarin spreekt ook hele specifieke tekstvakken van dat formulier aan (zoals !strWoensdag.Enabled = False). Die code is dus alleen voor andere formulieren te gebruiken als die exact dezelfde tekstobjecten bevatten. Zijn die er niet, dan loopt je code de soep in. Dat houdt dus in, dat je code eigenlijk alleen maar werkt op een kopie van hetzelfde formulier. En waarom zou je dat doen?

Werken met Screen.Activeform raad ik af; dat is uiterst onbetrouwbaar, omdat je (al denk je blijkbaar van wel) maar moeilijk controle hebt over wat er daadwerkelijk actief is in je database. Voor je het weet zit je een ander formulier te bewerken. Mijn code is wèl universeel, omdat ik in de procedure een variabele vraag, die wordt meegegeven bij het starten van de procedure. Dat gebeurt dus op deze manier:

Code:
Public Function WeekNrChecker(frm As Form)
With frm
En je geeft het formulier mee met deze aanroep:
Code:
Call WeekNrChecker(Me)
Dus nu heb je een waterdichte constructie: op het moment dat je de functie aanroept, geef je het actieve formulier mee als parameter. De functie neemt die parameter over en gebruikt hem verder om de code uit te voeren.
Zoals gezegd: omdat jouw code dermate specifiek is geschreven voor één formulier, heeft het geen zin om hem algemeen te maken. Daarom heb ik dus de code verplaatst naar het formulier zelf.
 
@ OctaFish: Bedankt voor de helder uitleg. Ik weet nu waar ik de mist ben in gegaan :o , maar zou je me tot slot nog een ding kunnen uitleggen?
Ik had twee programma's naar je gestuurd eentje genaamd TitelMaker en de andere WeeknummerChecker. Zoals je aangaf heb ik de beide programma's (om te testen) weer in een module geplaatst om te zien hoe dat werkt. Echter het programma TitelMaker deed het wel maar, WeekNummerChecker niet. Ik krijg dan de fout melding: een oneigenlijk gebruik van 'Me'. En toen ik de code die je had aangepast eens bekeek viel mij op dat als je verwijst naar een object in een formulier bij TitelMaker een notatie gebruikte:
Code:
strProjectNm = ![NaamProject].Value
en bij de andere:
Code:
Me(strMaandag).Enabled = False
Komt dat omdat er bij de eerste code er waardes worden geretourneerd en bij de andere eigenschappen van het veld worden gemanipuleerd? Of had de had de tweede code ook geschreven kunnen worden zo iets als:
Code:
!(strMaandag).Enabled = False
In mijn beleving word er in beide codes het zelfde gedaan namelijk een bepaald tekstveld aanwijzen. Alleen word het veld bij code 1 als variabele geschreven en bij de ander word het veld letterlijk genoemd. Dus [NaamProject].Value is gelijk aan (strMaandag).Enabled ?

Alvast bedankt.
 
Me gebruik je op Objectmodules; je verwijst namelijk naar het onderliggende object. Als de code op de module van het formulier staat, is het onderliggende object dus automatisch het formulier. Zet je de code in een algemene module, dan is er geen onderliggend object. En geeft Me dus een foutmelding.
 
@ OctaFish: Goed dus dat verklaard dus telkens die melding 'Me'-melding. Ik ga er mee aan de slag en nogmaals bedankt voor je hulp :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan