RSS

Skjul rækker/kolonner med Excel VBA-makroer

På denne side:

Skjul tomme kolonner

Brug søgefunktionen

Automatisk kode

Skjul rækker med x

Skjul rækker med kriterium

Et ofte stillet spørgsmål er, hvordan man skjuler rækker og/eller kolonner i Excel med en VBA makro, hvis den og den betingelse er opfyldt.

På denne side viser jeg eksempler på, hvad man kan gøre. VBA-koden kan du markere med musen, kopiere med CTRL+C og indsætte i et VBA-modul med CTRL+V. Du kan også downloade et zip-komprimeret regneark med eksemplerne. For at pakke det ud kan du højreklikke og vælge "Udpak alle...", eller hvad Windows nu foreslår.

Der er grundliggende to forskellige metoder, man kan bruge. Man kan gøre det "automatisk" ved at lægge kode ind i fanebladets WorkSheet_Change procedure, som aktiveres, hver gang der sker en ændring i et eller andet på fanebladet - fx hvis der indsættes eller slettes noget i en celle.

Den anden vinkel er at køre en "almindelig" makro, som undersøger, om visse betingelser er opfyldt. Lad os starte med den sidste metode.

Det første eksempel viser, hvordan man kan skjule tomme kolonner, og det næste hvordan man kan bruge søgefunktionen og skjule rækker, hvis en bestemt værdi findes i et givet område.

Før vi går i gang med at gemme og skjule, vil jeg dog lige vise, hvordan man kan få de skjulte rækker og kolonner frem igen!


Sub VisSkjulte()

'Viser alle skjulte rækker og kolonner
'i det aktive ark (faneblad).

Rows.Hidden = False
Columns.Hidden = False
End Sub

Skjul tomme kolonner

Dette er et ret enkelt eksempel på, hvordan man kan skjule tomme kolonner i et område - her kolonne 1 til 26.


Sub SkjulTommeKolonner()
'Gennemløber de første 26 kolonner og
'skjuler dem, hvis de er tomme.

Dim rCell As Range
Dim rTest As Range
Dim lCol As Long

On Error GoTo Fejl

'Skærmopdatering slås fra for at øge hastigheden.
Application.ScreenUpdating = False

'Vi gennemløber nu kolonnerne fra venstre mod højre.
For lCol = 0 To 25 Step 1
   'rCell sættes = cellen lCol til højre
   'for celle A1.
   Set rCell = Range("A1").Offset(0, lCol)

   'Hvis cellen er tom
   If Len(rCell.Value) = 0 Then
      'Gå til første celle nedefter, som har
      'et indhold. Hvis der ikke er nogen
      '"på vejen," havner vi i den nederste celle.
      Set rTest = rCell.End(xlDown)
      If rTest.Row = Rows.Count And Len(rTest.Value) = 0 Then
         'Kolonnen skjules.
         Columns(rCell.Column).Hidden = True
      End If
   End If
Next

BeforeExit:
Set rCell = Nothing
Set rTest = Nothing
'Skærmopdatering slås til igen
Application.ScreenUpdating = True
Exit Sub
Fejl:
MsgBox Err.Description & " Procedure SkjulTommeKolonner"
Resume BeforeExit
End Sub

Brug af søgefunktionen

Det følgende eksempel gør brug af Excels søgefunktion i et afgrænset område - her kolonne B, men det kan let ændres.

Vi beder brugeren fortælle, hvad der skal søges efter, og en række skjules, hvis søgeværdien optræder i kolonne B. Bemærk at "?" og "*" kan bruges som wildcards eller "jokertegn".


Sub FindSkjul()
'Skjuler rækker, hvor der står en bestemt værdi i kolonne B.

Dim vFind
Dim rSearch As Range

On Error GoTo ErrorHandle

'Vi beder om en søgeværdi. "?" og "*" i den
'indtastede tekst vil fungere som wildcards/"jokere".
vFind = InputBox("Skriv, hvad der skal søges efter.")
If Len(vFind) = 0 Then Exit Sub

