collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 63
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13808
  • stats Beiträge insgesamt: 64171
  • stats Themen insgesamt: 8679
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: "Variable nicht definiert"  (Gelesen 1266 mal)

Offline Viki

  • Newbie
  • Beiträge: 5
"Variable nicht definiert"
« am: Februar 14, 2017, 12:22:30 »
Hat jemand eine Idee! Meine VBA-Programm für Login funktioniert nicht.
An der Stelle "dbOpenSnapshot" kommt eine Fehlermeldung "Variable nicht definiert" woran kann es de liegen? wenn möglich mit einem VBA-Beispiel habe selbst nicht so viel Ahnung von VBA.
Danke in Voraus.

Mein VBA
Option Compare Database
Option Explicit

Private Sub cmdLogin_Click()
Dim rs As Recordset
   
    Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
   
    rs.FindFirst "UserID='" & Me.txtBenutzername & "'"
   
    If rs.NoMatch = True Then
        Me.lblFalscherBenutzer.Visible = True
        Me.txtBenutzername.SetFocus
        Exit Sub
    End If
    Me.lblFalscherBenutzer.Visible = False
   
    If rs!Kennwort <> Me.txtKennwort Then
        Me.lblFalschesPasswort.Visible = True
        Me.txtPasswort.SetFocus
        Exit Sub
    End If
    Me.lblFalschesPasswort.Visible = False
   
'Set ByPassKeyPrompt
    If rs!Benutzergruppen_ID = 3 Then
        Dim prop As Property
        On Error GoTo SetProperty
        Set prop = CurrentDb.CreateProperty("AllowBypassKey", dbBoolean, False)

        CurrentDb.Properties.Append prop

'Set Property
        If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", vbYesNo, "Allow Bypass") = vbYes Then
            CurrentDb.Properties("AllowBypassKey") = True
        Else
            CurrentDb.Properties("AllowBypassKey") = False
        End If

   End If

    DoCmd.OpenForm "Übersicht"
    DoCmd.Close acForm, "Me.Name"

End Sub
« Letzte Änderung: Februar 14, 2017, 12:27:28 von MzKlMu »
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23143
Re: "Variable nicht definiert"
« Antwort #1 am: Februar 14, 2017, 12:58:59 »
Hallo,


es kann sein:

dass hier kein expliziter DAO-Verweis verwendet wird:  Dim rs As DAO.Recordset

dass ein anderer Verweis gebrochen, bzw. nicht vorhanden ist:  VBA-Editor/Extras/Verweise auf Hinweise checken und korrigieren.
Weiterhin den Verweis auf die passende DAO-Library setzen, falls nicht geschehen.

Unter VBA-Editor/Debuggen/Kompilieren den gesamten Code kompilieren und evtl. Fehler elimininieren.
Dazu vorab in JEDEN(!) Modulkopf   Option Explicit   einfügen, sofern nicht vorhanden.



btw:

If rs!Kennwort <> Me.txtKennwort Then

Access ist zunächst nicht case-sensitive.  Ein solcher Vergleich mach keinen Unterschiede zwischen Groß- und Kleinschreibung.  Schau dazu die Strcomp()-Funktion in der VBA-Hilfe an, um einen Binär-Vergleich zu realisieren.

Offline Viki

  • Newbie
  • Beiträge: 5
Re: "Variable nicht definiert"
« Antwort #2 am: Februar 16, 2017, 10:44:38 »
Hallo Franz,
Danke für die schnelle Antwort. Ich habe jetzt auch mit Dim rs As DAO.Recordset versucht und kriege die Fehlermeldung, dass "Benutzerdefinierter Typ nicht definiert".  Im Moment weis ich nicht weiter.


 

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 274
    • Tipps zu Access, VBA, SQL und Co.
Re: "Variable nicht definiert"
« Antwort #3 am: Februar 16, 2017, 11:19:15 »
Ich habe jetzt auch mit Dim rs As DAO.Recordset versucht und kriege die Fehlermeldung, dass "Benutzerdefinierter Typ nicht definiert". 
Wie bereits von Franz geschrieben:
Im VBA-Editor, Menü "Extras"->"Verweise". Dort einen Verweis auf die "Microsoft DAO 3.6 Object Library" setzen.
 

Offline Joss

  • Access-User
  • *
  • Beiträge: 54
Re: "Variable nicht definiert"
« Antwort #4 am: Februar 16, 2017, 14:28:08 »
Hallo Viki,

zu den Verweisen siehe auch:
http://www.donkarl.com?FAQ7.1

Falls du mit den Verweisen nicht zurechtkommst, erstelle eine neue Datenbank, und importiere alle Objekte aus der alten Datenbank.

Gruß
Josef
 

Offline Viki

  • Newbie
  • Beiträge: 5
Re: "Variable nicht definiert"
« Antwort #5 am: Februar 17, 2017, 22:51:38 »
Hallo zusammen,
es funktioniert, tatsächlich lag es an der DAO-Funktion und derer Aktivierung.
 

Offline Viki

  • Newbie
  • Beiträge: 5
Re: "Variable nicht definiert"
« Antwort #6 am: Februar 25, 2017, 22:15:25 »
Hallo zusammen,
brauche nochmals Hilfestellung. Habe den geposteten VBA-Code:
Private Sub cmdLogin_Click()
Dim rs As Recordset
   
    Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
   
    rs.FindFirst "UserID='" & Me.txtBenutzername & "'"
   
    If rs.NoMatch = True Then
        Me.lblFalscherBenutzer.Visible = True
        Me.txtBenutzername.SetFocus
        Exit Sub
    End If
    Me.lblFalscherBenutzer.Visible = False
   
    If rs!Kennwort <> Me.txtKennwort Then
        Me.lblFalschesPasswort.Visible = True
        Me.txtPasswort.SetFocus
        Exit Sub
    End If
    Me.lblFalschesPasswort.Visible = False
   
'Set ByPassKeyPrompt
    If rs!Benutzergruppen_ID = 3 Then
        Dim prop As Property
        On Error GoTo SetProperty
        Set prop = CurrentDb.CreateProperty("AllowBypassKey", dbBoolean, False)

        CurrentDb.Properties.Append prop

'Set Property
        If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", vbYesNo, "Allow Bypass") = vbYes Then
            CurrentDb.Properties("AllowBypassKey") = True
        Else
            CurrentDb.Properties("AllowBypassKey") = False
        End If

   End If

    DoCmd.OpenForm "Übersicht"
    DoCmd.Close acForm, "Me.Name"

End Sub

 in eine neu Datenbank eingefügt und ie Variable "Microsoft DAO 3.6 Object Library" angewählt.

bekomme in der Zeile "CurrentDb.Properties("AllowBypassKey") = True" und in der Zeile "CurrentDb.Properties("AllowBypassKey") = False" einen "Laufzeitfehler 3270" Eigenschaft nicht gefunden.
Was könnte das Problem sein? denn die selbe Codierung funktioniert in der Kopie der selben Datenbank.

Viele Grüße
 

Offline MaggieMay

  • Global Moderator
  • Access Guru
  • *****
  • Beiträge: 3107
Re: "Variable nicht definiert"
« Antwort #7 am: Februar 25, 2017, 22:48:02 »
Hi,
Zitat
Was könnte das Problem sein?
nimm die Fehlermeldung wörtlich und gehe davon aus, dass die Eigenschaft (noch) nicht vorhanden ist und daher zunächst einmal erstellt werden muss.
Dies betrifft etliche Datenbank- und Objekt-Eigenschaften, die nicht von vornherein definiert sind, weil sie standardmäßig keinen Wert haben.

Hier sollte eigentlich die "CreateProperty"-Methode helfen. Dein Code ist allerdings nicht fehlerfrei kompilierbar - da die Sprungmarke der Fehlerbehandlung nicht definiert ist - und daher grundsätzlich fragwürdig.

