automatisch Filtermöglichkeit anzeigen

Moderator: ModerationP

automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 15. Jun 2017, 18:55

Guten Tag,

ich suche eine Möglichkeit (per VBA?) beim Öffnen eines Formulars automatisch die Funktion "Textfilter - Enthält" anzuzeigen. Bei meiner Suche stoße ich nur auf Beiträge, die mir sagen wie ich einen Filter voreinstelle. Der Anwender soll das Filterkriterium aber selber eingeben können. Ich will ihm nur ein paar Klicks dahin ersparen, weil er das ggf 30x hintereinander macht, wenn er dieses Formular so oft aufrufen muss.

Mit freundlichen Grüßen,

trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon Nouba » 15. Jun 2017, 19:49

Mit der keybd_event API oder vermutlich auch mit Sendkeys kommst Du an's Ziel.
Code: Alles auswählen
'ungetestet
   Me.DeinZuFilterndesTextfeldImFormular.SetFocus
   SendKeys "+{F10}" 'Kontextmenü öffnen
   SendKeys "f"      'f eingeben
   SendKeys "e"      'e eingeben
   SendKeys "~"      'Eingabetaste drücken
mit freundlichen Grüssen Nouba

Wenn beim Lesen eines Beitrags der Eindruck entsteht, dass sich der Fragesteller wenig Mühe gegeben hat, so erhöht das nicht unbedingt die Motivation, eine Antwort zu verfassen.
Nouba
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 17403
Registriert: 13. Mär 2006, 12:55
Wohnort: Berlin

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 20. Jun 2017, 20:04

Danke, Nouba,
das hat genau so geklappt. :D

Mit freundlichen Urlaubsgrüßen,

trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 25. Feb 2021, 18:47

(für alle die Probleme mit der "NumLock"-Taste durch den "Sendkeys"-Befehl haben)

