Flexibler Autofilter für Excel

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

aifritz
Posts: 39
Joined: 29 Jul 2018, 11:30

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.Usedrange.Column + 1
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.Usedrange.Column + 1
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)
}

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 5 guests