Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1316to1320
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Bitte um Erweiterung eines Makros um einen Filter

Bitte um Erweiterung eines Makros um einen Filter
07.06.2013 10:07:14
Jenny
Hallo an alle Excel-Freunde hier.
würde mich sehr freuen, wenn ihr mir unter die Arme greift und unten stehendes Makro erweitert, sodass noch nach mehr Kriterien gefiltert wird.
Das Makro macht bislang folgendes:
1. ich mache händig einen Filter in die Tabelle Spalten A bis F
2. markiere eine oder mehrere Zellen in Spalte C, alle Zeilen mit dem markierten Inhalt in Spalte C sollen nach dem Filtern stehen bleiben
3. Mithilfe der Hilfsspalte B werden unter den übriggebliebenen Zeilen noch Duplikate in Spalte A ausgeblendet, unter Berücksichtigung dass 2 Zellen in Spalte A denselben Text aber unterschiedliche Hyperlinks haben können.
Nun jetzt zu meinem Wunsch. Punkt 3 soll ersetzt werden, dadurch dass von den Zeilen die nach Punkt 2 übrig bleiben, alle ausgeblendet werden, in denen die Zelle in Spalte E den Wert 0 hat.
Falls es von Belang ist, die Werte in E werden durch die Formel =ZÄHLENWENN(Tabelle3!A:Z;"*"&C2&"*"&D2&"*")+ZÄHLENWENN(Tabelle3!A:Z;"*"&D2&"*"&C2&"*") berechnet.
Vielen Dank für Eure Mühe
Jenny
Public Sub Jenny_Filtert()
Dim objRange As Range, objCell As Range, objArea As Range
Dim avntValue() As Variant
Dim ialngIndex As Long
Dim objDictionary As Object
If ActiveSheet.AutoFilterMode Then
If TypeOf Selection Is Range Then
Set objRange = Intersect(Selection, Columns(3))
If Not objRange Is Nothing Then
For Each objArea In objRange.Areas
For Each objCell In objArea
ReDim Preserve avntValue(ialngIndex)
avntValue(ialngIndex) = objCell.Value
ialngIndex = ialngIndex + 1
Next
Next
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
ActiveSheet.AutoFilter.Range.Rows(1).AutoFilter Field:=3, _
Criteria1:=avntValue, Operator:=xlFilterValues
Set objRange = Nothing
Set objRange = Autofilter_List(, True, False, True)
If Not objRange Is Nothing Then
Set objDictionary = CreateObject("Scripting.Dictionary")
For Each objArea In objRange.Areas
For Each objCell In objArea.Columns(1).Cells
If Not objDictionary.Exists(objCell.Text) Then
Call objDictionary.Add(objCell.Text, vbNullString)
objCell.Offset(0, 1).Value = 1
Else
objCell.Offset(0, 1).Value = 0
End If
Next
Next
ActiveSheet.AutoFilter.Range.Rows(1).AutoFilter Field:=2, _
Criteria1:=1
Cells(1, 3).Select
Set objRange = Nothing
Set objDictionary = Nothing
End If
Else
MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
End If
Else
MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
End If
Else
MsgBox "Es ist kein Filter in der Tabelle.", vbExclamation, "Hinweis"
End If
End Sub
Private Function Autofilter_List( _
Optional ByRef probjSheet As Object = Nothing, _
Optional ByVal pvblnWithoutHeader As Boolean = True, _
Optional ByVal pvblnWholeRow As Boolean = True, _
Optional ByVal pvblnMessage As Boolean = False) As Range
If probjSheet Is Nothing Then Set probjSheet = ActiveSheet
If TypeOf probjSheet Is Worksheet Then
If probjSheet.AutoFilterMode Then
If probjSheet.FilterMode Then
With ActiveSheet.AutoFilter.Range.Offset(IIf(pvblnWithoutHeader, 1, 0))
With .Resize(.Rows.Count - IIf(pvblnWithoutHeader, 1, 0)).SpecialCells(xlCellTypeVisible)
If .Rows.Count > 1 Or .Areas.Count > 1 Then
Set Autofilter_List = .Cells
If pvblnWholeRow Then _
Set Autofilter_List = Autofilter_List.EntireRow
Else
If pvblnMessage Then _
MsgBox "Der Autofilter hat nichts gefunden.", vbExclamation, "Hinweis"
End If
End With
End With
Else
If pvblnMessage Then _
MsgBox "Kein Autofilter gesetzt.", vbExclamation, "Hinweis"
End If
Else
If pvblnMessage Then _
MsgBox "Kein Autofilter aktiv.", vbExclamation, "Hinweis"
End If
Else
If pvblnMessage Then _
MsgBox "Das Blatt ''" & probjSheet.Name & "'' ist keine Tabelle.", vbExclamation, "Hinweis"
End If
End Function

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Code für mich schwer zu lesen
07.06.2013 10:40:50
Tino
Hallo,
liegt der Code genauso bei Dir vor?
Der Code ist für mich sehr schwer zu lesen da er nicht eingerückt ist, man
kann nicht erkennen welches If zu welchen End If gehört usw..
Wenn der Code zBsp. so aussehen würde, wäre es für mich besser!
If ActiveSheet.AutoFilterMode Then
If TypeOf Selection Is Range Then
Set objRange = Intersect(Selection, Columns(3))
If Not objRange Is Nothing Then
For Each objArea In objRange.Areas
For Each objCell In objArea
ReDim Preserve avntValue(ialngIndex)
avntValue(ialngIndex) = objCell.Value
ialngIndex = ialngIndex + 1
Next
Next

Gruß Tino

Anzeige
AW: Code für mich schwer zu lesen
07.06.2013 10:43:59
Jenny

Option Explicit
Public Sub Jenny_Filtert()
Dim objRange As Range, objCell As Range, objArea As Range
Dim avntValue() As Variant
Dim ialngIndex As Long
Dim objDictionary As Object
If ActiveSheet.AutoFilterMode Then
If TypeOf Selection Is Range Then
Set objRange = Intersect(Selection, Columns(3))
If Not objRange Is Nothing Then
For Each objArea In objRange.Areas
For Each objCell In objArea
ReDim Preserve avntValue(ialngIndex)
avntValue(ialngIndex) = objCell.Value
ialngIndex = ialngIndex + 1
Next
Next
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
ActiveSheet.AutoFilter.Range.Rows(1).AutoFilter Field:=3, _
Criteria1:=avntValue, Operator:=xlFilterValues
Set objRange = Nothing
Set objRange = Autofilter_List(, True, False, True)
If Not objRange Is Nothing Then
Set objDictionary = CreateObject("Scripting.Dictionary")
For Each objArea In objRange.Areas
For Each objCell In objArea.Columns(1).Cells
If Not objDictionary.Exists(objCell.Text) Then
Call objDictionary.Add(objCell.Text, vbNullString)
objCell.Offset(0, 1).Value = 1
Else
objCell.Offset(0, 1).Value = 0
End If
Next
Next
ActiveSheet.AutoFilter.Range.Rows(1).AutoFilter Field:=2, _
Criteria1:=1
Cells(1, 3).Select
Set objRange = Nothing
Set objDictionary = Nothing
End If
Else
MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
End If
Else
MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
End If
Else
MsgBox "Es ist kein Filter in der Tabelle.", vbExclamation, "Hinweis"
End If
End Sub
Private Function Autofilter_List( _
Optional ByRef probjSheet As Object = Nothing, _
Optional ByVal pvblnWithoutHeader As Boolean = True, _
Optional ByVal pvblnWholeRow As Boolean = True, _
Optional ByVal pvblnMessage As Boolean = False) As Range
If probjSheet Is Nothing Then Set probjSheet = ActiveSheet
If TypeOf probjSheet Is Worksheet Then
If probjSheet.AutoFilterMode Then
If probjSheet.FilterMode Then
With Tabelle1.AutoFilter.Range.Offset(IIf(pvblnWithoutHeader, 1, 0))
With .Resize(.Rows.Count - IIf(pvblnWithoutHeader, 1, 0)).SpecialCells( _
xlCellTypeVisible)
If .Rows.Count > 1 Or .Areas.Count > 1 Then
Set Autofilter_List = .Cells
If pvblnWholeRow Then _
Set Autofilter_List = Autofilter_List.EntireRow
Else
If pvblnMessage Then _
MsgBox "Der Autofilter hat nichts gefunden.", vbExclamation, " _
Hinweis"
End If
End With
End With
Else
If pvblnMessage Then _
MsgBox "Kein Autofilter gesetzt.", vbExclamation, "Hinweis"
End If
Else
If pvblnMessage Then _
MsgBox "Kein Autofilter aktiv.", vbExclamation, "Hinweis"
End If
Else
If pvblnMessage Then _
MsgBox "Das Blatt ''" & probjSheet.Name & "'' ist keine Tabelle.", vbExclamation, " _
Hinweis"
End If
End Function

Anzeige
AW: Code für mich schwer zu lesen
07.06.2013 11:06:41
Tino
Hallo,
kannst mal testen ob es so geht.
Public Sub Jenny_Filtert_Neu()
Dim objRange As Range, objCell As Range, objArea As Range
Dim avntValue() As Variant
Dim ialngIndex As Long

If ActiveSheet.AutoFilterMode Then
    If TypeOf Selection Is Range Then
        Set objRange = Intersect(Selection, Columns(3))
        If Not objRange Is Nothing Then
            For Each objArea In objRange.Areas
                For Each objCell In objArea
                    Redim Preserve avntValue(ialngIndex)
                    avntValue(ialngIndex) = objCell.Value
                    ialngIndex = ialngIndex + 1
                Next
            Next
            
            If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
            
            ActiveSheet.AutoFilter.Range.Rows(1).AutoFilter Field:=3, _
            Criteria1:=avntValue, Operator:=xlFilterValues
            
            'Filter Spalte E <> 0 *************************** 
            ActiveSheet.AutoFilter.Range.Columns(5).AutoFilter Field:=5, _
                                    Criteria1:="<>0", Operator:=xlAnd
        Else
            MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
        End If
    Else
        MsgBox "Bitte Zellen in Spalte C auswählen.", vbExclamation, "Hinweis"
    End If
Else
    MsgBox "Es ist kein Filter in der Tabelle.", vbExclamation, "Hinweis"
End If
End Sub
Gruß Tino

Anzeige
AW: Code für mich schwer zu lesen
07.06.2013 11:52:13
Jenny
Hallo Tino
erstmal vielen DAnk für deine Mühe, leider klappt es nicht. Der erste Filter klappt wunderbar, bei dem zweiten dann kommt die Meldug Laufzeitfehler 1004: Die Autofilter-Methode des Range-Objektes konnte nicht ausgeführt werden.
kannst du mir bitte nochmal helfen?
Jenny

AW: hier meine Testdatei
07.06.2013 12:34:45
Jenny
Hallo Tino,
ich erkenne eigentlich nur einen Unterschied, du hast Zahlen in Spalte E stehen, ich Formeln
aber ich werde auch mal versuchen eine Testdatei zu bauen, ich melde mich wieder
Jenny
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige