Ergebnis 1 bis 2 von 2

Thema: Access VBA Abfrage erstellen für Filterung eines Berichtes (Office 2016)

  1. #1
    Office-Hilfe.com - Neuling
    Registriert seit
    22.08.2018
    Beiträge
    2

    Access VBA Abfrage erstellen für Filterung eines Berichtes

    Hallo Leute,

    habe ein Problem und im nach langer Suche im Netz leider nichts gefunden. Ich möchte mittels VBA einen Bericht öffnen/drucken, bei dem sich erst ein Formular öffnet, in dem ich den WHERE Ausdruck für die Auswahl der Daten auswähle. Hier mein Code:

    Private Sub Befehl0_Click()
    Dim strSQL As String
    Dim FilterKriterien As String

    DoCmd.OpenForm "F_AuswahlZug", acNormal, WindowMode:=acDialog
    FilterKriterien = [Forms]![F_AuswahlZug]![Kombinationsfeld_FilterZuege]
    strSQL = "SELECT [standesbuchnummer] " & _
    "FROM A_Mitgliederliste " & _
    "WHERE standesbuchnummer " & FilterKriterien

    DoCmd.OpenReport "B_Mitgliederliste", View:=acViewPreview, WhereCondition:=strSQL

    End Sub


    Die Variable FilterKriterien steht in einem Kombinationsfeld vom Formular F_AuswahlZug. Hier die Daten welche im Kombinationsfeld sind:
    ">=100 und <200"
    "5 oder >=200 und < 300"

    Leider bekomme ich das nicht hin, dass der Bericht entsprechend geöffnet wird.

    Vielleicht kann mit jemand beim Code helfen. Bin in VBA Programmierung noch ein Anfänger.

    Besten Dank.

  2. #2
    Office-Hilfe.com - Profi
    Registriert seit
    24.11.2008
    Beiträge
    2.060
    Hallo,

    du hast formal einen schönen VBA-Code produziert, obwohl du behauptest, Anfänger zu sein.
    Inhaltlich sind aber ein paar harte Nüsse enthalten:
    1. Du hast offenbar ein Formular (ich nenne es im Folgenden "Formular1"), das den Button "Befehl0" enthält. Durch Klick auf diesen löst du die Ereignisbehandlung-SUB "Befehl0_Click()" aus. In dieser öffnest du das Formular "F_AuswahlZug" im Dialogmodus.
      Dabei dürfte dieses Formular "F_AuswahlZug" auch eine ComboBox "Kombinationsfeld_FilterZuege" mit 2 Einträgen enthalten, wovon du einen auswählst. Dieses Formular musst du dann auf irgendeine Weise schließen,
      um im Code weiterzumarschieren zur Wertzuweisung an die Stringvariable "FilterKriterien".
      Das Problem dabei ist, dass du an dieser Stelle auf die diversen Innereien des geschlossenen Formulars nicht (mehr) zugreifen kannst.
      Man kann dieses Problem zB. mit Public deklarierten Variablen oder aber mit den sogenannten TempVars-Variablen umgehen. Im folgenden Code-Vorschlag habe ich diese "FilterZuege" genannt.
    2. Die Konstruktion des Inhalts der "strSQL"-Variablen ist im Prinzip in Ordnung. Doch da offenbar eine der beiden Combobox-Einträge als "FilterKritien" übergeben werden sollen, so kann das nicht funktionieren.
      Der resultierende Inhalt von "strSQL" würde nämlich zB. lauten:
      strSQL = "SELECT [standesbuchnummer] FROM A_Mitgliederliste WHERE standesbuchnummer >=100 und <200"
      strSQL = "SELECT [standesbuchnummer] FROM A_Mitgliederliste WHERE standesbuchnummer 5 oder >=200 und < 300"

      Er sollte aber offenbar so lauten:
      strSQL = "SELECT [standesbuchnummer] FROM A_Mitgliederliste WHERE standesbuchnummer between 100 and 199"
      strSQL = "SELECT [standesbuchnummer] FROM A_Mitgliederliste WHERE standesbuchnummer = 5 or standesbuchnummer between 200 and 299"
    3. Zum Abschluss rufst du mittels "DoCmd.Openreport" den Bericht "B_Mitgliederliste" im Voransichtsmodus auf, was im Prinzip ok ist. Jedoch passt dann aber nicht mehr die "strSQL"-Variable als WhereCondition.
      In der WhereCondition darf man nur das verwenden, was auch in einer WHERE-Klausel einer SQL-Anweisung steht (jedoch ohne dem WHERE).
      Damit die "strSQL" bzw. die "strWHERE" überhaupt richtig funktionieren können, habe ich eine kleine Funktion "GetSQL_Klausel(..)" gebastelt, sodass die beiden Combobox-Einträge entsprechend kurz und flexibel genug sind (Hinweise siehe unten in blauer Farbe).

    Mein Code-Vorschlag:
    Code:
    'Code für das Formular "Formular1":
    Option Compare Database
    Option Explicit
    Private Sub Form_Load()
      TempVars.Add Name:="FilterZuege", Value:=""
    End Sub
    Private Sub Befehl0_Click()
      Dim strSQL As String, strWHERE As String
      Dim FilterKriterien As String
      
      DoCmd.OpenForm "F_AuswahlZug", acNormal, WindowMode:=acDialog
      
      strWHERE = GetSQL_Klausel(TempVars("FilterZuege"), "standesbuchnummer")
      strSQL = "SELECT [standesbuchnummer] " & _
               "FROM A_Mitgliederliste " & _
               "WHERE " & strWHERE & ";"
               
      DoCmd.OpenReport "B_Mitgliederliste", View:=acViewPreview, WhereCondition:=strWHERE
    End Sub
    Private Function GetSQL_Klausel(strWHERE As String, Optional strVar As String = "") As String
      Dim S$, Bw$(), I%
      Bw$ = Split(strWHERE, "{")
      For I% = 1 To UBound(Bw$)
        Bw$(I%) = Replace(Replace(Bw$(I%), "..", " and "), "}", " ")
      Next I%
      S$ = Join(Bw$, " between ")
      S$ = Replace(S$, "$", strVar)
      S$ = Replace(S$, "|", " or ")
      GetSQL_Klausel = S$
    End Function
    'Einträge in der Combobox (für WHERE-Klausel):
    '${100..199}    -->  "standesbuchnummer between 100 and 199"
    '$=5|${200..299} --> "standesbuchnummer=5 or standesbuchnummer between 200 and 299"
    Code:
    'Code für das Formular "F_AuswahlZug":
    Option Compare Database
    Option Explicit
    Private Sub Form_Load()
      TempVars("FilterZuege") = ""
    End Sub
    Private Sub Kombinationsfeld_FilterZuege_Click()
      TempVars("FilterZuege") = Me!Kombinationsfeld_FilterZuege.Text
    End Sub
    Private Sub Befehl2_Click()
      DoCmd.Close acForm, , acSaveNo
    End Sub
    Liebe Grüße
    Anton Exl

    Windows 10 (x64)
    Office 2016 Professional Plus

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
Excel Ticker - News, Tipps und Tricks zu Microsoft Excel | SMS kostenlos versenden | Forenuser - Die Foren Findmaschine