Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Access 2003 Makros in VBA konvertieren möglich?

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

⏪ vorheriges - nächstes ⏩

MzKlMu

Hallo,
ZitatKann mir mal eben jemand erklären wie ich ein Bild hier einfüge?
bei einer Antwort erscheint unten die Option:
+Anhänge und andere Optionen
Ist eigentlich nicht zu übersehen.
Gruß Klaus

Josef P.

Hallo!

Von Access konvertierter Makrocode ist meist nicht besonders gut gestaltet.
Function A_Z_Schaltflächen__Filter()
On Error GoTo A_Z_Schaltflächen__Filter_Err

    With CodeContextObject
        ' Verknüpft mit den Schaltflächen "A" bis "Z" und "Alle" im Formular "Adressen".
        If (.[Firmen Filter] = 1) Then
            ' Filter für Firmennamen, die mit  A, À, Á, Â, Ã, oder Ä beginnen.
            DoCmd.ApplyFilter "", "[Name] Like ""[123456789AÀÁÂÃÄ]*"""
        End If
        If (.[Firmen Filter] = 2) Then
            ' B
            DoCmd.ApplyFilter "", "[Name] Like ""B*"""
        End If
        If (.[Firmen Filter] = 3) Then
            ' C oder Ç
            DoCmd.ApplyFilter "", "[Name] Like ""[CÇ]*"""
        End If
       
        ...

        If (.[Firmen Filter] = 27) Then
            ' Zeigt alle Datensätze an.
            DoCmd.ShowAllRecords
        End If

   End With

A_Z_Schaltflächen__Filter_Exit:
    Exit Function

A_Z_Schaltflächen__Filter_Err:
    MsgBox Error$
    Resume A_Z_Schaltflächen__Filter_Exit

End Function


Ich gehe davon aus, dass [Firmen Filter] eine Optionsgruppe ist. Damit kann es nur eine gültige If-Bedingung im obigen Code geben. Es werden aber immer alle If-Bedingungen geprüft.

Dieser Code ist meiner Meinung nach besser lesbar (nur Refactoring, ohne andere Verbesserungsmaßnahmen):
Ich gehe davon aus, dass diese Funktion im Codemodul des Formulars enthalten ist, in dem sich auch die Optionsgruppe befindet.
Private Function A_Z_Schaltflächen__Filter()
On Error GoTo A_Z_Schaltflächen__Filter_Err
   
    dim NameFilterValue as string

    select case Me.[Firmen Filter].Value
        ' Verknüpft mit den Schaltflächen "A" bis "Z" und "Alle" im Formular "Adressen".
        Case 1 ' Filter für Firmennamen, die mit  A, À, Á, Â, Ã, oder Ä beginnen.
            NameFilterValue = "[123456789AÀÁÂÃÄ]"
        Case 2 ' B
            NameFilterValue  = "B"
        Case 3 ' C oder Ç
            NameFilterValue = "[CÇ]"
        ...

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

    if len(NameFilterValue)>0 then
        me.Filter = "[Name] Like '" & NameFilterValue & "*'"
    else
        Me.Filter = vbnullstring
    end If
    me.FilterOn = (Len(NameFilterValue)>0)

A_Z_Schaltflächen__Filter_Exit:
    Exit Function

A_Z_Schaltflächen__Filter_Err:
    MsgBox Error$
    Resume A_Z_Schaltflächen__Filter_Exit

End Function



Anm.: Ich würde die Filter-Texte als Tag in den Buchstaben-Umschaltbuttons schreiben, dann würde der Filtercode noch viel kürzer werden. ;)

mfg
Josef

bambi1408

Hallo Josef

Vielen Dank für deine Antwort. Ich habe diesen Button wo man Dateien und Bilder anfügen kann schon gesehen, aber es gibt ja auch die Möglichkeit, direkt in dem Beitrag ein Image einzufügen, und das wüsste ich gerne wie ich das hier mache.

ZitatAnm.: Ich würde die Filter-Texte als Tag in den Buchstaben-Umschaltbuttons schreiben, dann würde der Filtercode noch viel kürzer werden.
Welchen Teil meinst du genau?

Sorry ich bin wirklich ein Newbie in Access und steh da im Moment wirklich wie der Ochs vorm Berg. Ich finde irgendwie den Anfang nicht. Ich habe zum Beispiel versucht, einen Bezug in der Umschalttaste und dem VBA herzustellen, aber entweder hat er Probleme das auszulesen, vielleicht eben weil er immer alle If-Bedingungen prüft, oder ich check das nicht.

Vielen Dank jetzt schon einmal für die Hilfe.

Gruss Nicole

MzKlMu

Hallo,
Zitatdirekt in dem Beitrag ein Image einzufügen
das geht nur, wenn Du eine eigene Internetseite hast auf der Du das Bild darstellst. Der Link im Beitrag muss dann auf Deine Seite verweisen.
Gruß Klaus

bambi1408

Zitatdas geht nur, wenn Du eine eigene Internetseite hast auf der Du das Bild darstellst. Der Link im Beitrag muss dann auf Deine Seite verweisen.
Ah ok Danke Klaus.

Dann werde ich mal versuchen, das Problem etwas genauer zu erklären und die Bilder in den Anhang stellen.

Wir haben ein sehr altes Buchhaltungsprogramm,  das in Access2.0 geschrieben ist und wo man an die Tabellen heran kommt. Der Vorbesitzer der Firma hat dann mal vor etlichen Jahren eine Datenbank in AC2.0 gebaut, wo die Aufträge erfasst werden, die Artikel usw. Die Adressverwaltung wird auch in dieser DB gemacht, wobei allerdings auf die Tabelle aus dem Buchhaltungsprogramm zugegriffen wird. Aus diesem Grund können wir das ganze bisher auch nicht höher wie max. AC2007 konvertieren.
Im angehängten Bild PPS_1 sieht man, wie das ganze aussieht, wenn ich in einem Formular (Projekte) auf die Schaltfläche Adressen klicke. Eigentlich sollte er da direkt in dem unteren Feld die Adressen reinschreiben, beginnend mit der ersten. Das tut er aber nicht mehr, unter AC2.0 lief das noch.
Wenn ich jetzt auf "A" klicke, dann gibt er mir die Adressen schön aus, er gibt mir auch die Detailangaben in dem oberen Feld aus. Wenn ich auf eine andere Adresse klicke, dann aktualisiert er das auch schön oben. Drücke ich jetzt aber auf "B", bringt er mir oben sowie unten nur leere Felder. Wenn ich Glück habe, aktualisiert er mir das dann irgendwann nach ein bisschen rumzappen, manchmal aber auch nicht. Diesen Fehler hat er auch nicht nur bei "B", sondern bei einigen Buchstaben, allerdings nicht bei allen.

Ein weiteres Problem wo ich habe ist, das manche Firmen 2 oder 3 Adressen haben. Diese sind mit unterschiedlichen Kundennummern erfasst, also Firma A mit Firmensitz A hat die Kd. Nr. 1, Firma A mit Firmensitz B hat die Kd. Nr. 2. Klicke ich jetzt auf die Kd. Nr. 1, bekomme ich die Daten schön im oberen Feld aktualisiert, möchte ich jetzt allerdings das mir Kd. Nr. 2 angezeigt wird, funktioniert das nicht. Hat es allerding vorher auch schon nicht. Wenn ich den Firmennamen auch nur mit einem Buchstaben ändere, dann kann ich drauf zugreifen, von daher gehe ich davon aus, das die Abfrage (oder Filter) da nicht schön geschrieben ist??

ZitatIch gehe davon aus, dass [Firmen Filter] eine Optionsgruppe is
Ganz ehrlich, ich weiss es nicht. Ich habe nach diesem Namen gesucht, ihn aber in dem Eigenschaftenfenster bisher noch nicht entdecken können. Auch unter den Makros oder Modulen ist er nicht zu finden.

Gruss Nicole

bambi1408


bambi1408

Hallo nochmal

Ich hab jetzt hab ich mal den Code rausgefunden der im Hintergrund beim Klicken von den ABC Tasten noch abläuft. Vielleicht läuft ja auch da was falsch?

Function fktDatensatzklick3()

    Dim DocName As String
    Dim LinkCriteria As String
   
    DocName = "Adressen"
    LinkCriteria = "[NAME] = Forms![Adressen]![Feld159]"
     DoCmd.OpenForm DocName, , , LinkCriteria
   
    ' 30.09.14 Alternativcode
    ' Forms(DocName).Filter = LinkCriteria
    ' Forms(DocName).FilterOn = True
    ' Forms(DocName).Requery

End Function


Mit dem Alternativcode habe ich es auch schon versucht, das funktioniert auch nicht.

Gruss Nicole

Josef P.

#22
Hallo!

Der letzte Code von dir zeigt einen Ablauf, um ein Formular gefiltert zu öffnen.
Ich erkenne keinen Zusammenhang mit dem Filtern durch das Klicken auf die Buchstaben-Umschaltflächen.
Falls das Formular in dem diese Funktionen ausgeführt werden auch das Formular "Adressen" ist, gehört vermutlich einiges umgebaut, um einen wartbaren und einigermaßen sauberen Code zu erhalten.
Der bisher gezeigte Code beeindruckt mich nicht besonders. ;)

Ich kann dir in diesem Forum zeigen, wie man Filtern kann - es wird aber vermutlich nicht möglich sein, deine gesamte Anwendung zu verbessern.
Wenn du bereit bist, dich in VBA einzuarbeiten, kann im Forum sicher geholfen werden. Ansonsten ist das eher ein Auftrag an jemanden, der sich mit Access und VBA auskennt. Das kosten zwar dann etwas, wenn niemand innerhalb des Unternehmens einspringen kann, spart aber vermutlich trotzdem Geld. ;)


ZitatVielleicht läuft ja auch da was falsch?
DocName = "Adressen"
LinkCriteria = "[NAME] = Forms![Adressen]![Feld159]"
DoCmd.OpenForm DocName, , , LinkCriteria

Mit diesem Code wird das Formular "Adressen" geöffnet und dann mit dem Wert der im Feld159 im Formular Adressen steht gefiltert. (Falls es bereits geöffnet ist, wird nur der Filterausdruck angewendet.)

Erkennst du die Absicht hinter diesem Code? Ich erkenne sie nämlich nicht. Ich weiß aber auch nicht, welche Aufgabe das Feld159 hat. Aus dem Namen kann ich nicht viel ableiten. ;)

mfg
Josef

bambi1408

Hallo Josef

Vielen Dank für deine Antwort.
ZitatIch weiß aber auch nicht, was das Feld159 für eine Aufgabe hat.
Das Feld159 ist das Feld wo die ganzen Adressen drin stehen, also das Feld unterhalb von ABCDE.....

ZitatWenn du bereit bist, dich in VBA einzuarbeiten, kann im Forum sicher geholfen werden.
Natürlich bin ich bereit mich in VBA einzuarbeiten und bin über jede Hilfe dankbar. Die Firma hat leider momentan eine schlechte Auftragslage weshalb es nicht möglich ist, jemand externen damit zu beautragen.

Gruss Nicole

Josef P.

Hallo!

ZitatNatürlich bin ich bereit mich in VBA einzuarbeiten
Es könnte auch an der Bereitschaft der Vorgesetzten scheitern, dir dafür Zeit zu geben. ;)

ZitatDas Feld159 ist das Feld wo die ganzen Adressen drin stehen, ...
Kann 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?


Aber erstmal zum Filtern eines gebundenes Formulars:
Dafür würde ich die Filter-Eigenschaft des Formulars verwenden.

Erstelle einmal zum Ausprobieren ein neues Formular als Endlosformular, binde das Formular an die Datenquelle mit den Adressdaten. Am besten erstellst du das in einer Kopie der Anwendung bzw. vielleicht überhaupt in einer kleinen Testanwendung, die du auch zum Download bereitstellen kannst. (Daten anonymisieren, nur die wichtigsten Tabellen und Formulare usw. bereitstellen)

Ich glaube nämlich, dass es einfacher ist, ein einem neuen Formular den Filter/Anzeige-Ablauf vereinfacht nachzubauen, um damit später die Probeme im eigentlich Formular zu finden, als sich gleich auf das vorhanden Formular zu stürzen.

Den Button bitte im Formular-Kopf oder Formular-Fuß einfügen und z. B. mit "cmdSetFilter" bezeichnen.

Teste dann z. B. als Reaktion auf einen Button-Click folgenden Code:
private sub cmdSetFilter_Click()
    SetFormFilter
End Sub

private sub SetFormFilter()
    Me.Filter = "[Name] like 'a*'"
    Me.FilterOn = True
End Sub

=> Du solltest nun nur noch Adressen sehen deren "Name" mit a beginnt.

Der Filterausdruck muss natürlich variabel im Code gestaltet werden können.

=> Umbau:
dim FilterString as String
dim FilterValue as String

FilterValue = "a" ' diese Anweisung könnte z. B. im zuvor gezeigten Select-Case-Block stehen
FilterString = "[Name] like '" & FilterValue & "*'"

Me.Filter = FilterString
Me.FilterOn = True


Anm.: ich hoffe nicht, dass Name zum Problem wird. Wenn er mit [] einklammert ist, sollte Access das eigentlich als Datenfeld annehmen. (Sicher bin ich mir allerdings nicht - aber das sehen wir spätestens beim 1. Test.)

Damit du gleich mit mehreren Buchstaben testen kannst, bauen wir eine Inputbox in die Prozedur ein.
Anm.: Die Inputbox ist nur zum Testen, die muss später wieder weg und durch die Optionsgruppe mit den Buchstaben ersetzt werden.
Zum Testen ist sie aber gut geeignet, da der Code übersichtlich bleibt.

private sub cmdSetFilter_Click()
    SetFormFilter
End Sub

private sub SetFormFilter()
 
    dim FilterString as String
    dim FilterValue as String

    FilterValue = Inputbox("Bitte Anfangsbuchstaben eingeben")
    FilterString = "[Name] like '" & FilterValue & "*'"

    Me.Filter = FilterString
    Me.FilterOn = True

End Sub


Sollten bei diesem Code bei der Eingabe von a Datensätze angezeigt werden und bei der Eingabe von b keine Datensätze kommen, gibt es keine Datensätze die mit b beginnen. ;)

Sollte das jetzt zu einfach gewesen sein, bitte gleich melden bzw. den Code so erweitern, dass die Optionsgruppe verwendet wird.

Anm.: Es sollten mit Google & Co. einige Beispiele zu finden sein, wie ein Formular gefiltert werden kann. Für deinen konrketen Anwendungsfall gehe ich nämlich auf die Besonderheiten Filterwerte in einen SQL-Text zu konvertieren nicht ein. Das brauchen wir hier nur nebenbei und ich will nicht vom eignetlichen Problem zu weit ablenken.

mfg
Josef

MzKlMu

Hallo,
ZitatAnm.: ich hoffe nicht, dass Name zum Problem wird. Wenn er mit [] einklammert ist, sollte Access das eigentlich als Datenfeld annehmen. (Sicher bin ich mir allerdings nicht - aber das sehen wir spätestens beim 1. Test.)
ich würde unter allen Umständen das Feld Name vermeiden. Aus eigener Erfahrung weis, dass das zu den unerklärlichsten Fehlern führt. Auch mit der Klammerung.

Nur als Anmerkung, zum Problem kann ich nichts beitragen.
Gruß Klaus

Josef P.

Zitatich würde unter allen Umständen das Feld Name vermeiden.
Das auf jeden Fall!
Allerdings darf das dann Nicole im Formular korrigieren, da das vermutlich nicht nur beim Filtern vorkommen wird.
Daher dachte ich mir: probieren wir es einfach einmal auf gut Glück mit [Name] in einem Testformular aus. Dann haben wir wenigstens den Beweis, falls bereits [Name] beim Filtern Probleme macht. ;)

mfg
Josef

bambi1408

Vielen Dank Josef, das du mir helfen möchtest.

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. Durch die Umschalttasten erreiche ich lediglich, das er mir in der Tabelle an den Datensatz springt, der mit dem ausgewählten Buchstaben anfängt, also bei B springt er zu dem Anfang der Adressen, wo der Firmenname mit B anfängt. Er listet mir aber nicht nur alle Firmen mit B auf, sondern fängt einfach nur da an und im Alphabet geht es dann normal weiter.
Für die Anzeige eines bestimmten Datensatzes ist der Formularbereich oberhalb der Umschalttasten zuständig. Also wenn ich im Feld159 eine Adresse anklicke, aktualisiert er mir über den Umschalttasten die Einzelheiten zur Adresse. Wie er die Daten da aber genau übergibt ist mir noch nicht klar, das müsste doch eigentlich mit einer Abfrage passieren oder?

Ansonsten werde ich deine Testversuche mal ausführen und schauen wie weit ich komm. Zu einfach ist das nicht unbedingt, ich bin froh wenn wir vorne anfangen, damit ich es auch wirklich nachvollziehen kann :-)

Gruss Nicole

Josef P.

ZitatDurch die Umschalttasten erreiche ich lediglich, das er mir in der Tabelle an den Datensatz springt, der mit dem ausgewählten Buchstaben anfängt, also bei B springt er zu dem Anfang der Adressen, wo der Firmenname mit B anfängt.
Gemäß Code (DoCmd.ApplyFilter) sollte aber nicht zum Datensatz gesprungen werden sondern nur noch die Datensätze angezeigt werden, die mit B beginnen.

mfg
Josef

bambi1408

Josef ich habe jetzt dein Beispiel nachgebaut und alles funktioniert einwandfrei -:)

Jetzt habe ich eine Verständnisfrage: [Name] Bezieht sich das auf das Feld in der Tabelle?

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 :-(