Ich habe noch eine Ergänzung/Änderung anzufügen, da mitlerweile mit neuem Mitarbeiter und neuer Office-Version auch in meiner Anwendung der bekannte Fehler aufgetreten ist, dass "NumLock" sich unkontrolliert ausschaltet. Bei Karl Donaubauer (http://www.donkarl.com/) unter FAQ 7.8 und an anderen Stellen ist dies ja bereits dokumentiert. Die dort aufgeführte API-Lösung erschien mir aber zu aufwending für meinen kleinen einfachen Einsatzbereich.
So habe ich nach einiger Suche weitere Lösungsmöglichkeiten unter https://stackoverflow.com/questions/25977933/sendkeys-is-messing-with-my-numlock-key-via-vba-code-in-access-form (englisch) gefunden. Dabei war die folgende Lösung, die die "Sendkeys"-Funktion der Shell vom Windows Script Host nutzt, für meinen Fall am einfachsten und funktioniert genauso gut wie der ursprüngliche Code:
Code: Alles auswählen
        Set WshShell = CreateObject("WScript.Shell")
        Me.Wert1.SetFocus                       'Mein Textfeld
        WshShell.SendKeys "+{F10}", True        'Kontextmenü öffnen
        WshShell.SendKeys "f", True             'f eingeben für "TextFilter"
        WshShell.SendKeys "e", True             'e eingeben für "enthält"
        WshShell.SendKeys "~", True             'Eingabetaste drücken

Leider scheint es ja keine Möglichkeit zu geben diese Funktionalität über Access-Menüband-Befehle aufzurufen. Sollte ich da etwas übersehen haben, bin ich für Hinweise sehr dankbar.

Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon knobbi38 » 26. Feb 2021, 00:28

Hallo trawideli,

man könnte natürlich auch direkt den Button aus dem Kontextmenü ausführen, anstatt mit Sendkeys zu arbeiten: (aircode)
Code: Alles auswählen
Application.CommandBars.FindControl(1, 10080).Execute

Das setzt natürlich voraus, daß zu dem Zeitpunkt das Kontextmenü für ein Feld vom Datentyp Text aktiv ist, also den Fokus besitzt. Wenn die Aktion auf einem aktiven numerischen Feld gemacht wird, gibt es demnach folgerichtig einen Automatisierungsfehler, den man ggf. auch abfangen sollte, aber das Problem besteht natürlich auch bei Sendkeys.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3263
Registriert: 02. Jul 2015, 14:23

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 02. Mär 2021, 20:16

Hallo Ulrich,

knobbi38 hat geschrieben:
Code: Alles auswählen
Application.CommandBars.FindControl(1, 10080).Execute


Das sieht doch schon mal genau nach dem aus, was ich gesucht habe.
Jetzt musst du mir aber 1. noch verraten wie ich das in den Tiefen der Microsoft-Office-Dokumentation (oder irgendwo im Netz) hätte finden sollen, 2. wie ich herausfinde, was die letzte Zahl bedeutet (es ist eine ID, aber wo kommt sie her) und 3. was diese aufleuchtende Fehlermeldung mir sagen will:

Code: Alles auswählen
Laufzeitfehler (mit elend langer Nummer) - Die Methode ‚Execute‘ für das Objekt ‚_CommandBarButton‘ ist fehlgeschlagen

Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon knobbi38 » 03. Mär 2021, 01:28

Hallo trawideli,

  1. keine Ahnung, ob das irgendwo dokumentiert ist, aber der Dialog wird über ein Kontextmenü geöffnet und dieses kann man sich genauer anschauen.
  2. die Controls in den Commandbars haben IDs und diese habe ich einfach aus dem Commandbutton des Kontextmenü ausgelesen.
  3. dieser Commandbutton ist nur dann aktiv, wenn dieser im Kontextmenü auch vorhanden ist, was vom aktuellen Kontext abhängig ist - daher der Name. Ist das nicht der Fall, weil das aktivierte Feld nicht vom Datentyp Text ist, schlägt die .execute Methode natürlich fehl und der Aufruf produziert dann den Fehler. Darauf hatte ich aber schon hingewiesen.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3263
Registriert: 02. Jul 2015, 14:23

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 15. Apr 2021, 21:29

Hallo Ulrich,

aufgrund der spärlichen Information, bin ich dann mal in die Materie eingetaucht, soweit mir das mit den frei zur Verfügung stehenden Mitteln möglich war. Leider gibt es nicht viel zu finden und ohne fundierte Englischkenntnisse und Kenntnisse darüber, welche Begriffe wie verwendet werden, ist man völlig aufgeschmissen. Somit habe ich zwar einiges gelernt, bin aber noch nicht zu einem brauchbaren Ergebnis gekommen.

knobbi38 hat geschrieben:die Controls in den Commandbars haben IDs und diese habe ich einfach aus dem Commandbutton des Kontextmenü ausgelesen.

Wie macht man genau das (und wo finde ich die Information dazu)?

Das einzige, was annähernd hilfreich, aber keinesfalls einfach zu finden war, steht in dem Artikel „CommandBars (Part III) - Using Built-in Shortcut“ von Dale Fye in „Expert Exchange“ https://www.experts-exchange.com/articles/18341/CommandBars-Part-III-Using-Built-in-Shortcut-Menus.html. Jetzt handelt es sich aber nicht nur um ein Kontextmenü, sondern um eine Untermenü eines Kontextmenüs. Dazu habe ich herausgefunden, dass dieses sich in der "Controls"-Auflistung zu diesem Commandbutton ("Textfilter") befinden. Dies wird hier beschrieben: https://www.techrepublic.com/article/referencing-command-bar-and-control-objects-in-access/. Zudem ist es kein Commandbutton (was der Konstanten "msoControlButton" entspräche, sondern ein Menü ("msoControlPopup"). (Dass "Popup" in dem Fall für Menüs bzw. Kontextmenüs verwendet wird, habe ich erst durch diesen Artikel von André Minhorst festgestellt: https://access-basics.de/index.php/Kontextmenues.html.)
Mit all dieser Information habe ich es geschafft mir die gewünschten Objekte und einige Eigenschaften in einer Datei ausgeben zu lassen. Und konnte jetzt tatsächlich sehen, dass "Textfilter ... enthält..." die ID=10080 hat.

knobbi38 hat geschrieben:dieser Commandbutton ist nur dann aktiv, wenn dieser im Kontextmenü auch vorhanden ist, was vom aktuellen Kontext abhängig ist - daher der Name. Ist das nicht der Fall, weil das aktivierte Feld nicht vom Datentyp Text ist, schlägt die .execute Methode natürlich fehl und der Aufruf produziert dann den Fehler. Darauf hatte ich aber schon hingewiesen.

Ich habe noch nicht herausgefunden, was ich noch einstellen muss, damit die gewünschte Anzeige auch erscheint. Alle Versuche mit ".enabled"- oder ".visible"-Eigenschaften haben nichts bewirkt. Der Fokus liegt selbstverständlich auf dem Textfeld, in dem gefiltert werden soll. Und da ich die Ausgabe wie oben beschrieben in diesem Formular generiert habe, steht dieses Kontextmenü ja hier auch zur Verfügung, oder? Zu Fuss tut es das jedenfalls. Also was fehlt noch? Was kann ich noch überprüfen?

Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon knobbi38 » 16. Apr 2021, 00:02

Hallo trawideli,

das ist mit Sicherheit kein Einsteigerthema mehr und man muß sich ein bißchen mit den Objektmodellen beschäftigen, in diesem Fall mit der "Objektbibliotheksreferenz für Microsoft Office". In älteren Access-Versionen kommt man auch einfach mit {F1} an die Hilfe-Informationen.
trawideli hat geschrieben:
knobbi38 hat geschrieben:die Controls in den Commandbars haben IDs und diese habe ich einfach aus dem Commandbutton des Kontextmenü ausgelesen.
Wie macht man genau das (und wo finde ich die Information dazu)?

Wie man das macht ist relativ einfach:
Da man weiß, daß man ein Kontextmenü sucht, fängt man damit an, die Application.Commandbars zu analysieren. Man schreibt sich eine kleine Routine und läßt sich die Namen der Commandbars ausgeben und die Typen. Kontextmenüs sind dabei vom Typ "msoBarTypePopup". Also begrenzt man die Commandbars auf diese Typen. Wenn man sich die Namen anschaut, kann man mit etwas Phantasie darauf schließen, daß eventuell die Commandbar "Column Filter" näher zu betrachten ist. Außerdem ist bekannt, daß das CommandBarControl von Typ "msoControlPopup" sein muß, weil ein "Untermenü" geöffnet wird und die Caption "Text&filter" sein muß. Anschließend läßt man sich dann einfach alle Control-Ids und -Captions auflisten und erhält so die benötige ID. Wenn man möchte, könnte man sich auch gleich alle anderen Eigenschaften der Controls ausgeben lassen, entweder im Direktfenster, oder man bedient sich des Überwachungsfensters und arbeitet mit Conditional Breakpoints.
Das Ergebnis des "quick and dirty"-Codes würde dann ungefähr so aussehen:
Code: Alles auswählen
Sub InspectComandbars()
  Dim cbr As CommandBar
  Dim cbc As CommandBarControl
  Dim i As Long
 
  For Each cbr In Application.CommandBars
    If cbr.Name = "Column Filter" Then
      Debug.Print cbr.ID, cbr.Name, cbr.NameLocal
     
      For Each cbc In cbr.Controls
        If cbc.Caption = "Text&filter" And cbc.Type = msoControlPopup Then
          Debug.Print cbc.ID, cbc.Caption
         
          For i = 1 To cbc.Controls.Count
            With cbc.Controls(i)
              Debug.Print , cbc.Controls(i).ID, cbc.Controls(i).Caption
            End With
          Next i
        End If
      Next cbc
    End If
  Next cbr
End Sub

trawideli hat geschrieben:...und wo finde ich die Information dazu?
Wie oben beschrieben, das Objektmodell durchforsten oder es gab mal ein Buch mit dem Titel: "Microsoft Office 2000 Visual Basic Programmierhandbuch - reference book" von MicrosoftPress. Dort wurden noch solche Dinge beschrieben.
trawideli hat geschrieben:Ich habe noch nicht herausgefunden, was ich noch einstellen muss, damit die gewünschte Anzeige auch erscheint.
Zur Anzeige bringt man das Kontextmenü, indem für das Control (CommandBarButton) die Exexute Methode ausgeführt wird. Aber wie vorher schon gesagt: dieses Kontextmenü steht nicht immer zur Verfügung und die Execute Methode kann nur aufgerufen werden, wenn das aktive Feld vom Datentyp Text ist - dieses wird alleine von Access verwaltet. Ich bin mir nicht ganz sicher, aber ich glaube, daß dieses Kontextmenü nicht unter der "echten" Runtimeumgebung zur Verfügung steht.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3263
Registriert: 02. Jul 2015, 14:23

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 06. Mai 2021, 18:26

knobbi38 hat geschrieben:Zur Anzeige bringt man das Kontextmenü, indem für das Control (CommandBarButton) die Exexute Methode ausgeführt wird. Aber wie vorher schon gesagt: dieses Kontextmenü steht nicht immer zur Verfügung und die Execute Methode kann nur aufgerufen werden, wenn das aktive Feld vom Datentyp Text ist - dieses wird alleine von Access verwaltet. Ich bin mir nicht ganz sicher, aber ich glaube, daß dieses Kontextmenü nicht unter der "echten" Runtimeumgebung zur Verfügung steht.

Hallo Ulrich,
ich habe keine Runtime-Version laufen. Wenn ich in dem Formular bin, kann ich das Kontextmenü aufrufen. Versuche ich aber die Execute-Methode erhalte ich weiterhin diese Fehlermeldung
trawideli hat geschrieben:
Code: Alles auswählen
Laufzeitfehler (mit elend langer Nummer) - Die Methode ‚Execute‘ für das Objekt ‚_CommandBarButton‘ ist fehlgeschlagen

Aus irgendeinem Grund habe ich aus VBA heraus keinen Zugriff darauf. Jegliche Versuche mit der Enabled-Eigenschaft die Menüpunkte zu aktivieren, sind fehlgeschlagen. Hast du irgendeine Idee, warum ich das nicht darf? Ich erhalte auch keine Fehlermeldung dazu. Der Befehl bleibt einfach ohne Auswirkung.
Und wie sage ich Access, dass er das Kontextmenü dieses Textfeldes nehmen soll? Wenn ich mir das mit der oben erwähnten "What's This"-Prozedur ausgeben lasse, fehlen viele Befehle, die enthalten sind, wenn ich im Textfeld rechtsklicke und den Menüpunkt "What's This" auswähle. Erstaunlicherweise kann ich diesen selbst eingefügten Menüpunkt über VBA ansteuern und ausführen lassen. Geht das vielleicht einfach bei den Integrierten Befehlen nicht?

Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon knobbi38 » 07. Mai 2021, 10:25

Hallo trawideli,

Jegliche Versuche mit der Enabled-Eigenschaft die Menüpunkte zu aktivieren, sind fehlgeschlagen.

Ich verstehe jetzt nicht ganz, was die Eigenschaft "enable" damit zu tun haben sollte.
Und wie sage ich Access, dass er das Kontextmenü dieses Textfeldes nehmen soll?

Gar nicht! Hatte ich das nicht beschrieben? Access nimmt das Kontextmenü des gerade aktiven Feldes und was im Kontextmenü möglich ist oder nicht, ist abhängig vom Datentyp des Textfeldes.
Ob du integrierte Kontextmenüs erweitern kannst, kann ich dir nicht sagen, daß habe ich so noch nicht probiert.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3263
Registriert: 02. Jul 2015, 14:23

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 11. Mai 2021, 12:20

Hallo Ulrich,
knobbi38 hat geschrieben:Ich verstehe jetzt nicht ganz, was die Eigenschaft "enable" damit zu tun haben sollte.

Ich habe mir einen eigenen Menüpunkt in allen Kontextmenüs angelegt "What's This", der mir beim Anklicken das aktuelle Kontextmenü und alle Untermenüs zu diesem in eine Datei schreibt. Diesen Menüpunkt kann ich mit der Execute-Methode ansprechen und ausführen lassen. Daraufhin habe ich mir die Schaltfläche "Enthält..." (mit der ID=10080) auch in das oberste Kontextmenü gelegt. Diese konnte ich aber nicht ansprechen und ausführen lassen. Der einzige Unterschied, den ich feststellen konnte, war, dass die Eigenschaft "Enabled" auf "False" stand. Ich habe es aber auch nicht geschafft diese auf "True" zu setzen. Der Befehl gibt keine Fehlermeldung zurück, sondern tut einfach nichts. Die Enabled-Eigenschaft der Schaltfläche "What's This" konnte ich ändern. Setze ich diese auf "False", kann ich diesen Menüpunkt auch nicht mehr per VBA ausführen (mit gleicher Fehlermeldung). Deshalb denke ich, dass die Enabled-Eigenschaft etwas damit zu tun hat, dass diese Fehlermeldung kommt.
knobbi38 hat geschrieben:Access nimmt das Kontextmenü des gerade aktiven Feldes und was im Kontextmenü möglich ist oder nicht, ist abhängig vom Datentyp des Textfeldes.

Durch Rechtsklick auf das Textfeld von Datentyp "Memo" (oder "Langer Text", wie es jetzt heißt) erhalte ich das gewünschte Kontextmenü. Ich habe den Fokus mit der ".Setfocus"-Methode auf dieses Feld gesetzt. In VBA scheint das Kontextmenü aber nicht komplett zur Verfügung zu stehen. Denn als ich mir mit dem über VBA aktivierten Menüpunkt "What's This" das Kontextmenü in ein Datei habe schreiben lassen, fehlten die Filtermöglichkeiten. Ich vermute, dass dieses Menü erst zur Laufzeit bei Betätigung der rechten Maustaste generiert wird.

Aber es hat ja auch nicht funktioniert als ich den Menüpunkt "Enthält..." explizit ins oberste Kontextmenü gesetzt habe und es auch zu sehen war. Ich konnte es sowohl mit Rechtsklick sehen und auswählen. Und es wurde mir in meiner Logdatei angezeigt.

Ich habe keine Ideen mehr, wo ich noch gucken könnte. Das ist soweit intern in Access, da fehlt mir jegliche Kenntnis zu. Ich bin schon mächtig stolz, dass ich bis hierher vorgedrungen bin.

Viele Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon knobbi38 » 11. Mai 2021, 14:05

Hallo trawideli,

ich fürchte, dabei kann ich dir dann auch nicht mehr weiter helfen und ich weiß auch nicht, ob das überhaupt zielführend ist. Im Zweifelsfall mußt du dir halt selber ein eigenes Kontextmenü erstellen.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3263
Registriert: 02. Jul 2015, 14:23

Re: automatisch Filtermöglichkeit anzeigen

Beitragvon trawideli » 11. Mai 2021, 14:29

Danke Ulrich,

es schien so zum Greifen nahe ... und ich muss sage, ich habe einiges gelernt, das ich möglicherweise an anderer Stelle einsetzen kann. In diesem Fall werde ich dann doch den Windows-Script-Host bemühen.

Grüße,
trawideli
PS.: Ich bin nur an Dienstagen und Donnerstagen hier.
System: Win10 mit Access2016 (voher Acc07)
trawideli
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 220
Registriert: 29. Apr 2014, 10:43


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste