Filtrering uden at bruge filter

Denne opgave kunne lige så vel have været l'øst ved hjælp af filtrering, fx ved hjælp af Autofilter, og der kunne have været lavet en makro, der anvendte filterfunktionen, men i det konkrete tilfælde var der et ønske om at undgå at anvende filter.

Opgaven var beskrevet som et stort regneark med data i mange kolonner og mange rækker (omkring 1000 pt. men antallet stiger løbende). De enkelte kolonner indeholder forskellig information, der skal opdateres med mellemrum, men kun for en given måned ad gangen. I C-kolonnen er der registreret måneder for de enkelte posteringer. Et uddrag kunne se således ud

C1 indeholder en rulleliste (dropdown) i form af en datavalideringsliste med månedsnavnene samt "Alle" som vist i figuren. Når der vælges en måned i denne rulleliste, skal kun de posteringer fra den pågældende måned vises i regnearket; de øvrige skal skjules. Posteringerne i de enkelte rækker er ikke sorteret efter måned, men efter information i kolonne H (ikke vist i eksemplet). Nedenstående makro løser opgaven. Makroen er en hændelsesmakro (se evt. Hændelser under Programmering og den hændelse, der udløser afspilning af makroen er den såkaldte Worksheet_Change hændelse, der indtræffer, når der ændres i en celle i arket. Koden skal derfor placeres i kodearket for det konkrete regneark. (Højreklik på arkfanen og vælg 'Vis programkode'. Koden er her vist med kommentarer, der forklarer de enkelte dele

 

Private Sub Worksheet_Change(ByVal Target As Range)
'Der erklæres en enkelt variabel, som faktisk ikke er nødvendig, men som gør det nemmere
'at skrive koden

    Dim StrMnd As String
'Defineres som string, da den altid indeholder tekst.

'Så slås skærmopdatering fra så vi ikke skal se på at linjer forsvinder enkeltvis
    Application.ScreenUpdating = False

'Herefter undersøger vi om ændringer, der har udløst hændelsen er sket i celle C1
'I modsat fald skal makroen ikke gøre noget

    If Not Intersect(Target, Range("C1")) Is Nothing Then

'Så tjekkes om der er valgt "Alle" i rullelisten
'Hvis det er tilfældet vis alle linjer i det område, der er brugt og makroen afsluttesa
        If Target.Value = "Alle" Then
            ActiveSheet.UsedRange.Rows.EntireRow.Hidden = False
            Exit Sub
        End If

'Ellers sættes variablen StrMnd til den valgte måned
    StrMnd = Target.Value

'Nu undersøges kolonne nummer 3 (C-kolonnen) for hver række for at se om månednavnet i cellen
'svarer til indholder af variablen
'Hvis dette ikke er tilfældet skjules hele række
'Hvis der er lighed, vises rækken

        For Each r In ActiveSheet.UsedRange.Rows
            If Cells(r.Row, 3) <> StrMnd Then
                r.EntireRow.Hidden = True
            Else
                r.EntireRow.Hidden = False
            End If
        Next r
    End If

'Til sidst skal vi lige huske at slå skærmopdateringen til igen
Application.ScreenUpdating = True

End Sub

- Tilbage til makroer -
- Tilbage til Excel -