Autofiltrering med VBA


Här demonstreras en teknik för att filtrera en lista mha en combobox, vilken håller en unik lista av värden. Denna tekniska lösning blir intressant när vi använder oss av flera comboboxar och vill skapa ett användarvänligt gränssnitt.

Koden kan kopieras och klistras in direkt i berörda moduler eller så kan du hämta ett exempel här.

 

Följande bild visas förutsättningarna för exemplet:

 

Det vi ska göra är följande:

Steg 1 - Skapa Autofilter-listan

Följande procedur skapas i en standardmodul:

Option Explicit

Sub Skapa_Autofilter_Lista()

   '© 2002 Alla rättigheter XL-Dennis

   Dim wbBok As Workbook

   Dim wsBlad As Worksheet

   Dim rnLeverantor As Range, rnFilter As Range

   Dim vaLeverantor As Variant, vaLev As Variant

   Dim ncLeverantor As New Collection

   Dim i As Long

 

   Set wbBok = ThisWorkbook

   Set wsBlad = wbBok.Worksheets("Blad1")

    Application.ScreenUpdating = False

    With wsBlad

       'Om statusen för Autofilter är påslagen stängs den av här för

      'att ta bort det dolda namnet "FilterDatabas", vilket refererar till

      'det senaste skapade filtercellområdet.    

      .AutoFilterMode = False

      'Här aktiveras Autofilter-funktionen.

      .Range("B4").AutoFilter

      .OLEObjects("ComboBox1").Object.Clear

      Set rnLeverantor = .Range(.Range("B4"), .Range("B65536").End(xlUp))

   End With

 

   'Döljer Autofilter-fälten för listan.

   Set rnFilter = wsBlad.AutoFilter.Range

   For i = 1 To 3

      rnFilter.AutoFilter Field:=i, Visibledropdown:=False

   Next i

 

   'Läser in levarantörsnamn från det definierade cellområdet.

   vaLeverantor = rnLeverantor.Value

 

   'Skapar en unik lista av leverantörer (Dock ej sorterad lista).

   On Error Resume Next

   For i = LBound(vaLeverantor) To UBound(vaLeverantor)

      ncLeverantor.Add vaLeverantor(i, 1), CStr(vaLeverantor(i, 1))

   Next i

   On Error GoTo 0

 

   'Tilldelar listväljaren den unika listan.

   With wsBlad

      For Each vaLev In ncLeverantor

         .OLEObjects("ComboBox1").Object.AddItem vaLev

      Next vaLev

   End With

    Application.ScreenUpdating = True

End Sub

Steg 2 - Visa alla poster

Följande procedur skapas i en standardmodul:

Sub Visa_Alla_Poster()

   '© 2002 Alla rättigheter XL-Dennis

   Dim wbBok As Workbook

   Dim wsBlad As Worksheet

 

   Set wbBok = ThisWorkbook

   Set wsBlad = wbBok.Worksheets("Blad1")

 

   Application.ScreenUpdating = False

 

   'Om filtrering har gjorts visas alla poster igen.

   With wsBlad

      If .FilterMode Then .ShowAllData

   End With

 

   Application.ScreenUpdating = True

End Sub

Steg 3 - Visa filtrerad lista

Följande händelseprocedur skapas i arbetsbladets modul:

Option Explicit

 Private Sub ComboBox1_Change()

   '© 2002 Alla rättigheter XL-Dennis

   Dim rnAktiv As Range

   Application.ScreenUpdating = False

 

   Set rnAktiv = ActiveCell

   Range("B4").Select

 

   'Här sker filtreringen

   Selection.AutoFilter Field:=1, Criteria1:=ComboBox1.Value

 

   rnAktiv.Select

   Application.ScreenUpdating = True

End Sub

 

Så här kan listan se ut efter att filtrering har gjorts och B-kolumnen har dolts: