Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Autofilter auslesen und wieder setzen (VBA)

299 views
Skip to first unread message

Ewald

unread,
Sep 11, 2015, 5:33:00 AM9/11/15
to
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

unread,
Sep 11, 2015, 6:10:12 AM9/11/15
to
Hallo Ewald,

Am Fri, 11 Sep 2015 02:32:59 -0700 (PDT) schrieb Ewald:

> o.g. Problem beschäftigt mich nun schon seit Stunden.
> Zwar klappt das auslesen, aber das zurückschreiben nicht. Hier mein Code:

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

unread,
Sep 11, 2015, 6:34:30 AM9/11/15
to
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

unread,
Sep 11, 2015, 8:10:19 AM9/11/15
to
Hallo Ewald,

Am Fri, 11 Sep 2015 03:34:29 -0700 (PDT) schrieb 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.

Ewald

unread,
Sep 14, 2015, 3:41:59 AM9/14/15
to
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
H

Claus Busch

unread,
Sep 14, 2015, 3:48:48 AM9/14/15
to
Hallo Ewald,

Am Mon, 14 Sep 2015 00:41:57 -0700 (PDT) schrieb 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.

Ewald

unread,
Sep 14, 2015, 7:06:49 AM9/14/15
to
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

Claus Busch

unread,
Sep 14, 2015, 8:27:26 AM9/14/15
to
Hallo Ewald,

Am Mon, 14 Sep 2015 04:06:47 -0700 (PDT) schrieb 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.

Claus Busch

unread,
Sep 14, 2015, 8:40:49 AM9/14/15
to
Hallo Ewald,

Am Mon, 14 Sep 2015 14:27:22 +0200 schrieb 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

Ewald

unread,
Sep 15, 2015, 2:26:05 AM9/15/15
to
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

Claus Busch

unread,
Sep 15, 2015, 4:59:37 AM9/15/15
to
Hallo Ewald,

Am Mon, 14 Sep 2015 23:26:02 -0700 (PDT) schrieb Ewald:

> 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" ...

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


0 new messages