Flexibler Autofilter für Excel [5.Update] 15.11.2020

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Flexibler Autofilter für Excel [5.Update] 15.11.2020

20 Oct 2018, 06:20

Hallo zusammen,

1. Update v. 09.08.2020:
- Enthält-Filter ergänzt

2. Update v. 14.08.2020:
- Der Enthält-Filter funktioniert nur für max. 2 Kriterien und ist nur für Text anwendbar (entsprechend angepasst)
- Tabs am Beginn oder Ende eines Kriteriums werden ignoriert (Idee von Jakobus)

3. Update v. 20.08.2020:
- Trennung der Filter auf 2 Hotkeys: Strg+E => "Enthält" / Strg+R => "Ist gleich" / Strg+Shift+R => Rücknahme eines Spaltenfilter bleibt für alle Filterarten gleich
- Das Auswahlmenü entfällt, da unergonomisch
- Bei mehr als 2 Kriterien und Hotkey Strg + E ("Enthält"), wird eine Abfrage angezeigt, ob stattdessen mit "Ist Gleich" gefiltert werden soll.
- Mehrere Tabs und Leerzeichen zum Beginn / Ende der Kriterien werden ignoriert

4. Update v. 31.10.2020:
- Bug entfernt, wodurch eine Hinweis-Msgbox immer an der falschen Stelle erschien
- Überflüssigen Ausnahmehinweis bei Strg+Shift+R (=Filter für aktive Spalte löschen) entfernt. (Dieser erschien z.B. falls man den Cursor ausserhalb des Filterbereiches plaziert und dann diesen Hotkey gedrückt hatte.)

5. Update v. 15.11.2020:
- ListObjects Unterstützung (=Formatierung als Tabelle) hatte nicht mehr funktioniert
- Excel Schnellassistent, welcher manchmal angezeigt wurde, wird am Ende mit 2 x ESC geschlossen
- kleine Verbesserung, Clipboard wird sofort in Variable gespeichert, was für mehr Zuverlässigkeit sorgt


dieses Skript nutze ich schon seit einiger Zeit und möchte es gern teilen, da ich es sehr praktisch finde :D
Es ermöglicht einen Filter in Excel für die in der Zwischenablage befindlichen Werte zu setzen.


Filter setzen:
Hierzu kopiert man zunächst Werte in die Zwischenablage und klickt in eine Zelle der Spalte für die man diese Werte als Filter einstellen möchte. Mit dem Hotkey Strg+R, werden nur exakte Treffer (Ist gleich) und mit Strg+E alle Treffer (Enthält) angezeigt. (Achtung: Der Enthält-Filter funktioniert nur mit max. 2 Kriterien als Textfilter. Werden mehr als 2 Kriterien in die Zwischenablage kopiert, wird eine Abfrage angezeigt, ob stattdessen mit "Ist Gleich" gefiltert werden soll.) Kopiert man erneut Werte in die Zwischenablage, lassen sich auf die gleiche Weise weitere Spalten filtern.

Filter löschen:
- Zurücknehmen lässt sich der Filter für pro Spalte einfach, indem man wieder in eine Zelle der Spalte klickt und dann den Hotkey Strg+Shift+R drückt.
- Alle Filter lassen sich über den Excel Shortcut Strg+Shift+L ein-/ und ausschalten. (Danke an Jakobus für diesen Hinweis)

Einschränkungen:
- Hat man die Werte bereits in der Zwischenablage und führt in der Zieltabelle noch andere Operation durch, wie z.B. das Löschen eines anderen bereits gesetzten Filters, so muss man die Daten erneut in die Zwischenablage kopieren, weil Excel die Zwischenablage verwirft.
- Probleme gibt es, wenn ein Filter nur für bestimmte Spalten aktiviert ist und man aber über andere Spalte filtern möchte, für die der Filter nicht aktiviert ist. -> Am sichersten ist es daher, wenn in der Zieltabelle entweder noch keine Filter oder für alle Spalten Filter aktiviert sind.

Ich konnte bisher auch in großen Listen mit ca. 100.000 Einträgen keine Einschränkungen entdecken.

Viel Spaß...

Code: Select all




;Update Ver. 5

#IfWinActive ahk_class XLMAIN
^e::  ;;Autofilter in Excel <Enthält> falls max. 2 Kriterien in der Zwischenablage. (Funktioniert nur für Zellen, die als Text interpretiert werden)
Exact_InStr := 2 ;=Enthält
GoSub Filter_Enthaelt
return

^r:: ;;Autofilter in Excel <Ist gleich> mit mehreren Daten setzen, die in der Zwischenablage gespeichert sind.
Exact_InStr := 1 ;=Ist gleich
Filter_Enthaelt:
setbatchlines, -1
xl := Excel_Get()

