Foutafhandeling

jacw

Gebruiker
Lid geworden
23 sep 2006
Berichten
86
Besturingssysteem
Windows 11
Office versie
Office 365
Goedemorgen, ik ben niet thuis in VBA en heb van iemand een stukje code gekregen.
De code werkt bijna zoals ik wil. Als ik een gebruikersnaam opgeef, die niet in de tabel staat, dan krijg ik een foutmelding "ongeldig gebruik van null" foutcode 94.
Deze regel is gemarkeerd:
Code:
strWachtwoord = DLookup("[Wachtwoord]", "tblGebruikers", "Gebruikersnaam = '" & strGebruikersnaam & "'")

Wie kan mij helpen deze foutmelding correct af te handelen?

Code:
Private Sub cmdInloggen_Click()
    Dim strGebruikersnaam As String
    Dim strWachtwoord As String
    Dim strFormulierNaam As String
    Dim strCriteria As String

    ' Controleer of de invoervelden zijn ingevuld
    If Trim(Me.txtGebruikersnaam.Value & "") = "" Then
        MsgBox "Voer een gebruikersnaam in.", vbInformation, "Gebruikersnaam vereist"
        Me.txtGebruikersnaam.SetFocus
        Exit Sub
    End If

    If Trim(Me.txtWachtwoord.Value & "") = "" Then
        MsgBox "Voer een wachtwoord in.", vbInformation, "Wachtwoord vereist"
        Me.txtWachtwoord.SetFocus
        Exit Sub
    End If

    ' Gebruik DLookup om het wachtwoord op te zoeken in de tabel
    strGebruikersnaam = Me.txtGebruikersnaam.Value
    strWachtwoord = DLookup("[Wachtwoord]", "tblGebruikers", "Gebruikersnaam = '" & strGebruikersnaam & "'")

    ' Controleer of het ingevoerde wachtwoord overeenkomt
    If strWachtwoord = Me.txtWachtwoord.Value Then
        ' Zoek de formuliernaam op voor de gebruiker
        strFormulierNaam = DLookup("[FormulierNaam]", "tblGebruikers", "Gebruikersnaam = '" & strGebruikersnaam & "'")
       
        ' Open het bijbehorende formulier
        DoCmd.OpenForm strFormulierNaam
       
        ' Sluit het inlogformulier
        DoCmd.Close acForm, "frmInloggen"
    Else
        MsgBox "Onjuiste gebruikersnaam of wachtwoord. Probeer het opnieuw.", vbExclamation, "Inlogfout"
        Me.txtWachtwoord.SetFocus
    End If
        Me.txtWachtwoord.Value = Null
    Me.txtGebruikersnaam.Value = Null
End Sub

Met groet,
Jacob
 
Laatst bewerkt:
De gemarkeerde regel staat niet in de code die je plaatste.
 
Dankjewel voor je opmerking, ik heb het hersteld. {verkeerde kladblok)
 
Als het goed is staat alles er nu
 
Het probleem is mogelijk dat strWachtwoord als String is gedefinieerd en je er Null aan toe wilt wijzen. Probeer het eens als Variant.
Om te voorkomen dat je verderop weer problemen krijgt met de Null kan je het controleren van het wachtwoord overslaan. Dat heeft sowieso geen nut als de gebruikersnaam niet bestaat.
 
Kun je mij opweg helpen? ik kom er zelf niet uit. bij voorbaat dank
 
Waarom maak je geen gebruik van de Windows-gebruikersnaam ? Dan is 1 regel VBA voldoende.
 
Het wordt een database die op verschillende laptops kan draaien met verschillend toegangsniveau. Heb begrepen dat het met 1 programmaregel extra kan worden opgelost, alleen krijg ik het niet voor elkaar. Vandaar mijn vraag
 
Een "single sign on" oplossing zoals @snb suggereert is zo gek nog niet. Eenvoudig en gebruikersvriendelijk.

Mocht je toch op de ingeslagen weg verder willen, post dan je database zodat we niet op nul hoeven te beginnen.
 
Het probleem is mogelijk dat strWachtwoord als String is gedefinieerd en je er Null aan toe wilt wijzen. .
Dit klopt niet, maar is ook het probleem niet (een string (en een naam ís een string) kun je gewoon als String definiëren.

Als ik de flow volg, wekt je vanuit het formulier frmInloggen met de twee tekstvakken txtGebruikersnaam en txtWachtwoord. Die waarden gebruik je voor het opzoeken van een wachtwoord en een formuliernaam. Vervolgens open je dat formulier, en sluit je het frmInloggen (waar dus die twee tekstvakken op staan). En dán pas maak je de twee tekstvakken leeg op het inmiddels afgesloten formulier. Dan krijg je natuurlijk een foutmelding, want op een gesloten formulier kun je niets muteren of leegmaken.

Sowieso zijn tekstvakken op een formulier precies dat: tekstvakken. Maak ze dan ook leeg als een tekstvak, dus zo:
Code:
me.txtWachtwoord = ""
Verder raad ik je aan om geen (liefst: nooit) enkele aanhalingstekens te gebruiken in string formules, maar altijd dubbele aanhalingstekens. Dus niet:
Code:
"Gebruikersnaam = '" & strGebruikersnaam & "'")
Maar:
Code:
"Gebruikersnaam = """ & strGebruikersnaam & """")
 
Dankjewel OctaFish,

Ik heb een tabel (tbGebruikers) aangemaakt met daarin:
UserId
Gebruikersnaam
Wachtwoord
Formulier naam

Ik heb een (onafhankelijk) formulier (inloggen) gemaakt met twee invulvelden:
txtGebruikersnaam
txtWachtwoord
knop die de VBA Code aanstuurt.

Voor wat ik er van kan inzien, vergelijkt hij de naam en het wachtwoord met de data in de tabel. Als dat goed is, opent hij het formulier waarin die persoon mee kan opstarten. Als de zoekopdracht ten einde is, maakt hij de velden in het formulier (inloggen) pas leeg. Tot zover werkt alles goed en opent ook het desbetreffende formulier.
Ik krijg alleen een foutmelding als Ik een naam foutief invul in plaats van bijvoorbeeld Johan in plaats van Jacob. dan geeft hij de foutmelding weer ("ongeldig gebruik van null" foutcode 94.)

Ik hoop dat jij een aanpassing hebt voor de VBA regel waarop hij vastloopt. Bij een foutief wachtwoord zegt hij wel dat het wachtwoord fout is.


Met groet,
Jacob
 
Fouten voorkomen is altijd beter dan fouten verhelpen. Mijn aanpak zou zijn: een keuzelijst met invoervak waarin je een naam opzoekt/intypt. Dat verlaagt de kans op typefouten aanzienlijk (reductie tot 0). Bovendien kun je die keuzelijst gebruiken om een actie uit te voeren als de gebruiker niet bestaat, bijvoorbeeld database afsluiten (onbekende gebruiker immers) of nieuwe gebruiker toevoegen.

Sowieso wordt je procedure een stuk simpeler, omdat je in diezelfde keuzelijst ook het wachtwoord kan zetten (in een onzichtbare kolom natuurlijk) zodat je het in te typen wachtwoord gelijk kan controleren a.d.h.v. Het wachtwoord dat bij die gebruiker hoort, en dat je uit de keuzelijst haalt.
 
Terug
Bovenaan Onderaan