Flexibler Autofilter für Excel

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

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

Flexibler Autofilter für Excel

20 Oct 2018, 06:20

Hallo zusammen,

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 aus der gleichen oder einer anderen Tabelle 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 wird dann der Filter für diese Werte gesetzt.

Filter löschen:
Zurücknehmen lässt sich der Filter für die Spalte einfach, indem man wieder in eine Zelle der Spalte klickt und dann den Hotkey Strg+Shift+r drückt.

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

^r:: ;;Autofilter in Excel mit mehreren Daten setzen, die in der Zwischenablage gespeichert sind
setbatchlines, -1
xl := Excel_Get()

if !IsObject(xl)
  {
    msgbox,4096,, Es konnte keine Verbindung zu Excel aufgebaut werden.
    return
  }
;ermittle die Anzahl der Zeilen in der Zwischenablage
Anz_Zeilen := 0
Loop, parse, Clipboard, `n, `r
  {
    If (A_LoopField = "")
      continue
    Anz_Zeilen++
  }
If (Anz_Zeilen = 0 or Trim(ClipBoard) = "") ;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 := ""
    return
   }

;Array definieren für die Anzahl der Zeilen
arr := ComObjArray(VT_VARIANT:=12, Anz_Zeilen)
index := 0
Loop, parse, Clipboard, `n, `r
  {
    If (A_LoopField = "")
      continue
    index++
    arr[Index - 1] := A_LoopField
  }

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

If (col = 0)
  {
    msgbox,,, Um für mehrere Daten einen Autofilter einzustellen, muss in eine Zelle der gewünschten Spalte geklickt werden.
    xl:= arr := col:= Anz_Zeilen := index := ""
    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, Criteria1:=arr, Operator:=7)
else
  try xl.ActiveSheet.Usedrange.AutoFilter(Field :=col, Criteria1:=arr, Operator:=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`nAusnahme ausgelöst!`n`nWas: " e.what "`nDatei: " e.file "`nZeile: " e.line "`nNachricht: " e.message "`nZusatz: " e.extra
  }
xl:= arr := col:= Anz_Zeilen := index := ""
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
  {
    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 26 Jan 2019, 12:24, edited 1 time in total.
aifritz
Posts: 144
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: 14
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: 619
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: 14
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: 2970
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: 14
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: 2970
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: 14
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: 2970
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: 6486
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: 14
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"!

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: Google [Bot] and 2 guests