if !IsObject(xl)
  {
    msgbox,4096,, Es konnte keine Verbindung zu Excel aufgebaut werden.
    return
  }

MyClipBoard := Clipboard
;ermittle die Anzahl der Zeilen in der Zwischenablage
Anz_Zeilen := 0
Loop, parse, MyClipBoard, `n, `r
  {
    If (A_LoopField = "")
      continue
    Anz_Zeilen++
  }

If (Anz_Zeilen = 0 or Trim(MyClipBoard) = "") ;falls keine Zeile aktiv
  {
    msgbox,4096,, Um für bestimmte Daten einen Autofilter einzustellen, bitte diese vorher in die Zwischenablage kopieren, dann in die zu filternde Spalte klicken, falls diese abweicht und dann Strg + R um den Autofilter zu aktivieren.`n`nMit Strg+Shift+R lässt sich der Autofilter für die aktive Spalte wieder löschen.
    xl := Anz_Zeilen := MyClipBoard := ""
    return
   }

FilterAlreadySet := True
If (xl.ActiveSheet.AutoFilterMode = 0 && !isObject(xl.ActiveCell.ListObject)) ;wenn Autofilter nicht aktiviert
  {
    try
      {
         xl.ActiveSheet.UsedRange.AutoFilter ;:= true ;Aktiviere Autofilter
         FilterAlreadySet := False
      }
 }

r := xl.ActiveSheet.AutoFilter.Range
If (r.Column = "") ;falls ggf. ListObject und noch kein Autofilter aktiviert
  {
    try xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Range.AutoFilter ;Autofilter aktivieren
    try r := xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Autofilter.Range
  }

;Check, ob aktive Zelle im Filterbereich steht
If !(xl.ActiveCell.Column >= r.Column && xl.ActiveCell.Column <= r.Column + r.Columns.Count - 1)
  {
    If FilterAlreadySet
      msgbox,,, Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken oder den Autofilter erst deaktivieren!
    else
      msgbox,,, Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken!
    xl := r := Anz_Zeilen := FilterAlreadySet := MyClipBoard := ""
    return
  }

col := (xl.ActiveCell.Column - xl.ActiveSheet.Autofilter.Range.Column + 1) ;ermittelt die Spalte für den Autofilterbereich wo der Filter gesetzt werden soll
If (col = "")
  col := xl.ActiveCell.Column - xl.ActiveSheet.Usedrange.Column + 1 ;ermittelt die Spalte falls kein Autofilterbereich existiert

; Exact = Ist gleich (1), InStr = Enthält (1->Defaultwert, falls Menu mit Esc abgebrochen wird o. mehr als 2 Kriterien)
If (Anz_Zeilen >2 && Exact_InStr = 2) ;Filter "enthält" funktioniert nur, bis max. 2 Kriterien.
	{
		Exact_InStr := 1
    MsgBox,% 4097+48,, Bei mehr als 2 Suchkriterien ist nur Filter "Ist gleich" möglich.`n`nDiesen jetzt anwenden?
    IfMsgBox, cancel
      {
        xl := r := Anz_Zeilen := FilterAlreadySet := MyClipBoard := ""
        return
      }
  }

;Array definieren für die Anzahl der Zeilen
arr := ComObjArray(VT_VARIANT:=12, Anz_Zeilen * Exact_InStr)
index := 0
If (Exact_InStr = 2) ;Wenn enthält gewählt wurde, muss der Suchbegriff in Wildcards "*Suchbegriff*"
  {
    If (Anz_Zeilen = 1)
     {
        arr[0] := "*" Trim(ClipBoard, " `t`r`n") "*"
        If isObject(xl.ActiveCell.ListObject) ;wenn es sich um einen als Tabelle formatierten Bereich handelt, ist es ein ListObjekt
          try xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Range.AutoFilter(col, arr[0], 1) ;Field :=col, Criteria1:=arr[0], Operator 1 (=xlAnd)
        else
          try xl.ActiveSheet.Usedrange.AutoFilter(Field :=col, Criteria1:=arr[0], Operator:=1)
        catch e
          MsgBox, 16,, % "Zum Filtern von Daten müssen diese in die Zwischenablage kopiert und dann eine Zelle in der gewünschten Spalte angeklickt werden.`n`n`nNachricht: " e.message "`nZusatz: " e.extra
      }
    else ;if Anz_Zeilen = 2
      {
        Loop, parse, MyClipBoard, `n, `r
          {
            If (A_LoopField = "")
              continue
            index++
            arr[index - 1] := "*" Trim(A_LoopField, " `t") "*"
          }
        If isObject(xl.ActiveCell.ListObject) ;wenn es sich um einen als Tabelle formatierten Bereich handelt, ist es ein Objekt
          try xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Range.AutoFilter(col, arr[0], 2, arr[1]) ;Field :=col, Criteria1:=arr[0], Operator 2 (=xlOr), Criteria2:=arr[1]
        else
          try xl.ActiveSheet.Usedrange.AutoFilter(col, arr[0], 2, arr[1])
        catch e
          MsgBox, 16,, % "Zum Filtern von Daten müssen diese in die Zwischenablage kopiert und dann eine Zelle in der gewünschten Spalte angeklickt werden.`n`n`nNachricht: " e.message "`nZusatz: " e.extra
      }
  }
else ;bei genauer (Ist gleich) Suche ohne Wildcards
  {
    Loop, parse, MyClipBoard, `n, `r
      {
        If (A_LoopField = "")
          continue
        index++
        arr[index - 1] := Trim(A_LoopField, " `t")
      }
    If isObject(xl.ActiveCell.ListObject) ;wenn es sich um einen als Tabelle formatierten Bereich handelt, ist es ein Objekt
      {
        ;msgbox,4096,, % col "`n" xl.ActiveCell.ListObject.name
        xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Range.AutoFilter(col, arr, 7) ;Field :=col, Criteria1:=arr, Operator 7 (=xlFilterValues)
      }
    else
      try xl.ActiveSheet.Usedrange.AutoFilter(col, arr, 7)
    catch e
      MsgBox, 16,, % "Zum Filtern von Daten müssen diese in die Zwischenablage kopiert und dann eine Zelle in der gewünschten Spalte angeklickt werden.`n`n`nNachricht: " e.message "`nZusatz: " e.extra
  }

ControlSend, Excel71, {esc 2},ahk_class XLMAIN ;Schnellanalysetool ggf. schließen
xl:= r := arr := col := Anz_Zeilen := index := FilterAlreadySet := MyClipBoard := ""
return
#IfWinActive


#Ifwinactive ahk_class XLMAIN
^+r:: ;;Excel Autofilter in der aktiven Spalte löschen
setbatchlines, -1
xl := Excel_Get()
col := xl.ActiveCell.Column - xl.ActiveSheet.Autofilter.Range.Column + 1 ;ermittelt die Spalte falls ein Autofilterbereich existiert wo der Filter gelöscht werden soll
If (col = "")
  col := xl.ActiveCell.Column - xl.ActiveSheet.Usedrange.Column + 1 ;ermittelt die Spalte falls kein Autofilterbereich existiert

If (col = 0)
  {
    msgbox,4096,, Um für einen Autofilter zu löschen, muss in eine Zelle der gewünschten Spalte geklickt werden.
    xl := col := ""
    return
  }

If isObject(xl.ActiveCell.ListObject) ;wenn es sich um einen als Tabelle formatierten Bereich handelt, ist es ein Objekt
  try xl.ActiveSheet.ListObjects(xl.ActiveCell.ListObject.name).Range.AutoFilter(Field :=col)
else
  try xl.ActiveSheet.Range("A1").End(-4121).AutoFilter(Field :=col)
;catch e  ;nicht hilfreicher Ausnahmehinweis auskommentiert /31.10.2020
;  MsgBox, 16,, % "Ausnahme ausgelöst!`n`nWas: " e.what "`nDatei: " e.file "`nZeile: " e.line "`nNachricht: " e.message "`nZusatz: " e.extra
xl := col := ""
return

;liefert ein COM-Objekt für das aktive Excel-Fenster
Excel_Get(WinTitle="ahk_class XLMAIN") {  ; by Sean and Jethrow, minor modification by Learning one
  ControlGet, hwnd, hwnd, , Excel71, %WinTitle%
  if !hwnd
    return
  Window := Acc_ObjectFromWindow(hwnd, -16)
  Loop
    try
      WinApplication := Window.Application
    catch
      ControlSend, Excel71, {esc}, %WinTitle%
  Until !!WinApplication
  return WinApplication
}

; Teile aus Acc.ahk Standard Library
; by Sean
; Updated by jethrow:
;   Modified ComObjEnwrap params from (9,pacc) --> (9,pacc,1)
;   Changed ComObjUnwrap to ComObjValue in order to avoid AddRef (thanks fincs)
;   Added Acc_GetRoleText & Acc_GetStateText
;   Added additional functions - commented below
;   Removed original Acc_Children function
; last updated 2/25/2010
;------------------------------------------------------------------------------

