Just nu i M3-nätverket
Gå till innehåll
short

AutoFilter

Rekommendera Poster

Jag har fyra kolumner med data där varje kolumn har ett AutoFilter. Jag behöver ta reda på hur varje AutoFilter är inställt. Jag har försökt med hjälp av AutoFilter.Property men jag lyckas inte få till det.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

kanske

    Dim v As Filter
    Set v = Me.AutoFilter.Filters(4)
    Debug.Print v.Criteria1
 

ett bra sätt att undersöka saker som detta är att sätta upp en variabel av det man vill undersöka, tilldela denna det man vill undersöka, sätta en bevakning på denna variabel och sedan sätta en breakpoint efter den tilldelats ett värde.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag testade med filter i två kolumner

Sub nn()
 Dim v As Filter
    If ActiveSheet.AutoFilterMode Then
        Set v = ActiveSheet.AutoFilter.Filters(1)
        Debug.Print v.Criteria1
        Debug.Print v.Criteria2
        Debug.Print v.Criteria3
        Set v = ActiveSheet.AutoFilter.Filters(2)
        Debug.Print v.Criteria1
    End If

End Sub

Om jag för filter1 har två urvalskriteria så får jag programfel när jag försöker få tag på det tredje (som inte finns-jag vet ju inte hur många som finns). Jag får också programfel om jag för ett filter tillåter alla (dvs inte har filtrerat bort några värden). Hur undviker jag detta?

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

En del går att göra för att undvika fel och en del fel får man hantera, i stil med

     On Error Resume Next
     Dim i As Integer
     For i = 1 To 4
        If Me.AutoFilter.Filters(i).On Then
            Debug.Print Me.AutoFilter.Filters(i).Criteria1
            Debug.Print Me.AutoFilter.Filters(i).Criteria2
        End If
    Next i
    On Error GoTo 0

Borde vara en fungerande lösning för dig.

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Sub nn()
 Dim v As Filter
 Dim i As Integer
    If ActiveSheet.AutoFilterMode Then
        On Error Resume Next
        For i = 1 To 4
            If ActiveSheet.AutoFilter.Filters(i).On Then
                Set v = ActiveSheet.AutoFilter.Filters(i)
                Cells(20, 5 + i) = v.Criteria1
                Cells(21, 5 + i) = v.Criteria2
                Cells(22, 5 + i) = v.Criteria3
                Cells(23, 5 + i) = v.Criteria4
                Cells(24, 5 + i) = v.Criteria5
            Else
                Cells(20, 5 + i) = 0
            End If
        Next i
        On Error GoTo 0
    End If
End Sub

Jag har försökt med ovanstående men jag får bara ut två kriterier per kolumn även om det finns flera. Det verkar som om det vid fler än två kriterier så lagras det en Array i Criteria1. Frågan är hur jag kommer åt detta (dvs om så är fallet).

Redigerad av short

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

mmh, intressant. Här får man nog inom felhanterar undersöka vad som gömmer sig bakom ett criteria. För som du säger tycks det när det blir flera så gömmer sig dessa i en array.

 

Dvs du måste kolla om det är du har, en array, ett värde eller ingenting.

 

jag tror du gör bäst i att skapa en subfunktion till vilken du skickar ett kriteria. Låt subfunktionen testa vad du har och lägga in värdena i en array så att du alltid har en array att stega igenom i din huvudrutin. En tom array om inget kriteria, en array med en term om ett kriteria och till slut en array med flera poster om det är vad som gömmer sig bakom.

 

Kanske en rutin till som omsluter som i sin tur du skickar ett helt filter till och får tillbaka alla kriterier som en array.

 

Denna lilla testkod kan nog leda dig på rätt väg.

Sub test()
    Dim k As Integer
    
    Dim af As AutoFilter
    Set af = Me.ListObjects(1).AutoFilter
    With af.Filters(1)
        If .On = False Then
            Debug.Print "inget"
        Else
            If .Count = 1 Then
                Debug.Print "värde"
            Else
                Debug.Print "array med " & .Count & " värden"
            End If
        End If
    End With
        
End Sub

Se, helt utan felhanterare, alltid bra.

 

Och psst, bort med ActiveSheet, använd en absolut adressering av arbetsblad. Namn eller, som ovan, med Me om du arbetar på bladets kodblad.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Det börjar närma sig - kanske. Din testrutin fungerar. Jag behöver dock läsa vilka värden AutoFiltret är inställt på. af.Filters(1) innehåller fem värden i min test men vilka är de? Jag försöker läsa innehållet i af.Filters men det går inte. Jag har försökt med Criteria1 men det går inte heller.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

jaja, okejdå, gör hela jobbet åt dig :)

Option Base 1
Function GetCriterias(f As Filter) As String()
    Dim va() As String
    Dim k As Integer
    With f
        If .On = False Then
            ReDim va(1)
            va(1) = ""
        Else
            If .Count = 1 Then
                ReDim va(1)
                va(1) = .Criteria1
            End If
            If .Count = 2 Then
                ReDim va(2)
                va(1) = .Criteria1
                va(2) = .Criteria2
            End If
            If .Count > 2 Then
                ReDim va(.Count)
                For k = 1 To .Count
                    va(k) = .Criteria1(k)
                Next k
            End If
        End If
    End With

    GetCriterias = va

End Function

Sub MyRunner()
    Dim va() As String
    va = GetCriterias(Me.ListObjects(1).AutoFilter.Filters(1))
    Dim i As Integer
    For i = 1 To UBound(va)
        Me.Cells(i, 5) = va(i)
    Next i
End Sub

Option Bas 1 i början så att arrayer beter sig som arrayer ska, det vill säga börjar med index 1.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Sub AA()
    Dim af As AutoFilter
    Dim v As Filter
    Dim a As Integer
    Dim i As Integer
    Dim k As Integer
    
    Set af = Sheets("Blad1").AutoFilter
    For i = 1 To 4
        With af.Filters(i)
            If .On = False Then
                Cells(20, 5 + i) = 0
            Else
                a = af.Filters(i).Count
                Set v = ActiveSheet.AutoFilter.Filters(i)
                If a = 2 Then
                    Cells(20, 5 + i) = v.Criteria1
                    Cells(21, 5 + i) = v.Criteria2
                Else
                    If a = 1 Then
                        Cells(20, 5 + i) = v.Criteria1
                    Else
                        For k = 0 To a - 1
                            Cells(20 + k, 5 + i) = v.Criteria1(k + 1)
                        Next k
                    End If
                End If
            End If
        End With
    Next i
    
End Sub


Jag fick just ihop det själv. Ovanstående kod verkar fungera.

Redigerad av short

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

fast snyggare, programmeringsmässigt, om du kan isolera ut delen som hanterar kriterierna som jag gjort ovan. Då kan du återanvända koden för andra filter.

 

Bra att du ordnade det själv :)

 

Jag ska dock betona en gång till:

bort med ActiveSheet! Adressera direkt!

 

Du adresserar ditt autofilter på två olika sätt i koden, räcker med att du "hittar" det en gång som du gör på rad sju.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...