Um hier helfen zu können, müsste man schon den Real-Code kennen!
Freundliche Grüße
MaggieMay
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 935
Re: "Variable nicht definiert"
« Antwort #8 am: Februar 26, 2017, 07:57:00 »
Hier der überarbeitete Code:Private Sub cmdLogin_Click()
   Dim rs As DAO.Recordset
   
   Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
   
   rs.FindFirst BuildCriteria()"UserID", dbText, Me.txtBenutzername)
   
   If rs.NoMatch Then
      Me.lblFalscherBenutzer.Visible = True
      Me.txtBenutzername.SetFocus
      Exit Sub
   Else
      Me.lblFalscherBenutzer.Visible = False
   End If
   
   'nix gut - Kennworte im Klartext kann jeder auslesen
   If StrComp(rs!Kennwort, Me.txtKennwort, vbBinaryCompare) <> 0 Then
      Me.lblFalschesPasswort.Visible = True
      Me.txtPasswort.SetFocus
      Exit Sub
   Else
      Me.lblFalschesPasswort.Visible = False
   End If
   
   'Set ByPassKey
   If rs!Benutzergruppen_ID = 3 Then
      If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", _
                vbYesNo, "Allow Bypass") = vbYes Then
         SetPropertyDAO(CurrentDb, AllowBypassKey, vbBoolean, True)
         CurrentDb.Properties("AllowBypassKey") = True
      Else
         CurrentDb.Properties("AllowBypassKey") = False
      End If
   End If

   DoCmd.OpenForm "Übersicht"
   DoCmd.Close acForm, Me.Name

End Sub

'Quelle: http://allenbrowne.com/tips.html

'am besten in ein allgemeines Modul auslagern
Public Function SetPropertyDAO( _
   obj As Object _
 , strPropertyName As String _
 , intType As Integer _
 , varValue As Variant _
 , Optional strErrMsg As String _
 ) As Boolean

   On Error GoTo ErrHandler
   'Purpose:   Set a property for an object, creating if necessary.
   'Arguments: obj = the object whose property should be set.
   '           strPropertyName = the name of the property to set.
   '           intType = the type of property (needed for creating)
   '           varValue = the value to set this property to.
   '           strErrMsg = string to append any error message to.

   If HasProperty(obj, strPropertyName) Then
      obj.Properties(strPropertyName) = varValue
   Else
      obj.Properties.Append obj.CreateProperty(strPropertyName, _
                                               intType, varValue)
   End If
   SetPropertyDAO = True

ExitHandler:
   Exit Function

ErrHandler:
   strErrMsg = strErrMsg & obj.Name & "." & strPropertyName & _
               " not set to " & varValue & _
               ". Error " & Err.Number & " - " & Err.Description & vbCrLf
  Resume ExitHandler
End Function

Private Function HasProperty( _
   obj As Object _
 , strPropName As String _
 ) As Boolean

   'Purpose:   Return true if the object has the property.
   Dim varDummy As Variant

   On Error Resume Next
   varDummy = obj.Properties(strPropName)
   HasProperty = (Err.Number = 0)
End Function

PS: statt das Passwort in Klartext zu speichern, sollte besser eine Kryptologische Hashfunktion verwendet werden. Mögliche Umsetzungen findest Du z. Bsp. unter Visual Basic for Applications/String Hashing in VBA.
Grüße von der (⌒▽⌒)
 

Offline Viki

  • Newbie
  • Beiträge: 5
Re: "Variable nicht definiert"
« Antwort #9 am: Februar 26, 2017, 13:40:48 »
Ich danke Euch beiden (Lachtaube und MaggieMay) das ergerliche ist, dass es in einer Datenbank funktioniert und in der Anderen nicht. Ich kenne mich auch viel zu wenig mit der VBA aus.
> Deinen Code (Lachtaube) habe ich getestete und hatte auch Fehlermeldungen...mmm   
bei "rs.FindFirst BuildCriteria()"UserID", dbText, Me.txtBenutzername)" habe auch die Klammer zugefügt als auch gelöscht dennoch Fehler bei "BuildCriteria()".
Des Weiteren verstehe ich den unteren Code-Teil nicht:
'Quelle: http://allenbrowne.com/tips.html

'am besten in ein allgemeines Modul auslagern
Public Function SetPropertyDAO( _
   obj As Object _
 , strPropertyName As String _
 , intType As Integer _
 , varValue As Variant _
 , Optional strErrMsg As String _
 ) As Boolean

   On Error GoTo ErrHandler
   'Purpose:   Set a property for an object, creating if necessary.
   'Arguments: obj = the object whose property should be set.
   '           strPropertyName = the name of the property to set.
   '           intType = the type of property (needed for creating)
   '           varValue = the value to set this property to.
   '           strErrMsg = string to append any error message to.

   If HasProperty(obj, strPropertyName) Then
      obj.Properties(strPropertyName) = varValue
   Else
      obj.Properties.Append obj.CreateProperty(strPropertyName, _
                                               intType, varValue)
   End If
   SetPropertyDAO = True

ExitHandler:
   Exit Function

ErrHandler:
   strErrMsg = strErrMsg & obj.Name & "." & strPropertyName & _
               " not set to " & varValue & _
               ". Error " & Err.Number & " - " & Err.Description & vbCrLf
  Resume ExitHandler
End Function

Private Function HasProperty( _
   obj As Object _
 , strPropName As String _
 ) As Boolean

   'Purpose:   Return true if the object has the property.
   Dim varDummy As Variant

   On Error Resume Next
   varDummy = obj.Properties(strPropName)
   HasProperty = (Err.Number = 0)
End Function
Eigentlich habe ich schon eine Tabelle mit zwei Ribbons erstellt in der ein Ribbon die
XML-Codierung enthält. Das Ganze habe ich von "Steve Bishop" https://www.youtube.com/watch?v=i1n7H686bWI

Gruß Viki
« Letzte Änderung: Februar 26, 2017, 14:12:46 von MzKlMu »
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 935
Re: "Variable nicht definiert"
« Antwort #10 am: Februar 26, 2017, 16:16:45 »
Wie Du richtig bemerkt hast, war mein Code fehlerhaft. Hier eine Überarbeitung.Private Sub cmdLogin_Click()
   Dim rs As DAO.Recordset, strCriteria As String
   
   If IsNull(Me.txtBenutzername) Then
      MsgBox "Es ist kein Benutzer eingetragen."
      Exit Sub
   End If
   
   strCriteria = BuildCriteria("UserID", dbText, Me.txtBenutzername)

   Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot)
   If rs.RecordCount = 0 Then
      MsgBox "Es sind keine Benutzer angelegt."
      GoTo Cleanup
   End If
   
   rs.FindFirst strCriteria
   
   If rs.NoMatch Then
      Me.lblFalscherBenutzer.Visible = True
      Me.txtBenutzername.SetFocus
      GoTo Cleanup
   Else
      Me.lblFalscherBenutzer.Visible = False
   End If
   
   'nix gut - Kennworte im Klartext kann jeder auslesen
   If StrComp(Nz(rs!Kennwort), Nz(Me.txtKennwort), vbBinaryCompare) <> 0 Then
      Me.lblFalschesPasswort.Visible = True
      Me.txtPasswort.SetFocus
      GoTo Cleanup
   Else
      Me.lblFalschesPasswort.Visible = False
   End If
   
   'Set ByPassKey
   If rs!Benutzergruppen_ID = 3 Then
      If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", _
                vbYesNo, "Allow Bypass") = vbYes Then
         SetPropertyDAO(CurrentDb, AllowBypassKey, vbBoolean, True)
         CurrentDb.Properties("AllowBypassKey") = True
      Else
         CurrentDb.Properties("AllowBypassKey") = False
      End If
   End If

   DoCmd.OpenForm "Übersicht"
   DoCmd.Close acForm, Me.Name

Cleanup:
   rs.Close   

End Sub
Im zweiten Teil wird der Wert einer Eigenschaft einer Datenbank-Eigenschaft zugewiesen. Sollte die Eigenschaft nicht existieren, so wird sie zuvor erstellt.
Grüße von der (⌒▽⌒)