Application.ScreenUpdating = False

'I dette eksempel gennemsøges kun kolonne B.
'Vil man fx gennemsøge hele fanebladet, skriver
'man fx "With ActiveSheet" eller "With Worksheets(nr. eller navn)
'Man kan også definere et andet range end kolonne B.
With Columns("B:B")
   Set rSearch = .Find(vFind, LookIn:=xlValues)

   'Hvis værdien blev fundet:
   If Not rSearch Is Nothing Then
      'skjules rækken
      rSearch.EntireRow.Hidden = True

      'Vi starter nu en løkke, som finder alle
      'andre forekomster. Forekomster i skjulte
      'rækker findes ikke af søgningen.
      Do
         Set rSearch = .FindNext(rSearch)
         If Not rSearch Is Nothing Then
            'Hvis resultatet af søgningen ikke er
            'ingenting skjules rækken.
            rSearch.EntireRow.Hidden = True
         Else
            'Hvis rSearch var = Nothing, var der
            'ikke flere forekomster, og løkken forlades.
            Exit Do
         End If
      Loop
   End If
End With

BeforeExit:
Set rSearch = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Procedure FindSkjul"
Resume BeforeExit
End Sub

Automatisk kode

De næste to makroer er eksempler på det, jeg har valgt at kalde "automatisk kode," fordi makroerne køres automatisk, hvis en bestemt betingelse er opfyldt. Man skal altså ikke gøre noget aktivt à la trykke på en trykknap eller lignende for at eksekvere koden.

Det kan man gøre ved at lægge VBA-kode ind i fanebladets/arkets eget kodeblad. Her kan "events" (hændelser) automatisk udløse, at VBA-kode køres.

Konkret benytter vi os af standardproceduren Worksheet_Change, som automatisk kaldes, når der sker en ændring i fanebladet/arket. Hvis du ikke kan se fanebladenes kodeark i VBA-editoren, kan du taste CTRL+R for at åbne vinduet med Project Explorer:

Project Explorer

De følgende Worksheet_Change procedurer skal ligge i fanebladets kodeark for at virke.

Det første eksempel er såre enkelt: Hvis man indsætter et "x" i kolonne A, vil den pågældende række blive skjult. Hvis man indsætter et 0 (nul), vil alle skjulte rækker blive vist igen, og gamle indtastninger i kolonne A slettes.

I det sidste eksempel kan man indtaste noget i celle A1, og alle rækker (undtaget række 1), som indeholder samme værdi i kolonne A vil blive skjult.

Det er ikke ulig eksemplet, hvor vi brugte søgefunktionen, blot bruger vi her gennemløb af cellerne i stedet.

Skjul rækker med x


Private Sub Worksheet_Change(ByVal Target As Range)
'Denne makro demonstrerer, hvordan man "automatisk"
'kan skjule rækker ved at indsætte et bestemt eller
'vilkårligt tegn i kolonne A. Det behøver ikke være
'kolonne A - den er bare valgt for eksemplets skyld.
'I eksemplet vises alle skjulte rækker igen, hvis der
'indtastes et 0 (nul) i kolonne A.

On Error Resume Next

'Hvis det ikke er kolonne A, forlades proceduren.
With Target
   If .Column <> 1 Then
      Exit Sub
   Else
      'Følgende udelades hvis det ligegyldigt,
      'hvad der indtastes. I så fald skal
      'man tjekke, om der er indtastet noget,
      'da rækken ellers vil blive akjult,
      'hvis brugeren fx ændrer baggrundsfarven
      'uden at skrive noget.
      'Den kontrol kan man lave ved at tjekke,
      'om:
      'Len(Target.Value) > 0
      If .Value = "x" Then
         'Skjuler rækken.
         .EntireRow.Hidden = True
      End If

      'Hvis det er et nul, vises alle skjulte
      'rækker og tidligere indtastninger slettes.
      ' Vi tjekker længden af det indtastede,
      'ellers vil et tryk på "Delete" give samme resultat.
      If .Value = 0 And Len(.Value) > 0 Then
         'For at undgå gentagne kald af denne
         'procedure, kan flg. kommando bruges.
         Application.EnableEvents = False

         'Viser alle skjulte rækker
         Rows.Hidden = False

         'Sletter tidligere indtastninger
         Columns(1).Clear
         Application.EnableEvents = True
      End If
   End If
End With
End Sub

Skjul rækker med kriterium

Det sidste eksempel viser, hvordan man kan skjule alle rækker, som i kolonne A har samme indhold som celle A1.

Det hele kunne sådan set godt skrives i fanebladets Worksheet_Change procedure, men for eksemplets skyld har jeg valgt, at Worksheet_Change proceduren kalder en "normal" procedure/makro til at udføre noget af arbejdet.

Worksheet_Change proceduren skal altså indsættes i fanebladets kodeark, mens proceduren SkjulMedKriterie skal indsættes i et modul.


Private Sub Worksheet_Change(ByVal Target As Range)
'Denne procedure kaldes automatisk,
'når der ændres noget i fanebladet.

On Error GoTo ErrorHandle

'Hvis det ikke er celle A1, hopper vi ud.
If Target <> Range("A1") Then
   Exit Sub
Else
   'Slår skærmopdatering fra
   Application.ScreenUpdating = False

   'Hvis der er indsat et nul eller tastet
   'delete, vises alle skjulte rækker.
   If Target.Value = 0 Then
      'Vis skjulte rækker.
      ActiveSheet.Rows.Hidden = False
   ElseIf Len(Target.Value) > 0 Then
      'Den følgende kommando forhindrer,
      'at denne procedure kaldes, når
      'makroen laver ændringer.
      'Når vi er færdige, slår vi
      'event-behandlingen til igen.
      Application.EnableEvents = False

      'Kalder proceduren SkjulMedKriterie
      '(i Module1) som samtidig får at
      'vide, hvad der står i celle A1.
      'Det kunne den selvfølgelig godt
      'selv finde ud af, men det er jo
      'bare et eksempel :-)
      SkjulMedKriterie Target.Value

      'Slår event-behandlingen til igen.
      Application.EnableEvents = True
   End If
End If

BeforeExit:
Application.ScreenUpdating = True
Range("A1").Activate
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Procedure Worksheet_Change"
Resume BeforeExit
End Sub

Den følgende procedure indsættes i et almindeligt modul.


Sub SkjulMedKriterie(ByVal sXY As String)
'Denne procedure kaldes af Worksheet_Change
'proceduren i fanebladets kodeblad.
'Makroen skjuler alle rækker, der i kolonne A
'har samme værdi som det, der er indsat i celle A1.

Dim rCell As Range
Dim rRange As Range

On Error GoTo ErrorHandle

Set rCell = Range("A65536")
If rCell.Value = sXY Then
   rCell.EntireRow.Hidden = True
End If

'Vi finder nu den nederste celle med indhold.
Set rCell = rCell.End(xlUp)

'Hvis det er celle A1, hopper vi ud.
If rCell.Row = 1 Then GoTo BeforeExit

'Ellers sættes det range, vi vil gennemløbe,
'til området A2 til nederste celle med indhold.
Set rRange = Range(rCell, Range("A2"))

'Nu gennemløbes området, og celleværdierne
'sammenlignes med værdien i celle A1.
'Hvis de er identiske, skjules rækken.
For Each rCell In rRange
   If rCell.Value = sXY Then
      'Skjul rækken
      rCell.EntireRow.Hidden = True
   End If
Next

BeforeExit:
Set rCell = Nothing
Set rRange = Nothing
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Procedure SkjulMedKriterie"
Resume BeforeExit
End Sub

Det var det. Som nævnt øverst på siden kan du downloade et zip-komprimeret regneark med eksemplerne.

Relateret: