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