Access 2013, formuliernaam doorgeven aan functie in module.

Status
Niet open voor verdere reacties.

hausi

Gebruiker
Lid geworden
17 jan 2010
Berichten
84
Hallo,

Ik zit al drie dagen te worstelen met een probleem om een formuliernaam door te geven aan een functie in een module.
Ik moet denk ik, eerst de opbouw van de formulieren uitleggen.
Als eerste heb ik een Hoofdformulier (frmHoofdMenu), dat is een navigatieformulier en, voor de duidelijkheid, geen tabcontrol.
Onder een van de navigatie tabs heb ik een formulier (frmHeadsetLuboBezetting) dat één subformulier (sfrmHeadSets) bevat, dat moeten er uiteindelijk drie worden dus deze opbouw is noodzakelijk.
sfrmHeadSets is niet afhankelijk en dus de besturingselementen ook niet. Als ik het formulier open door op de Navigatie Tab te klikken start een query die de besturingselementen vult met het laatste record uit de tblHeadSets.

Als een headset de status "Uitgeleend" heeft, wordt het naastgelegen besturingselement, "txtOmschrijving", ge-enabled en is het verplicht daar een naam in te vullen. Op het moment dat je de status van een andere headset wilt wijzigen, volgt er direct een controle of je het verplichte veld hebt ingevuld.
De code die in het sfrmHeadSets de functie aanroept is deze:
Code:
Private Sub cboStatus1_Enter()
Call CheckControls(Me) 'Me is de formuliernaam

End Sub

De functie zelf beperkt zich tot het controleren van de besturingselementen txtOmschrijving+nummer:
Code:
Public Function CheckControls(frm As Form)
Dim NumOmschr As String

For i = 1 To 9
NumOmschr = "[txtOmschrijving" & i & "]"
    With frm.Controls(NumOmschr)
        If .Tag = 1 Then
            If .Value = "" Or IsNull(.Value) Then
                MsgBox "Je hebt een headset uitgegeven" & vbNewLine & "zonder de naam in te vullen"
                .SetFocus
                Exit Function
                Else
                    TempVars!Leeg = 0
            End If
        End If
    End With
Next i

End Function
Dat werkt allemaal uitstekend.

Ik wil graag dat, als er op een andere Navigatie Tab wordt geklikt, het record wordt opgeslagen of bijgewerkt in de tabel zodat er niet een knop met "Opslaan" op het formulier geplaatst hoeft te worden.
Ik hoop dat het tot zover duidelijk is.

Op het moment van klikken op een andere Navigatie Tab moet er weer een validatie volgen omdat de status op "Uitgeleend" kan worden gezet zonder een naam in te vullen, en het record dan wordt opgeslagen zonder naam.
Hier beginnen de problemen.
Ik onderschep de gebeurtenis klikken op de navigatieknop en wil dan de validatie uitvoeren en de formuliernaam meegeven aan de functie, maar ik werk op dat moment niet in het sfrmHeadSets en kan dus niet "Me" gebruiken.

De code die ik dacht dat zou werken is:
Code:
Private Sub navFormulieren_Enter() 'navFormulieren is een Navigatie Tab
If TempVars!Leeg = 1 Then 'Deze variabele wordt gezet op het moment dat de status verandert naar "Uitgeleend"
    Dim frm As Form
    Dim sName As String
    Set frm = Form_sfrmHeadSets
    sName = frm.Name
    Call CheckControls(sName)
End If
Maar dat geeft de volgende foutmelding:

Fout.JPG

Ik heb me helemaal suf gezocht op het internet maar kan de oplossing niet vinden, ik hoop dat iemand hier een oplossing voor mijn probleem heeft.
Alvast bedankt voor het meedenken.
 
Dit
Code:
      Set frm = Form_sfrmHeadSets
Gaat nooit werken. Daar zou je dit van moeten maken:
Code:
      Set frm = Forms!sfrmHeadSets
 
Hoi OcfaFish,

Ik heb de door jou voorgestelde wijziging aangebracht en krijg dezelfde foutmelding.
Ik heb inmiddels al zoveel geprobeerd dat ik door de bomen het bos niet meer zie.
Ik heb sterk het idee dat het probleem erin zit dat het subformulier waarnaar ik verwijs niet geopend is.
En ook het gebruik van een navigatieformulier is een issue denk ik.

Ik begin langzamerhand wanhopig te worden :-|
 
In geval van wanhoop: post een voorbeeldje, dan kunnen we veel beter helpen :).
 
Als je mij je email kunt PM'en dan stuur ik je de DB

Groeten,
Hans
 
Pffffffff, ik denk dat ik het eindelijk heb gevonden.

In plaats van
Code:
Private Sub navFormulieren_Enter() 
If TempVars!Leeg = 1 Then
    Dim frm As Form
    Dim sName As String
    Set frm = Form_sfrmHeadSets
    sName = frm.Name
    Call CheckControls(sName)
End If

End Sub

heb ik de volgende code gebruikt
Code:
Private Sub navFormulieren_Enter()
If TempVars!Leeg = 1 Then 
    Dim frm As Form
    Set frm = Forms![frmHoofdMenu].[Form]![NavigatieSubformulier].[Form]![sfrmHeadSets].[Form]
    Call CheckControls(frm)
End If

End Sub

Je ziet onmiddellijk het verschil, het is de verwijzing naar het formulier die ik in het geheel heb aangegeven.
Daarbij is het belangrijk te weten dat ![sfrmHeadSets].[Form] essentieel is, je kunt bijvoorbeeld niet [Form] vergeten anders komen de typen niet overeen.
door die foutmelding kwam ik op het idee.
Eerst had ik: Forms![frmHoofdMenu].[Form]![NavigatieSubformulier].[Form]![sfrmHeadSets]
In dat geval is sfrmHeadSets geen formulier maar een Control.

Ik ga het eens goed bekijken maar ik heb weer goede hoop :)
 
Je moet inderdaad naar het volledige pad van het (sub) formulier verwijzen; dat had ik er wellicht bij moeten melden. Aan de andere kant: het is natuurlijk veel beter als je dat zelf uitvindt :). Je code kan overigens korter (en in mijn ogen dus beter):

Code:
    Set frm = Forms![frmHoofdMenu].[Form]![NavigatieSubformulier].[Form]![sfrmHeadSets].[Form]
    Call CheckControls(frm)

Code:
    Set frm = Forms!frmHoofdMenu!NavigatieSubformulier.Form!sfrmHeadSets
    CheckControls frm

Maar waarom niet gelijk
Code:
    CheckControls Forms!frmHoofdMenu!NavigatieSubformulier.Form!sfrmHeadSets
 
Ik zal het straks , als ik er nog puf voor heb :), even proberen, anders morgen en zal het resultaat posten.
 
Bedankt Octafish, dat werkt inderdaad ook, minder code en dus beter :D
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan