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 ⏩

Josef P.

Zitat.. das er mir in dem ungebundenen Listenfeld sortiert...
Du meinst "filtert" und nicht "sortiert", oder?

ZitatWie kann ich die DB hier hochladen? Die ist 3 MB, obwohl sie nur eine Tabelle, eine Abfrage und ein Formular enthält.
Komprimieren und dann zippen. Sollte das nicht reichen, könntest du noch mit einem /decompile (
http://www.donkarl.com?FAQ1.23) gefolgt von komprimieren die Größe verkleinern.
Oder du erstellst eine leere Datei und importierst alles aus der alten Daten. Das sollte dann wie /decompile + komrimieren wirken.

mfg
Josef

Hondo

Hallo,
eine Frage sei mir sicher gestattet, hat das alles noch mit dem ursprünglichen Thema zu tun?
Falls nicht, bitte bei weiteren/anderen Fragen ein neues Thema beginnen, danke.

Gruß Andreas

bambi1408

Hallo Josef

klar meinte ich gefiltert und nicht sortiert...sorry  :)

Ich lade mal eben meine aktuelle DB hoch und im VBA-Code sind auch ein paar Sachen drin, die ich versucht habe, aber haben nicht funktioniert. Ich habe sie drin stehen lassen, einfach auskommentiert.

Was ich gemerkt habe ist folgendes: beim aktualisieren des Listenfeldes aktualisisert er mir eigentlich immer die Adressen, wo ich als letztes auf dem Umschalter war. Also wenn ich z.b. auf B gehe und danach auf C, filtert er von B an, wenn ich dann auf D gehe von C an.

Was er mir nur teilweise macht, ist das er den ersten Eintrag markiert. Das funktioniert mal und mal nicht.

Gruss Nicole

Josef P.

#48
Hallo!

Den Zweck der Listbox verstehen ich nicht.
Steht in der Listbox im Originalformular der Name in der gebundenen Spalte?
Dann könnte ich mir zumindest vorstellen, dass man mit Klick auf die Listbox zum jeweiligen Datensatz springt. (Wobei das mit gesetztem Filter schwierig wird, wenn die Auswahl nicht in den gefilterten DS enthalten ist.)

Private Sub Liste9_AfterUpdate()
   GotoNameRecord Me.Liste9.Value
End Sub

Private Sub GotoNameRecord(ByVal NameToFind As String)
   With Me.RecordsetClone
      .FindFirst "[NAME] = '" & Replace(NameToFind, "'", "''") & "'"
      If Not .NoMatch Then
         Me.Bookmark = .Bookmark
      End If
   End With
End Sub



Die Aktualisierung der Listbox könntest du als Reaktion auf Form.Current umsetzen.
Private Sub Form_Current()
   Me.Liste9.Requery
End Sub


oder beim Filtern des Formulars:
Private Sub SetFormFilter()

    ...
   
    Me.Filter = FilterString
    Me.FilterOn = True

    Me.Liste9.Requery

End Sub


Mir kommt die Bedienung des Formulars etwas eigenartig vor.
Klickt man auf einen Filterbutton, werden die Datensätze nach diesem Anfangszeichen gefiltert. Die Listbox enthält aber auch Namen, die darüber hinaus gehen.
Klickt man dann auf einen Eintrag diese Liste soll was passieren?

Für mich wäre es logischer, dass mittels der Buttons das Formular und die Listbox gefiltert werden und dann mit Auswahl eines Datensatzes in der Listbox zu diesem DS gesprungen wird.

Oder es wird mit den Buttons die Listbox gefiltert und die Auswahl in der Listbox zeigt dann diesen Datensatz an.

Was macht der Code
' ersten Datensatz der Liste markieren ...
Me!Liste9.Selected(0) = True

in der Prozedur "GetNameFilterValue". Welchen Anteil hat dieser Code um den Filterwert zu ermitteln?
Falls er keinen hat, gehört er dort nicht rein. ;)
(Single-Responsibility-Prinzip)

BTW: in der Tabelle fehlt ein Primärschlüssel.

mfg
Josef

bambi1408

Guten Morgen

ZitatFür mich wäre es logischer, dass mittels der Buttons das Formular und die Listbox gefiltert werden und dann mit Auswahl eines Datensatzes in der Listbox zu diesem DS gesprungen wird.
Also ich denke das ist in etwa so wie im Original oder?

Also das Formular hat ja im Original im oberen Bereich die Felder, wo die Daten des aktuell ausgewählten Datensatzes ausgegeben werden. Dann kommt die Optionsgruppe und darunter das ungebundene Listenfeld. In diesem Listenfeld sollen die Datensätze gefiltert angezeigt werden, je nach dem welchen Umschalter man halt gedrückt hat. Im Original kann man dann im Listenfeld einen Datensatz markieren und der wird dann auch in die Felder oberhalb der Optionsgruppe ausgegeben.

Ich hatte jetzt einfach mal ein bisschen im Internet wegen der Aktualisierung des Listenfeldes mit Optionsgruppe gesucht und dann ein paar Sachen ausprobiert, die aber nicht wirklich zum Erfolg geführt haben. Hab die Codes davon aber drin stehen lassen und einfach auskommentiert, damit ich noch weiss was ich probiert habe.

ZitatWas macht der Code
' ersten Datensatz der Liste markieren ...
Me!Liste9.Selected(0) = True
Der soll mir eigentlich nach Betätigung eines Umschalters immer den ersten Datensatz der nun gefiltert in dem Listenfeld steht markieren, damit dieser schon oben aktualisiert wird. Muss ich das an eine andere Stelle setzen?

ZitatBTW: in der Tabelle fehlt ein Primärschlüssel.
In der Originaltabelle übernimmt die Kd.Nr. den Primärschlüssel.

Gruss Nicole



Josef P.

ZitatIn diesem Listenfeld sollen die Datensätze gefiltert angezeigt werden, je nach dem welchen Umschalter man halt gedrückt hat.
Das Listenfeld wird aber nicht nach den Buchstaben gefiltert, sondern nach dem aktuell im Formular angezeigten Namen.

ZitatIm Original kann man dann im Listenfeld einen Datensatz markieren und der wird dann auch in die Felder oberhalb der Optionsgruppe ausgegeben.
Wird auf genau diesen Datensatz gefiltert oder wird zum Datensatz gesprungen?

Zitat
ZitatWas macht der Code
' ersten Datensatz der Liste markieren ...
Me!Liste9.Selected(0) = True
Der soll mir eigentlich nach Betätigung eines Umschalters immer den ersten Datensatz der nun gefiltert in dem Listenfeld steht markieren, damit dieser schon oben aktualisiert wird. Muss ich das an eine andere Stelle setzen?
Bei meiner Frage ging es vor allem um: Was macht der Code in der Prozedur "GetNameFilterValue".
Stell dir vor du benötigst an anderer Stelle im Formular auch den Filterwert. Dann verwendest du die Funktion GetNameFilterValue, da diese dem Namen nach genau diesen liefert. Anschließend wunderst du dich, warum in der Listbox der markierte Eintrag geändert wurde.

ZitatIn der Originaltabelle übernimmt die Kd.Nr. den Primärschlüssel.
Dann solltest du auf diesen PK die Datensatzauswahl auslegen.
=> Kundennummer in die Listbox anfügen (sichtbar oder unsichtbar ist egal) und nach der Auswahl eines Eintrags in der Listbox zum Datensatz mit dieser Kundennummer springen.


BTW: Wären die anzuzeigenden Datenfelder in einem Unterformular, müsstest du nicht einmal Code dafür erstellen, da dann eine Verknüpfung vom Unterformular zum Listenfeld ausreichen würde.
Diese Variante behandlen wir in diesem Thread bitte nicht näher, wir schauen nur, wie wir die konvertierten Makros zum laufen bringen. ;)
.. also Refaktoring inkl. Korrektur ohne das Ergebnis bzw. die Schnittstellen zu ändern.

mfg
Josef

bambi1408

Ich hab das Ganze jetzt mal ins Original eingebaut und soweit funktioniert es. Was er mir allerdings nicht macht, das er mir oberhalb der Optionsgruppe die Einzelheiten zu der angewählten Adresse ausgibt.
Hier mal der Code der denke ich diese Aktion eigentlich betreffen sollte:

Private Sub NAMEF_AfterUpdate()

    DoCmd.DoMenuItem A_FORMBAR, A_RECORDSMENU, A_REFRESH, , A_MENU_VER20

End Sub

Private Sub NAMEF_Change()

On Error GoTo Err_NAMEF_Change


    DoCmd.DoMenuItem A_FORMBAR, A_RECORDSMENU, A_REFRESH, , A_MENU_VER20

Exit_NAMEF_Change:
    Exit Sub

Err_NAMEF_Change:
    MsgBox Error$
    Resume Exit_NAMEF_Change

End Sub

Ist der Code falsch oder passt das jetzt mit dem Filter nicht?

Private Sub Feld159_GotFocus()
    Me.Requery
End Sub

Das kann ich im Original nicht rausnehmen, obwohl es in der Testumgebung nicht nötig ist. Aber im Original aktualisiert er mir dann die Liste wieder nicht.

Gruss Nicole

Josef P.

ZitatAber im Original aktualisiert er mir dann die Liste wieder nicht.
Dann musst du im Original selbst für die Aktualisierung sorgen. ;)
Eine Liste aktualisiert man mit Me.Listboxname.Requery und nicht durch das Aktualisieren der Datenquelle des Formulars. Wie und wo du diese Aktualisierung für dein Szenario einbauen kannst, zeigte ich dir schon.

Im Original ist für meinen Geschmack ziemlich viel "Pfusch"-Code enthalten. Vor allem diese DoMenuItem-Anweisungen solltest du ersetzen.
DoCmd.DoMenuItem A_FORMBAR, A_RECORDSMENU, [b]A_REFRESH[/b], , A_MENU_VER20
steht vermutlich für
Me.Refresh

Dafür musst du dich aber selbst etwas in VBA und das Access-Objektmodell einarbeiten. Im Forum ist mir das zu viel Aufwand.
Ich helfe gerne beim Konzept und bei Problemen einer Code-Verbesserung, aber umsetzen will ich sie nicht im Forum.

mfg
Josef

bambi1408

Vielen Dank für Deine Antwort.


Kannst Du mir vielleicht noch sagen, wie ich es jetzt in meiner Testumgebung hinbekomme, das wenn ich jetzt einen Datensatz in der Liste anwähle, er mir den oben reinschreibt? Also oberhalb der Optionsgruppe, in die Felder?

ZitatEine Liste aktualisiert man mit Me.Listboxname.Requery und nicht durch das Aktualisieren der Datenquelle des Formulars. Wie und wo du diese Aktualisierung für dein Szenario einbauen kannst, zeigte ich dir schon.
Das hatte ich im Original so versucht, aber wenn ich das so wie in der Testumgebung nur bei dem Sub SetFormFilter() unterbringe, aktualisiert er mir sie halt nicht.

Gruss Nicole



Josef P.

Dein Listenfeld hängt vom im Formular angezeigten Datensatz ab.
Wenn du die Abhängigkeit auf die Optionsgruppe verlagerst, kannst du das Ändern der Optionsgruppe verwenden, um das Listenfeld zu aktualisieren.

Im gezeigten Testformular funktioniert das nur so:
1. Buchstaben in Optionsgruppe wählen
2. Formular mit Optionsgruppe filter => angezeigter Datensatz ändert sich
3. Listenfeld aktualisieren (da nun ein neuer Wert im Textfeld "NameF" steht.)

mfg
Josef

bambi1408

Ok ich danke dir ganz herzlich für deine ausführliche Hilfe. Ich hoffe ich bekomme es jetzt so hin. Das ganze scheint etwas instabil zu laufen, da es mal klappt und mal nicht. Bei mir Zuhause klappt es mit dem Original meistens sehr gut, im Geschäft dagegen meistens eher nicht. Ist halt da ein anderes BS und das liegt dann vielleicht wirklich an dem ganzen Müll der im VBA drin steht.

Vielen Dank noch einmal und Gruss
Nicole

Beaker s.a.

Hallo Josef,
Vor allem diese DoMenuItem-Anweisungen solltest du ersetzen.
Man sieht es ja Gottseidank nicht mehr so häufig; - aber gibt es irgendeine Liste,
die man heranziehen könnte um diese Anweisungen übersetzen zu können.
Da könne man eine Hilfe dazu präzisieren.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Josef P.

Hallo!

Ich kenne keine Liste. Hab aber auch noch nie danach gesucht. ;-)

mfg
Josef

bahasu

Hi,
Zitat von: Beaker s.a. am November 04, 2016, 16:25:35
Hallo Josef,
Vor allem diese DoMenuItem-Anweisungen solltest du ersetzen.
Man sieht es ja Gottseidank nicht mehr so häufig; - aber gibt es irgendeine Liste,
die man heranziehen könnte um diese Anweisungen übersetzen zu können.

meinst Du etwas wie: http://access.mvps.org/access/RunCommand/domenuitem.htm

Harald
Servus

Beaker s.a.

Hallo Harald,
Ja, genau, - danke.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)