1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Access: Ergebnis aus Abfrage in VBA-Code nutzen

Discussion in 'Office-Programme' started by dj-mettwurst, Aug 13, 2009.

Thread Status:
Not open for further replies.
  1. Hallo zusammen,

    folgender Sachverhalt:

    Nehmen wir an, ich habe in einer Tabelle Daten hinterlegt, Schlüssel ist eine ID (AutoWert), weitere Spalten sind "Frage" & "Antwort" (beispielhaft)

    In einem Formular ist nun ein Textfeld, in dem die ID eingegeben werden soll, bei Klick auf einen Button soll in der DB nach dem Eintrag mit der eingegebenen ID gesucht werden.
    Wird diese gefunden, so soll sich ein weiteres Fenster öffnen, in dem die Infos aus den anderen Spalten in weitere Textfelder eingetragen werden.
    Ist kein Eintrag mit eingegebener ID vorhanden, so soll sich kein neues Fenster öffnen, lediglich eine MsgBox soll aufpoppen ("Fehler" o.ä.).

    Nun meine Frage:
    Wie kann ich das Ergebnis der Abfrage in meinen VBA-Code implementieren (z.B. für eine If-Schleife) und wie gestallte ich die Abfrage hierfür am besten?

    Vielen Dank bereits im Voraus für (hilfreiche) Antworten!
     
  2. Butch87

    Butch87 Kbyte

    Code:
    Dim MyDaten As DAO.Recordset ' repräsentiert deine Tabelle
    Dim MeineFrage As String        ' zum zwischen speichern
    Dim MeineAntwort As String      ' ebenfalls
        
    Set MyDaten = CurrentDb.OpenRecordset("Dein_TabellenName") ' öffnet eine X-beliebige Tabelle
    MyDaten.FindFirst "[Dein_ID_Feld] = " & ID_nach_der_gesucht_werden_soll ' sucht nach dem eintrag, mit angegebenem Suchbegriff (strings in anführungszeichen)
        
    If Not MyDaten.EOF Then ' prüft, ob ein Eintrag gefunden wurde
        MeineFrage = MyDaten![Dein_Frage_Feld]    ' Daten auslesen (vom gefundenen DS)
        MeineAntwort = MyDaten![Dein_Antwort_Feld] ' ebenfalls
    Else
        MsgBox ("ID nicht gefunden")  ' wenn nix gefunden wird -> Fehlermeldung
    End If
    MyDaten.close: Set MyDaten = nothing ' Tabelle schließen und Objekt wieder freigeben
     
  3. Hascheff

    Hascheff Moderator

    Es wäre zwar auch eine Lösung ohne (selbstgeschriebenen) Code möglich, aber wenn er nun mal da ist ...
     
  4. Butch87

    Butch87 Kbyte

    ja stimmt, aber es war mir zu kompliziert zu beschreiben und ich hätte erstmal wieder gucken müssen, wie es funktioniert...
     
  5. Okay, danke für die schnelle Antwort...Jetzt sagt er mir aber einen "Laufzeitfehler '3251': Operation wird für diesen Objekttyp nicht unterstützt' bei Zeile
    Code:
    MyDaten.FindFirst "[Dein_ID_Feld] = " & ID_nach_der_gesucht_werden_soll
    Als [Dein_ID_Feld] habe ich natürlich das Feld aus der Tabelle genommen (FrageID)
    und als [ID_nach_der_gesucht_werden_soll] habe ich das Textfeld "txt_suchen" genommen...
     
  6. Butch87

    Butch87 Kbyte

    Zeig ma her die Methode
     
  7. Hascheff

    Hascheff Moderator

    Du hast doch ein Formular mit den Daten, so wie du sie sehen willst.
    Lege im Formularkopf ein Kombinationsfeld mit Hilfe des Assistenten an und wähle im Assistent "Einen bestimmten Datensatz suchen". Das müsste es gewesen sein.

    OK, die Lösung enthält auch Code, den erstellt der Assistent.

    OK, es kommt kein neues Fenster, schlimm?

    OK, man wählt den Datensatz mit der Maus aus und gibt keine Zahl per Tasten ein, schlimm? Die Datenquelle für das Kombinationsfeld sollte eine sortierte Liste sein, damit man die Nummer findet. Falls es die noch nicht gibt, sollte man eine entsprechende Abfrage vorher erstellen.

    OK, man bekommt dann keine Fehlermeldung, schlimm? Wie es läuft, wenn man im Kombinationsfeld per Tasten den gesuchten Wert eingibt, weiß ich nicht. Irgendwo in den Eigenschaften des Kombinationsfeld lässt sich festlegen, was passieren soll, wenn eine nicht vorhandene ID eingegeben wird. Aber vielleicht muss hier doch noch am Code gearbeitet werden.
     
  8. Code:
    Option Compare Database
    
    
    Private Sub but_suchen_Click()
    Dim MyDaten As DAO.Recordset            ' repräsentiert deine Tabelle
    Dim MeineFrage As String                ' zum zwischen speichern
    Dim MeineAntwort As String              ' ebenfalls
    Dim MeineVortext As String              ' ebenfalls
    Dim MeineAusgangssituation As String    ' ebenfalls
    
        
    Set MyDaten = CurrentDb.OpenRecordset("tbl_Fragen") ' öffnet eine X-beliebige Tabelle
    MyDaten.FindLast "FrageID = " & txt_suchen ' sucht nach dem eintrag, mit angegebenem Suchbegriff (strings in anführungszeichen)
        
    If Not MyDaten.EOF Then ' prüft, ob ein Eintrag gefunden wurde
        MeineAusgangssituation = MyDaten!Ausgangssituation
        MeineVortext = MyDaten!Vortext
        MeineFrage = MyDaten!Frage    ' Daten auslesen (vom gefundenen DS)
        MeineAntwort = MyDaten!Antwort ' ebenfalls
    Else
        MsgBox ("ID nicht gefunden")  ' wenn nix gefunden wird -> Fehlermeldung
    End If
    MyDaten.Close: Set MyDaten = Nothing ' Tabelle schließen und Objekt wieder freigeben
    
    End Sub

    So sieht die Methode aus.... das mit dem Kombinationsfeld ist natürlich ne Alternative Hascheff, allerdings soll das ganz eauch noch ein wenig erweiterbar sein. Z.B. soll jede Frage mit einem (oder mehreren) "Tag(s)" versehen werden, dass man nach bestimmten Themen suchen kann etc...also irgendwann muss ich ja so ein Suchfenster basteln...
     
  9. Butch87

    Butch87 Kbyte

    Code:
    MyDaten.FindLast "FrageID = " & CLng(txt_suchen) 
    änder mal die Zeile so ab! "txt_suchen" gibt dir nen string zurück, allerdings ist das Feld vom Typ Long. Wenn es allerdings nen StringFeld is, musste die ganze sache noch in Anführungszeichen setzen.
     
  10. FrageID ist ein AutoWert, also kein String.
    Habs jetzt mal so geändert, allerdings ist der Fehler immer noch der selbe...
     
  11. Butch87

    Butch87 Kbyte

    Machs ma via SQL, also so:
    Code:
    Set MyDaten = CurrentDb.OpenRecordset("Select * from Deine_Tabelle where Dein_Feld =  " & Dein_Suchwert)
     
  12. Schon viel besser, jetzt klappts auch....wie bekomme ich jetzt die ID, welche ich in dem Textfeld eingegeben habe, in das neue Formular rein? :confused:
     
  13. Butch87

    Butch87 Kbyte

    Deklarier die Variablen unter "Option Compare Database" als privat
    Code:
    Option Compare Database
    
    private MeineVariable as Long
    und dann machste dir dafür ne Gettermethode
    Code:
    function GetMeineVariable() as Long
    GetMeineVariable = MeineVariable
    end function
    und dann rufst du die Methode einfach aus dem gewünschten Formular auf...
     
  14. Hmmmm, okay....jetzt bleibt für mich nur die Frage, wie ich das dann da reinschreibe...möchte ja, dass, sobald sich das andere Fenster öffnet, diese ID + anderen Infos zu dieser ID in ihren Feldern steht und ich in dem neuen Formular erst noch irgendwo klicken muss, um das ganze "anzufahren"...weiss aber leider nicht, wie ich das hinbekommen kann....bin leider nicht so der Super-Progger, aber ich gebe mir größte Mühe :cool:
     
  15. Butch87

    Butch87 Kbyte

    Na dann "füllst" du das Formular einfach beim OnShow-Ereignis des Formulars!
     
Thread Status:
Not open for further replies.

Share This Page