Acc_Init(){
  Static  h
  If Not  h
    h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

Acc_ObjectFromWindow(hWnd, idObject = -4){
  Acc_Init()
  If  DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
  Return  ComObjEnwrap(9,pacc,1)
}

Last edited by aifritz on 15 Nov 2020, 14:12, edited 9 times in total.
aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Flexibler Autofilter für Excel

26 Jan 2019, 12:22

Hi,

kleine Verbesserung:

Falls bereits ein Autofilter nicht für alle Spalten gesetzt ist, klappt es so besser:

Code: Select all

col := xl.ActiveCell.Column - xl.ActiveSheet.Autofilter.Range.Column + 1 ;ermittelt die Spalte falls ein Autofilterbereich existiert wo der Filter gesetzt/gelöscht werden soll
If (col = "")
  col := xl.ActiveCell.Column - xl.ActiveSheet.Usedrange.Column + 1 ;ermittelt die Spalte falls kein Autofilterbereich existiert
Hat vielleicht jemand noch eine Idee, wie man aus dem Clipboard die Daten auslesen kann, falls man in Excel über eine Mehrfachselektion Daten kopiert hat? Im Moment ist es so, dass auch dazwischenliegende Daten, welche nicht markiert wurden
per

Code: Select all

 
...
Loop, parse, Clipboard, `n, `r
  {
    If (A_LoopField = "")
      continue
    index++
    arr[Index - 1] := A_LoopField
  }
...
ausgelesen werden und in dem Autofilter landen!? :?
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel

12 Jul 2019, 05:50

Hallo aifritz,

Dein Script wäre genau das, was mir die tägliche Arbeit mit Excel erleichtern würde.

Ich kopiere aus einem Worksheet einen Namen und gehe damit in ein anderes Worksheet.
In diesem soll der Name eine Spalte filtern - die zuvor von einem anderen Namen gefiltert wurde.
So die Idee...

Habe Dein Script vorab in SciTE4AutoHotkey abgelegt und mit RUN Script (F5) laufen lassen
Danach meldet SciTE4AutoHotkey folgende Fehlermeldung:

D:\Documents\Desktop\AutoHotkeyHelp_DE\Temp-löschen.ahk (33) : ==> This line does not contain a recognized action.
Specifically: arr[Index - 1] := A_LoopField
>Exit code: 2 Time: 0.1748

Mir fehlt das KnowHow, um zu verstehen, was gemeint ist.
Kannst Du in der Sachen helfen?

Danke
Jakobus

PS: Arbeite mit...

SciTE4AutoHotkey
Version 3.0.06.01 - Based on SciTE 3.5.1
Built on Oct 12 2014 13:40:05
toralf
Posts: 868
Joined: 27 Apr 2014, 21:08
Location: Germany

Re: Flexibler Autofilter für Excel

12 Jul 2019, 06:16

Welche AHK Version benutzt du?
ciao
toralf
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel

12 Jul 2019, 07:24

Hallo toralf,

Unter Control Panel\All Control Panel Items\Programs and Features
sind installiert
AutoHotkey 1.0.47.06 Installed on 09.05.2019
AutoHotkey 1.1.30.01 Installed on 17.01.2019

Ich erinnere mich, dass es bei der Installation Anfang des Jahres Probleme gab.
Was mich jetzt wundert, ist das Installed Datum oben.
Danach ist, dass die 1.1.30 Version im Januar und die 1.0.47 Version später um Mai installiert worden.

Wenn ich in SciTE4AutoHotkey auf Hilfe (F1) drücke
öffnet sich die Hilfe-Seite mit dem Titel "AutoHotKey Version 1.0.47.06".

## Ergänzung ##
Wenn ich in SciTE4AutoHotkey eine Zeile tiefer auf "SciTE4AutoHotkey Help" drücke
öffnet sich die Hilfe-Seite mit dem Titel "AutoHotKey Version v3.0.06.01".

Hilft Dir das weiter?
Last edited by Jakobus on 12 Jul 2019, 10:16, edited 1 time in total.
gregster
Posts: 8886
Joined: 30 Sep 2013, 06:48

Re: Flexibler Autofilter für Excel

12 Jul 2019, 09:16

D:\Documents\Desktop\AutoHotkeyHelp_DE\Temp-löschen.ahk (33) : ==> This line does not contain a recognized action.
Specifically: arr[Index - 1] := A_LoopField
>Exit code: 2 Time: 0.1748
Version 1.0.47.06, aus dem März 2008 (!), kennt noch keine Arrays, soweit ich weiß, nur Pseudo-Arrays. Eingebaute Funktionen wie IsObject() und ComObjArray() oder Kommandos wie Try dürften der Version auch unbekannt sein...
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel

12 Jul 2019, 10:10

Hallo gregster, hallo toralf,

braucht es beide Versionen von AutoHotkey auf dem Rechner?
Möglicherweise ersetzt 1.1.30.01 die ältere komplett?

Weil die ältere Version das jüngere Installationsdatum hat,
ist mein Verdacht, dass es zu einem Konflikt kommt.

Ich zögere noch, eine von beiden Versionen zu deinstallieren.
Einfach, weil die englische Installationanleitung zu der Zeit kniffelig war.

Helfen würde eine simple Installationsanleitung für einen weniger erfahrenen User wie mich,
wenn das Problem nicht das Script ist.
gregster
Posts: 8886
Joined: 30 Sep 2013, 06:48

Re: Flexibler Autofilter für Excel

12 Jul 2019, 10:41

Du brauchst normalerweise nur eine Version; ich habe derzeit 1.1.30.03 installiert (die neueste Version, abgesehen von AHK v2 alpha).
Version 1.0.47.06 habe ich zuletzt ca. 2008 verwendet.

Nun gibt es aber manchmal Gründe, warum Leute eine so alte Version installieren oder nutzen - manchmal, weil es die einzige ist, die die IT-Abteilung des Arbeitgebers freigegeben hat - manchmal weil man ein entsprechend altes Skript verwenden will, von dem man annimmt (zu Recht oder nicht), dass es auf späteren Versionen nicht mehr ordnungsgemäß laufen wird oder weil man in den letzten Jahren einfach kein AHK-Update mehr heruntergeladen hat. Auf keinen Fall aber ist 1.0.47.06 die Voraussetzung für die Nutzung von neueren Versionen...

Wenn man tatsächlich 1.0.47.06 braucht, dann kann man das auch tun, ohne es zu installieren. Es existiert auch für diese Version eine portable Variante, soweit ich weiß: https://www.autohotkey.com/download/1.0/ (Das gleiche gilt jedoch auch für Version 1.1.30.01 und .03) Ich persönlich würde die Version installieren, die ich überwiegend nutzen will (und im Bedarfsfall andere Versionen portabel einsetzen) bzw. nutzen darf. Aber ich kenne deine genaue Situation nicht...

Soweit ich weiß, leitet einen der Installer durch den Installationsvorgang (ich erinnere mich allerdings nicht an den von 2008) - wo hast du da ein spezifisches Problem?
Da ist auch dies: https://ahkde.github.io/docs/Tutorial.htm#s11 (inkl. Link zu einem (etwas älteren) Video, das den Vorgang, auf Englisch, zeigt. Details mögen heutzutage abweichen).
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel

12 Jul 2019, 11:31

Danke gregster,

habe beide Versionen deinstalliert und die aktuelle Version 1.1.30.03 (12-07-2019) nach Deinem Link installiert.

Jetzt läuft das Script von aifritz!
"B E S T E N S!"

Das war die gute Nachricht.

Die weniger gute Nachricht ist, das "ac'tivAid" nicht mehr läuft.
Deine Ausführung hat das oben schon angedeutet.
Im Forum von "ac'tivAid" wird diskutiert, was es braucht, um auf die neue Version umzustellen.
Nach meinem Verständnis braucht es dazu die ältere Version 1.0.47.06.

Gerne würde ich mit beiden arbeiten.
Sowohl mit der aktuuellen Version von AutohotKey als auch mit "ac'tivAid".

Hast Du dazu eine Lösung?

----------------------------------------------------------------------------------------------------------------------------------

PS:
Bei der Benutzerspezifischen_Installation erscheint sinngemäss der Hinweis,
wer einmal die 64-bit Variante installiert hat,
kann seine Scripte später auf einem 32-bit Rechner unter Umständen nicht laufen lassen.

Entscheide ich mich bei der Installation für die 32-bit Variante,
habe ich auf beiden Rechnern 32/64 bit keine Probleme, so meine Annahme.
Das hatte ich nicht auf dem Schirm.
gregster
Posts: 8886
Joined: 30 Sep 2013, 06:48

Re: Flexibler Autofilter für Excel

12 Jul 2019, 12:13

Wird jetzt etwas offtopic für diesen Thread - ggf. sollte die Versions-Diskussion abgetrennt und in ein eigenes Topic verschoben werden (aber das übersteigt meine Befugnisse ;) bzw. Möglichkeiten )

