Discussion:
Autofilter auslesen und wieder setzen (VBA)
(zu alt für eine Antwort)
Ewald
2015-09-11 09:32:59 UTC
Permalink
Hallo NG,
o.g. Problem beschäftigt mich nun schon seit Stunden.
Zwar klappt das auslesen, aber das zurückschreiben nicht. Hier mein Code:

Sub Filterkriterien()
Dim HiFe As Variant
HiFe = ""
With Cells(1, 2.Parent.AutoFilter
With .Filters(Cells(1, 2).Column - .Range.Column + 1)
If .Count > 2 Then
HiFe = Join(.Criteria1, "; ") 'funktioniert
.Criteria1 = HiFe 'funktioniert nicht Laufzeitfehler 450
Else
HiFe = .Criteria1 'funktioniert
.Criteria1 = HiFe 'funktioniert nicht Laufzeitfehler 450
End If
End With
End With
Application.EnableEvents = False
Cells(2, 20) = "'" & HiFe
Application.EnableEvents = True
End Sub

Laufzeitfehler 450: Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft.

Danke für eure Hilfe.

Gruß
Ewald
Claus Busch
2015-09-11 10:10:06 UTC
Permalink
Hallo Ewald,
Post by Ewald
o.g. Problem beschäftigt mich nun schon seit Stunden.
schau mal in der VBA-Hilfe für Entwickler nach
Filters-Objekt.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Ewald
2015-09-11 10:34:29 UTC
Permalink
Hallo Claus,

das hilft mir auch nicht weiter, in den Beispielen dort werden die Filter nur ausgelesen, aber nicht wieder gesetzt, aber gerade das ist ja mein Problem.

Freundliche Grüße

Ewald
Claus Busch
2015-09-11 12:10:11 UTC
Permalink
Hallo Ewald,
Post by Ewald
das hilft mir auch nicht weiter, in den Beispielen dort werden die Filter nur ausgelesen, aber nicht wieder gesetzt, aber gerade das ist ja mein Problem.
zum Setzen des Filters:

With ActiveSheet.UsedRange
.AutoFilter field:=1, Criteria1:=HiFe
End With

Falls du zwei Filer hast, musst du auch noch den Operator auslesen und
die beiden Kriterien mit diesem verbinden.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Ewald
2015-09-14 07:41:57 UTC
Permalink
Hallo Claus,
danke . Hast Du zufällig ein Beispiel wie man die Filter zusammensetzt?
Ich habe jetzt stundenlang erfolglos dies probiert.

Freundliche Grüße
Ewald
Post by Claus Busch
Hallo Ewald,
Post by Ewald
das hilft mir auch nicht weiter, in den Beispielen dort werden die Filter nur ausgelesen, aber nicht wieder gesetzt, aber gerade das ist ja mein Problem.
With ActiveSheet.UsedRange
.AutoFilter field:=1, Criteria1:=HiFe
End With
Falls du zwei Filer hast, musst du auch noch den Operator auslesen und
die beiden Kriterien mit diesem verbinden.
Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
H
Claus Busch
2015-09-14 07:48:46 UTC
Permalink
Hallo Ewald,
Post by Ewald
danke . Hast Du zufällig ein Beispiel wie man die Filter zusammensetzt?
Ich habe jetzt stundenlang erfolglos dies probiert.
wie meinst du das? Gebe mal ein Beispiel welche Spalten nach welchen
Kriterien gefiltert werden sollen.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Ewald
2015-09-14 11:06:47 UTC
Permalink
Hallo Claus,
danke für deine Geduld.
in Spalte 2 z.B.
Apfel
Apfel und Birne
Apfel,Birne und Orange
Das Beispiel in meinem ersten Post funktioniert für das Auslesen, aber nicht das Zurückschreiben.

anderer Ansatz gleiches Ergebnis:
Sub Filterkriterien_sichern()
Dim A As String
HiFe = ""
i = 2
With Cells(1, i).Parent.AutoFilter
With .Filters(Cells(1, i).Column - .Range.Column + 1)
A = .Count
If .Count > 2 Then
HiFe = Join(.Criteria1, "; ")
Else
HiFe = .Criteria1
Select Case .Operator
Case xlAnd
HiFe = HiFe & xlAnd & .Criteria2
Case xlOr
HiFe = HiFe & xlOr & .Criteria2
End Select

End If
End With
End With
Application.EnableEvents = False
Cells(2, 20) = "'" & HiFe
Application.EnableEvents = True
With ActiveSheet.UsedRange
HiFe = A
.AutoFilter field:=2, Criteria1:=HiFe
End With
End Sub


Freundliche Grüße
Ewald
Post by Claus Busch
Hallo Ewald,
Post by Ewald
danke . Hast Du zufällig ein Beispiel wie man die Filter zusammensetzt?
Ich habe jetzt stundenlang erfolglos dies probiert.
wie meinst du das? Gebe mal ein Beispiel welche Spalten nach welchen
Kriterien gefiltert werden sollen.
Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Claus Busch
2015-09-14 12:27:22 UTC
Permalink
Hallo Ewald,
Post by Ewald
in Spalte 2 z.B.
Apfel
Apfel und Birne
Apfel,Birne und Orange
Das Beispiel in meinem ersten Post funktioniert für das Auslesen, aber nicht das Zurückschreiben.
ich verstehe dein Anliegen nicht richtig. Du kannst den Filter nur
auslesen, wenn er gesetzt ist. Wenn er aber gesetzt ist, warum willst du
ihn zurückschreiben?
Aber probiere es mal so:

Public c1 As String, c2 As String, op As String

Sub Filterkriterien_sichern()
Dim HiFe As String
Dim f As Variant, myRow As Long

myRow = 20
Const ns As String = "Not set"

With ActiveSheet
For Each f In .AutoFilter.Filters
If f.On Then
c1 = Right(f.Criteria1, Len(f.Criteria1) - 1)
If f.Operator Then
op = f.Operator
c2 = Right(f.Criteria2, Len(f.Criteria2) - 1)
Else
op = ns
c2 = ns
End If
Else
c1 = ns
op = ns
c2 = ns
End If
.Cells(myRow, 2) = c1
myRow = myRow + 1
.Cells(myRow, 2) = op
myRow = myRow + 1
.Cells(myRow, 2) = c2
myRow = myRow + 1
Next
End With

End Sub

Sub FilterSetzen()
Dim HiFe As String

HiFe = "=" & c1
ActiveSheet.Range("B1").AutoFilter Field:=1, Criteria1:=HiFe
End Sub

Falls du zwei Kriterien hast, musst du das beim FilterSetzen ergänzen
zusammen mit dem Operator.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Claus Busch
2015-09-14 12:40:46 UTC
Permalink
Hallo Ewald,
Post by Claus Busch
Public c1 As String, c2 As String, op As String
Sub Filterkriterien_sichern()
oder bei nur einem Kriterium:

Public c1 As String
Sub FilterAuslesen()

With ActiveSheet
If .AutoFilterMode Then
With .AutoFilter.Filters(1)
If .On Then c1 = .Criteria1
End With
End If
End With
End Sub

Sub FilterSetzen()
ActiveSheet.Range("B1").AutoFilter _
field:=1, Criteria1:=c1
End Sub


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Ewald
2015-09-15 06:26:02 UTC
Permalink
Hallo Claus,
abermals Danke.
Ich glaube ich kann mein Problem nicht richtig ausdrücken., das darin besteht, daß ich es bei mehreren Kriterien nicht schaffe, den Filter wieder zusammen zu setzen. Bsp. Filtern nach Apfel und Banane. Ich lese aus:
c1= Apfel op=2 c2=Banane
sehe ich mir das im AutoFilter vor dem Auslesen an sieht es so aus:
bei 2 Filtern: Ist gleich "Apfel" oder Ist gleich "Banane"
bei 3 oder mehr Filtern: Ist gleich "Apfel; Banane; Kiwi" ...

Freundliche Grüße
Ewald
Post by Claus Busch
Hallo Ewald,
Post by Claus Busch
Public c1 As String, c2 As String, op As String
Sub Filterkriterien_sichern()
Public c1 As String
Sub FilterAuslesen()
With ActiveSheet
If .AutoFilterMode Then
With .AutoFilter.Filters(1)
If .On Then c1 = .Criteria1
End With
End If
End With
End Sub
Sub FilterSetzen()
ActiveSheet.Range("B1").AutoFilter _
field:=1, Criteria1:=c1
End Sub
Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Claus Busch
2015-09-15 08:59:32 UTC
Permalink
Hallo Ewald,
Post by Ewald
c1= Apfel op=2 c2=Banane
bei 2 Filtern: Ist gleich "Apfel" oder Ist gleich "Banane"
bei 3 oder mehr Filtern: Ist gleich "Apfel; Banane; Kiwi" ...
was dir bei MouseOver als Filter angezeigt wird und was dir in die
Zellen geschrieben wird sind unterschiedliche Sachen.
Probiere mal zum Auslesen des Filters folgenden Code:

Public c1 As Variant, c2 As Variant, op As String

Sub Filterkriterien_sichern()
Dim f As Variant

Const ns As String = ""

With ActiveSheet
For Each f In .AutoFilter.Filters
If f.On Then
c1 = f.Criteria1
If IsArray(c1) Then
op = f.Operator
ElseIf f.Operator > 0 Then
c1 = f.Criteria1
op = f.Operator
c2 = f.Criteria2
End If
Else
c1 = ns
op = ns
c2 = ns
End If
.Range("B20:B22").ClearContents
If IsArray(c1) Then
.Range("B20") = Right(Join(c1), Len(Join(c1)) - 1)
Else
.Range("B20") = Right(c1, Len(c1) - 1)
End If
.Range("B21") = op
If Not IsEmpty(c2) Then
.Range("B22") = Right(c2, Len(c2) - 1)
End If
Next
End With

End Sub

Jetzt kommt es darauf an, wie bzw. wann du die Kriterien zurückschreiben
möchtest. Ist die Mappe immer noch geöffnet, kannst du das mit den
Public Variablen machen, denn die bleiben erhalten, solange nicht
geschlossen wird:

Sub FilterSetzen1() 'Mit den public Variablen

If op <> "" Then
ActiveSheet.Range("B1").AutoFilter field:=1, Criteria1:=c1, _
Operator:=op, Criteria2:=c2
Else
ActiveSheet.Range("B1").AutoFilter field:=1, Criteria1:=c1
End If
End Sub

Wenn du die Mappe geschlossen hast und den Filter über die Zellbezüge
setzen willst, dann probiere es so:

Sub FilterSetzen2() 'Mit den Zellbezügen
Dim crit1 As Variant, crit2 As String, op As String

If InStr(Range("B20"), " =") Then
crit1 = Split(Range("B20"), " =")
Else
crit1 = "=" & Range("B20")
End If
crit2 = IIf(Len(Range("B22")) > 0, "=" & Range("B22"), "")
op = Range("B21")

With ActiveSheet.Range("B1")
If crit2 = "" Then
.AutoFilter field:=1, Criteria1:=crit1
Else
.AutoFilter field:=1, Criteria1:=crit1, _
Operator:=op, Criteria2:=crit2
End If
End With

End Sub


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Loading...