Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Access 2003 Makros in VBA konvertieren möglich?

Begonnen von bambi1408, Oktober 31, 2016, 18:37:22

⏪ vorheriges - nächstes ⏩

bambi1408

#30
Zitat& FilterValue & "*'"
Das * ist einfach ein Platzhalter oder?

Kein Platzhalter sondern einfach das er nachfolgend alle Zeichen akzeptiert.

Habs auch schon ausprobiert...also wenn ich be eingebe, bringt er mir alle die mit be anfangen...klappt wirklich gut

Josef P.

#31
Zitat
ZitatGemäß Code (DoCmd.ApplyFilter) sollte aber nicht zum Datensatz gesprungen werden sondern nur noch die Datensätze angezeigt werden, die mit B beginnen.
Das scheint wohl nicht zu funktionieren :-(
.. oder es wird etwas anderes ausgeführt.

Geh einmal in den Entwurf des Formulars, markiere die Optionsgruppe der Buttons und schau im Eigenschaftsfenster unter Ereignisse nach, was dort ausgeführt wird.
Eventuell auch bei den einzelnen Buchstaben-Umschaltflächen nachsehen, ob dort auf Ereignisse reagiert wird.


Weiter mit dem Test-Formular:
Kopiere bitte die Optionsgruppe mit den Buchstaben vom "Original"-Formular in dein Test-Formular und benenne die Optionsgruppe "ogNameFilterValue".
Im Original müsste diese Optionsgruppe "Firmen Filter" heißen.

Anschließend fügst du in das Testformular folgenden Code ein:
private function GetNameFilterValue() as String

    dim NameFilterValue as string

    With Me.ogNameFilterValue
      select case .Value
        Case 1 ' Filter für Firmennamen, die mit  A, À, Á, Â, Ã, oder Ä beginnen.
            NameFilterValue = "[123456789AÀÁÂÃÄ]"
        Case 3 ' C oder Ç
            NameFilterValue = "[CÇ]"
       
        ' ... hier später die restlichen Buchstaben auflisten, die für mehr als ein Zeichen stehen

        Case 27 ' Zeigt alle Datensätze an.
            NameFilterValue  = vbnullstring

        Case Else
             NameFilterValue  = Chr(64 + .Value)
      End Select
    End With

    GetNameFilterValue = NameFilterValue 

end function


Die Prozedur SetFormFilter änderst du auf:
private sub SetFormFilter()
 
    dim FilterString as String
    dim FilterValue as String

    FilterValue = GetNameFilterValue()
    FilterString = "[Name] like '" & FilterValue & "*'"

    Me.Filter = FilterString
    Me.FilterOn = True

End Sub


mfg
Josef

bambi1408

#32
ZitatGeh einmal in den Entwurf des Formulars, markiere die Optionsgruppe der Buttons und schau im Eigenschaftsfenster unter Ereignisse nach, was dort ausgeführt wird.
Eventuell auch bei den einzelnen Buchstaben-Umschaltflächen nachsehen, ob dort auf Ereignisse reagiert wird.

Das Problem ist, das er mir für die "Optionsgruppe" ABC.... keine Optionsgruppe anzeigt. Wenn ich aber alle Umschalter markiere, kopiere und dann in das Testformular einfüge, dann erhalte ich eine Optionsgruppe wo ich auch dann den Namen "Firmen Filter" habe. Schon seltsam. So kann ich dir auch nicht sagen, welches Ereignis er ausführt, da ich bei den Eigenschaften im Original keine Option "beim Klick" habe.

Im Original bekomme ich auf der Eigenschaftenseite angezeigt: Auswahltyp: Mehrfachauswahl, bei dem reinkopierten in das Testformular wird angezeigt: Auswahltyp: Optionsgruppe.
Weisst du was da falsch läuft?

bambi1408

Hallo Josef

Habe jetzt mal dasFormular nach deinen Angaben geändert. Allerdings bringt er mir jetzt bei Klick die Fehlermeldung, das er nicht auf den Filter A-Z Schaltflächen nicht zugreifen kann, also auf das Makro. Muss ich da jetzt noch was ändern bei den einzelnen Umschaltern? Da ist ja jeweils der Filter angegeben und den hat er ja mitkopiert.

Josef P.

#34
Hallo!

Versuche einmal im Original über das Eigenschaftsfenster die Optionsgruppe "Firmen Filter" auszuwählen. Der Name sollte im Dropdown zur Auswahl stehen.

ZitatAllerdings bringt er mir jetzt bei Klick die Fehlermeldung, das er nicht auf den Filter A-Z Schaltflächen nicht zugreifen kann, also auf das Makro.
Mit Makro meinst du die VBA-Funktion, oder?
Diesen Eintrag im Testformular bitte entfernen. Steht der Funktionsaufruf bei AfterUpdate?
Den Aufruf der Funktion als Eigenschaftseintrag ersetzen wir durch eine Ereignisbehandlung.

Private Sub ogNameFilterValue_AfterUpdate()
    SetFormFilter
End Sub

bambi1408

ZitatVersuche einmal im Original über das Eigenschaftsfenster die Optionsgruppe "Firmen Filter" auszuwählen. Der Name sollte im Dropdown zur Auswahl stehen.
Ok das hat geklappt. Dann zeigt er mir folgendes bei Klick an:

Private Sub Firmen_Filter_Click() 
        DoCmd.DoMenuItem A_FORMBAR, A_RECORDSMENU, A_REFRESH, , A_MENU_VER20
End Sub


Das steht bei "Vor Aktualisierung"

Private Sub Firmen_Filter_BeforeUpdate(Cancel As Integer)

End Sub

und bei "Nach Aktualisierung" ist der Filtername vom Makro eingesetzt.

ZitatMit Makro meinst du die VBA-Funktion, oder?
Ich denke das er immer noch auf das Makro zugreifen will und mir deswegen diese Fehlermeldung bringt. Im VBA-Code habe ich Filternamen "A-Z Schaltflächen" ja nirgendwo drin. Wegen dem anderen schau ich gleich. Ich schaue auch mal, ob er bei dem Testformular in der Optionsgruppe irgendwo den Filter noch drin hat.

bambi1408

Muss ich die einzelnen Reiter noch in Case 1, Case2 usw umbenennen oder bezieht er das automatisch?

Es funktioniert erst mal alles super bis hierher.

Josef P.

Reiter? Ist das ein Registersteuerelement? In der Optionsgruppe sollten das eher Umschaltflächen sein.
Aber egal was es ist - umbenennen ist nicht erforderlich. ;)

select-case bitte in der Hilfe nachlesen.
"Case" ist ein VBA-Statement.
1 - n sind die Werte, die in den Umschaltflächen eingestellt sind.

With Me.ogNameFilterValue
    select case .Value
        Case 1 ' Filter für Firmennamen, die mit  A, À, Á, Â, Ã, oder Ä beginnen.
            NameFilterValue = "[123456789AÀÁÂÃÄ]"
        Case 3 ' C oder Ç
            NameFilterValue = "[CÇ]"


Obiges könntes mit If- und ElseIf auch so schreiben:
With Me.ogNameFilterValue
    IF .Value = 1 then ' Filter für Firmennamen, die mit  A, À, Á, Â, Ã, oder Ä beginnen.
            NameFilterValue = "[123456789AÀÁÂÃÄ]"
   Elseif .Value = 3 then ' C oder Ç
            NameFilterValue = "[CÇ]"

Das finde ich zwar unübersichtlicher, aber vielleicht hilfts für Verstehen der Select-Case-Anweisung.

mfg
Josef

bambi1408

Ok das hab ich jetzt soweit verstanden. Wie mache ich jetzt weiter oder kann ich das jetzt einfach so wie es ist in mein Original einbauen? Und es sollen mir ja im oberen Feld noch die Einzelheiten zur Adresse aktualisiert werden. Muss ich da jetzt was anpassen? Oder sollte das so funktionieren?

bambi1408

Ich hab jetzt mal versucht, das ganze in mein Original einzubauen. Debuggt hab ich alles und er bringt keine Fehlermeldung mehr. Wenn ich die Optionsschalter durchklicke, aktualisiert er mir zwar oberhalb der Op.Schalter immer die erste Adresse vom betreffenden Buchstaben, im unteren ungebunden Feld 159 fängt er allerdings bei D an und das ändert sich auch durch das Umschalten nicht. Kannst du mir sagen, was ich da jetzt einbauen muss, damit er das macht?

Danke schon mal.
Gruss Nicole

Josef P.

Zitat
ZitatKann es sein, dass mit den Buchstaben-Steuerelementen zuerst diese Adressliste gefiltert werden soll und dann nach Auswahl einer bestimmten Adresse in diesem Listenfeld (Feld159) im Formular der Datensatz angezeigt werden soll?
Also das würde ich eigentlich mit Nein beantworten. Im Feld159 werden eigentlich alle Datensätze aufgeführt, die in meiner Tabelle Adressen enthalten sind.

Zitatim unteren ungebunden Feld 159 fängt er allerdings bei D an und das ändert sich auch durch das Umschalten nicht
Also wir doch gefiltert? ;)

Wie sieht die SQL-Anweisung (RowSource) der Listbox (Feld159) aus?

Vielleicht bereits
Me.Feld159.Requery
aus, um die Listbox zu filtern, falls die SQL-Anweisung entsprechend gestaltet ist.

mfg
Josef

bambi1408

ZitatAlso wir doch gefiltert? ;)
Ja also gefiltert wird schon, aber es wird nicht nur ein einziger Datensatz angezeigt sondern er springt dann eigentlich nur zu dem ersten Datensatz mit dem Buchstaben. Aber alle anderen Buchstaben hat er darunter auch weiter aufgelistet.

Private Sub Feld159_GotFocus()
    Me.Requery
End Sub

Das habe ich mal versucht gehabt um das Listenfeld zu Aktualisieren, hatte aber im Original nichts gebracht. Das ist unter "Bei Focuserhalt".

ZitatWie sieht die SQL-Anweisung (RowSource) der Listbox (Feld159) aus?
Muss ich das anders einbauen?

Function fktDatensatzklick3()

    Dim DocName As String
    Dim LinkCriteria As String
   
    DocName = "Adressen"
    LinkCriteria = "[NAME] = Forms![Adressen]![Feld159]"
    DoCmd.OpenForm DocName, , , LinkCriteria

End Function

Das ist der Code der noch in dem Feld 159 definiert ist, unter "Beim Klicken".



bambi1408

Guten Morgen

Ich habe mir die Datenherkunft für das Feld 159 nochmal genauer angeschaut. Die Herkunft ist aus einer Abfrage, die sich auf die Adresstabelle bezieht. Allerdings steht auch in der Herkunftsangabe folgendes :

From [Adressensort] WHERE (([Adressensort].[NAME] >= [NAMEF])) OR ((Adressensort.[SUCH_INDEX]=[Feld185]));
Adressensort ist die Abfrage. Aber NAMEF ist darunter nicht aufgeführt, also nehme ich mal an es ist ein Filter? Er muss sich ja irgendwie auf meine Umschalter darin beziehen. Kann ich das ganze jetzt mit einem VBA-Code bewerkstelligen?

Danke und Gruss
Nicole

Josef P.

Hallo!

NAMEF wird ein Steuerelement im Formular sein. Vermutlich mit einer Funktion im Steuerelementinhalt, die den in der Optionsgruppe ausgewählten Buchstaben zurückgibt.


ZitatPrivate Sub Feld159_GotFocus()
    Me.Requery
End Sub
Mit Me.Requery aktualisierst du die Formulardaten. Wenn du die Listbox aktualisieren willst, musst du Me.Feld159.Requery schreiben.

GotFocus der Listbox als Einstieg, um die Listbox zu akutalisieren, finde ich unpassend.
Besser du aktualisierst die Listbox nach Änderung der Optionsgruppe.

mfg
Josef

bambi1408

Also ich bin schon mal einen (kleinen) Schritt weiter. Habs jetzt hinbekommen das er mir in dem ungebundenen Listenfeld sortiert...ABER er sortiert mir nicht richtig. Wenn ich auf A geh fängt er z.b. bei den Namen mit C an, die Namen mit V bringt er mir wenn ich auf U gehe usw., vielleicht habe ich die Requery einfach an der falschen Stelle oder ich muss die Filter neu einbinden? Wie kann ich die DB hier hochladen? Die ist 3 MB, obwohl sie nur eine Tabelle, eine Abfrage und ein Formular enthält.

Danke und Gruss
Nicole