Oh, activ'aid - das hatte ich überhaupt nicht mehr auf dem Schirm; ich glaube, es gibt Leute, die das updaten wollen, aber ich weiß nicht, wie da der Stand ist. Bin mir zur Zeit auch nicht sicher, inwieweit sich das sinnvoll parallel betreiben lässt - spontan kann ich da leider nicht viel zu sagen. Müsst ich mir mal ansehen. Aber vielleicht hat auch jemand anderes aus dem Forum neuere Erkenntnisse....

Für die meisten Funktionen von activ'aid, soweit ich mich erinnere, sollte es aber Alternativen hier im Forum geben, aber natürlich nicht in einer so schönen einheitlichen Oberfläche. Wir haben hier ja auch ein paar helle und hilfreiche Köpfe.

Was 32/64-bit angeht: Ich betreibe die 64-bit-Version von AHK (naturgemäß auf 64-bit Windows) und hab selten Probleme. Die 32-bit-Versionen (Unicode und ANSI) sind ja trotzdem im Installations-Verzeichnis vorhanden und werden von mir im Einzelfall genutzt (aber natürlich kann die ahk-Dateierweiterung zu einem bestimmten Zeitpunkt nur mit einer spezifischen Version verbunden werden).

Man kann bspw. AutoHotkeyU32.exe von dort kopieren und in MeinSkript.exe umbenennen - wenn es dann im gleichen Ordner die entsprechend benannte Skript-Datei MeinSkript.ahk gibt, dann wird diese exe bei Ausführung die entsprechende (~gleichnamige) Skript-Datei automatisch ausführen (dann eben als 32-bit Unicode).

Hier findet man ein paar allgemeine Ausführungen zur Kompatibilität versch. AHK-Versionen: https://ahkde.github.io/docs/Compat.htm

Aber generell ist wahrscheinlich die 32-bit Unicode-Version die kompatibelste Version - ist bei Bedarf aber auch schnell geändert. Die ahk-Skripte (in Text- oder kompilierter Form) selbst ändern sich ja nicht durch Installation einer anderen Version. Man verwendet lediglich einen anderen Interpreter für die text-basierten ahk-Dateien.

Soweit ich weiß, kann man auch mit installierter 64-bit Version problemlos 32-bit-exe-Dateien kompilieren (und vice versa).

Ich bitte um Korrekturen, sollte ich mit irgendetwas falsch liegen.
just me
Posts: 9406
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Flexibler Autofilter für Excel

13 Jul 2019, 03:54

Moin,

aus der Hilfedatei zu AHK 1.0.48.05:
Passing Command Line Parameters to a Script

Script Filename: This can be omitted if there are no Script Parameters. If omitted, it will run (or prompt you to create) the file AutoHotkey.ahk in the My Documents folder. The only exception is when AutoHotkey.ini exists in the current working directory, in which case it executes that file.
Wenn activ'aid 'kompiliert' werden kann, sollte man das mit installertem AHK 1.0 einmal tun, und dann ein aktuelles AHK 1.1 installieren.
Ansonsten würde ich für den Start von activ'aid eine Link-Datei (.lnk) anlegen, die die AutoHotkey.exe aus AHK 1.0 startet und den Skriptnamen als Parameter übergibt.

Zum Thema 32/64 Bit:

32 Bit AHK-Installationen laufen bisher problemlos auf 64 Bit Systemen.
64 Bit Versionen können auf 32 Bit Systemen nicht installiert (bzw. ausgeführt) werden. Das gilt auch für 64 Bit Kompilate.
Skripte können in beiden Umgebungen laufen, wenn man beim Schreiben ein paar Dinge beachtet. Die 'normalen' AHK-Anweisungen laufen ohne Probleme. Wenn das Skript aber DllCalls mit Strukturen enthält, wird die Sache spannend. In 64 Bit Umgebungen sind die Zeiger auf Speicherbereiche (Pointer) 64 Bit (8 Byte) groß. In 32 Bit Umgebungen sind es nur 32 Bit (4 Byte). Das bedingt unterschiedliche Ausrichtungen von Strukturfeldern. Außerdem gibt es Unterschiede bei der Parameterübergabe in DllCalls. Ein Skript, das nicht anhand von A_PtrSize prüft, in welcher Umgebung es läuft, um die notwendigen Unterschiede automatisch zu behandeln, wird deshalb irgendwann Probleme bereiten.
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel

15 Jul 2019, 11:38

Danke gregster, danke just me,

für die Fülle an Informationen.
Eure Ausführungen vertiefen sehr das Wissen.

Thema 32/64 Bit:

Installiert habe ich die 32-bit Version (auf einen 64-bit Rechner), um Problemen in Zukunft aus dem Weg zu gehen.
Möglicherweise ändere ich das ferner Zukunft, wenn ich tiefer in der Materie stecke.

Wenn activ'aid 'kompiliert' werden kann...?
... sollte man das mit installertem AHK 1.0 einmal tun, und dann ein aktuelles AHK 1.1 installieren.
Ansonsten würde ich für den Start von activ'aid eine Link-Datei (.lnk) anlegen,
die die AutoHotkey.exe aus AHK 1.0 startet und den Skriptnamen als Parameter übergibt.


Der Teil ist mir nicht gelungen.
Habe verschiedenes ausprobiert, aber ohne Erfolg.
Auch das Komplieren von ac'tivAid.ahk in ac'tivAid.exe mit der älteren Version AutoHotKey (ohne die aktuelle) gelingt nicht ohne Fehlermeldung.
"Ahk2exe Error: Error adding FileINstall file - extensions\RunWithAdminRights.exe."

Es soll eine portable Version von Ac'tiv Aid geben, aber die habe ich nicht gefunden.

Kurz vorm Urlaub fehlt mir Zeit, tiefer in die Sache einzusteigen.
Möglicherweise steige ich später mit einem neuen POST an dieser Stelle wieder ein.

Als Einstieg hat mir Ac'tiv Aid sehr geholfen.
Ungern würde ich mich davon trennen.

Hingegen der Code von aifritz für "Flexibler Autofilter für Excel" ist genial gut.

Danke an Euch 3 "Helden"!
aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Flexibler Autofilter für Excel [Update]

09 Aug 2020, 07:45

Hallo zusammen,

da bisher nur exakte Treffer (Ist gleich) angezeigt wurden, habe ich noch ein Menü ergänzt, damit man auswählen kann, ob nur exakte Treffer (Ist gleich) oder alle Treffer (Enthält) angezeigt werden sollen.
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel [Update]

10 Aug 2020, 10:30

Hallo aifritz,

die Erweiterung ist ein gelungenes Feature.

Oft kopiere ich Artikelnummern aus einer Email.
Damit wird das AHK-Script in Excel "gefüttert".

Wenn ich einen Wunsch frei hätte...

Beim Kopieren aus Textvorlagen wie z.B. aus Outlook
ist ungewollt oft ein Tab-Zeichen am Ende des Textes mit dabei.

Oder manchmal auch ein Leerzeichen am Anfang oder Ende der kopierten Artikelnummer.
Das Leerzeichen wird vom AHK-Skript wie gewünscht ignoriert (genial gut).

Allerdings das Tab-Zeichen nicht.
In diesem Fall lösche ich es manuell.

Ich wollte Dich schon immer fragen,
ob Du dafür nicht eine passende Lösung zur Hand hast?
Wenn nicht jetzt - dann vielleicht später?
Mein Wissen reicht dafür leider nicht.

Nichtsdestotrotz bin ich voll des Lobes für das AHK-Script.
Für jemanden, der viel mit Filter und deren Pull-Down-Menues in Excel arbeitet
ist es eine echte Arbeitserleichterung!
aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Flexibler Autofilter für Excel [2.Update]

14 Aug 2020, 12:18

Hallo Jakobus,

das mit den Tab-Zeichen habe ich noch ergänzt. :)

Zudem ist mir aufgefallen, dass der Enthält-Filter bei mehr als 2. Kriterien nicht funktioniert hat. Der Autofilter von Excel erlaubt nur max. 2 Kriterien, wenn man per "Enthält" filtern möchte. Bei "Ist gleich" funktioniert er seltsamerweise mit einer Vielzahl an Kriterien.

LG aifritz
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel [2.Update]

17 Aug 2020, 11:31

Hallo aifritz,

vielen Dank für Deine hilfreiche Unterstützung.

(A)
Wenn im Speicher eine Artikelnummer m i t "Tab-Zeichen am Wort-Ende" im Speicher ist,
und der Cursor in eine Spalte/Zelle mit den Artikelnummer abgelegt wird,
dann erscheint zuerst folgende Meldung:
"Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken!"

Mit Bestätigung auf "Ok" verschwinden plötzlich alle Pull-Down-Pfeile in der Titelleiste vom Excel-Sheet.
Drücke ich noch einmal STRG+P - ohne etwas anderes zu machen -
erscheint die gewünschte Auswahl:
R: Ist gleich
e. Enthält (Textfilter mit max. Kriterien)

Doch ganz gleich, welche der beiden Kriterien ausgewählt werden
in beiden Fällen wirft der Filter kein Ergebnis aus.
Ausser der Titelzeile erscheint nur ein leeres Blatt.

Und alle Pull-Down-Pfeile* in der Titelleiste sind wieder sichtbar.

(B)
Wenn im Speicher eine Artikelnummer o h n e Leer- und Tab-Zeichen im Speicher ist,
und der Curser in eine Zelle mit den Artikelnummer abgelegt wird,
dann erscheint wieder die Meldung wie zuvor:
"Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken!"

Mit Bestätigung auf "Ok" verschwinden plötzlich alle Pull-Down-Pfeile in der Titelleiste vom Excel-Sheet.
Drücke ich noch einmal STRG+P - ohne etwas anderes zu machen -
erscheint die gewünschte Auswahl:
r: Ist gleich
e. Enthält (Textfilter mit max. Kriterien)

In beiden Fällen wird das gewünschte Ergebnis angezeigt.

LG Jakobus

*EXCEL: Pull-Down-Pfeile lassen sich mit STRG+SHIFT+L separat an und abschalten

Nebenbei,
es gibt Excel-Dateien, da würde ich das "neue" AHK-File nutzen (bessere Auswahl über Pull-down-menu)
es gibt Excel-Dateien, da würde ich lieber das "alte" AHK-File nutzen (schneller, weil weniger Tippen und keine Auswahl nötig)
aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Flexibler Autofilter für Excel [3.Update]

20 Aug 2020, 11:03

Hallo Jakobus,

ich habe das Skript nochmals ein wenig angepasst... (siehe oben)
und hoffe das alles soweit passt :)

LG aifritz
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Flexibler Autofilter für Excel [3.Update]

13 Oct 2020, 09:56

Hallo aifritz,

vielen Dank für Dein überarbeitetes Skript.

Habe die neue Variante ausprobiert.
Hier mein Ergebnis.


( A ) m i t "Tab-Zeichen

STRG + R

Wenn im Speicher eine Artikelnummer m i t "Tab-Zeichen am Wort-Ende" im Speicher ist,
und der Cursor in eine Spalte/Zelle mit den Artikelnummer abgelegt wird,
dann erscheint zuerst folgende Meldung:
"Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken!"

.. und zusätzlich verschwinden alle Filter

Erneutes Drücken von STRG + R

Alle Filter sind wieder sichtbar
und der Filer für Artikelnummer ist aktiv - allerdings ohne Treffer.

STRG + E

1:1 identisches Verhalten wie oben ( A ) STRG + R

-------------

( B ) ohne "Tab-Zeichen

STRG + R

Wenn im Speicher eine Artikelnummer ohne "Tab-Zeichen am Wort-Ende" im Speicher ist,
und der Cursor in eine Spalte/Zelle mit den Artikelnummer abgelegt wird,
dann erscheint zuerst folgende Meldung:
"Um einen Autofilter zu setzen, bitte eine Zelle in dem Autofilterbereich anklicken!"

.. und zusätzlich verschwinden alle Filter

Erneutes Drücken von STRG + R

Alle Filter sind wieder sichtbar
und nur alle Zeilen mit der gesuchte Artikelnummer werden angezeigt

STRG + E

1:1 identisches Verhalten wie oben ( B ) STRG + R
aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: Flexibler Autofilter für Excel [4.Update]

31 Oct 2020, 11:20

Hallo Jacobus,

sorry, es hat etwas länger gedauert. Ich habe in dem Skript noch einen Bug beseitigt und einen überflüssigen Hinweis entfernt. (siehe Update 4)

Ich habe es auch mal mit Tabs und ohne Tabs am Ende probiert und konnte keinerlei Fehlverhalten feststellen.

Wichtig ist, falls Du die Daten aus Excel heraus per Strg+C in die Zwischenablage kopierst, dass Du unmittelbar danach die Filteraktion per Strg+R ("ist gleich"-> mit beliebig vielen Kriterien) bzw. Strg+E ("enthält" -> mit max. 2 Kriterien) ausführst.

Filter wieder löschen für die Spalte klappt mit Strg+Shift+R.

Ansonsten kannst Du gern auch eine Bsp. Exceltabelle hier einstellen, wo der von Dir beschriebene Fehler auftritt.

Liebe Grüße
aifritz
daywalker
Posts: 32
Joined: 18 Jun 2019, 01:37

Re: Flexibler Autofilter für Excel [4.Update]

12 Nov 2020, 05:23

Hallo aifritz,

ich nutze das Tool gern, jedoch funktioniert der Autofilter bei ListObject anders (Tabellen aus Abfragen, z..*.iqy).
xl.ActiveSheet.AutoFilterMode ist dann immer FALSE, eine Unterscheidung müsste man über ActiveSheet.ListObjects.Count oder so machen.

Erklärung für VBA:
https answers.microsoft.com /en-us/msof ... b6f09732a4 Broken Link for safety

Wäre schön, wenn ListObjects auch mit unterstützt würden.

Viele Grüße
daywalker

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 12 guests