Avatar billede hbl Juniormester
17. marts 2025 - 15:45 Der er 16 kommentarer

Skjule rækker i Excel

Jeg har et Ark1 hvor jeg indtaster data, som behandles af Ark2.
På Ark2 har jeg en del rækker som skal være synlige hvis der er data i nogle celler i Ark1.
Jeg har lavet en "markør" i kolonne A på Ark2 som tildeler hver række en værdi ud fra data på Ark1.
Hvis værdien i celle i kolonne A på Ark2 er 0 skal rækken vises. Hvis værdien er -1 skal rækken skjules.
Der er ca 200  rækker der skal løbes igennem.

Ark2 er et inaktivt ark, hvor der ikke tastes data, men arkets udseende skifter karakter alt efter hvilke data der står i Ark1, og når disse data redigeres, skulle Ark2 gerne "efterses" for hvilke linjer der skal skjules/vises.

Kan nogen hjælpe mig med hvordan VBA koden skal være, og hvilket faneblad koden skal ligge på. (Denne_projektmappe, Ark1 eller Ark2?
Avatar billede jens48 Ekspert
17. marts 2025 - 16:15 #1
Er det ikke noget i denne retning du har brug for?

=FILTRER('Ark2'!A2:J201;'Ark2'!A2:A201=0;)
Avatar billede hbl Juniormester
17. marts 2025 - 18:59 #2
Med det begrænsede kendskab jeg har til VBA ser det da rigtigt ud, men hvor skriver jeg denne filter linje?
Avatar billede jens48 Ekspert
17. marts 2025 - 19:33 #3
Det har ikke noget med VBA at gøre. Du skriver formelen i den celle, hvor du vil have informationen. Formelen udfylder automatisk celler til højre og nedefter i nødvendigt omfang
Avatar billede hbl Juniormester
17. marts 2025 - 21:20 #4
Jeg forstår desværre ikke hvordan jeg bruger denne formel.

Jeg har gjort som følger:
I alle rækker i kolonne A på Ark2, er der indtastet en formel, som undersøger hvilke data der er på Ark1. Eksempel: =HVIS('Ark1'!T2>0;0;-1)
Dermed får jeg celler som enten har værdien 0 eller -1.

Jeg kan godt se ideen i at bruge filter. Jeg har oprettet en makro som udfører dette, og det virker. men jeg vil godt have det til at virke uden at skulle aktivere makroen hver gang.

Makroen ser sådan ud:

Sub Makro1()
'
' Makro1 Makro


'
    Sheets("Ark2").Select
    Columns("A1:A200").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$200").AutoFilter Field:=1, Criteria1:="0"
End Sub
Avatar billede jens48 Ekspert
18. marts 2025 - 09:37 #5
Jeg tror at du slet ikke har brug for at gå via Ark2. Prøv at skrive denne formel i et tomt ark celle A1:

=FILTRER('Ark1'!A2:J201;'Ark1'!T2:T201=0;)
Avatar billede hbl Juniormester
18. marts 2025 - 10:49 #6
Du er en tålmodig mand. Tak fordi du tager dig tid til en nybegynder.

Hmmm......
Jeg kan godt se hvad du mener. Jeg skal lige fintænke lidt over hvordan jeg kan bruge denne feature. :-)

Det er jo på Ark2 jeg undersøger om den linje jeg står på, skal have væredien 0 eller-1, alt efter de værdier der er indtastet i Ark1.
Flere rækker på Ark2 bruger de samme værdier fra Ark1, og nogle gange flere værdier for at validere om den pågældende række på Ark2 skal vises. De ca 200 rækker på Ark2 validerer data fra ca 30 celler på Ark1.
Avatar billede hbl Juniormester
18. marts 2025 - 12:41 #7
Jeg tror jeg kan få det til at virke, men det kræver dog at jeg re designer hele mit Ark2, da denne formel åbenbart ikke har det godt med flettede celler.
Sådan som jeg ser det, skal jeg beholde mit Ark2, og så oprette et Ark3 hvor jeg bruger denne formel til at hente data fra Ark2, såfremt at Ark2 har sat en markør for udskrift.
Er dette løsningen, eller er der en smutvej?
Avatar billede hbl Juniormester
18. marts 2025 - 13:24 #8
Det virkede ellers elegant med denne filtrering, men jeg mister desværre meget af den formatering som får udskriften til at se anstændig ud.
Er der ikke en løsning hvor jeg kan skjule linjerne i Ark2??
Avatar billede jens48 Ekspert
18. marts 2025 - 13:50 #9
OK, så er det måske alligevel bedre at lave det i VBA. Højrklik på Ark2 fanebladet og indsæt disse to små makroer under Vis Koder. Indsæt i arket 2 knapper og link den ene til SkjulLinjer, og den anden til VisLinjer

Sub SkjulLinjer()
For x = 1 To 200
If Cells(x, 1) = -1 Then
Cells(x, 1).EntireRow.Hidden = True
Else
Cells(x, 1).EntireRow.Hidden = False
End If
Next
End Sub

Sub VisLinjer()
Range("A1:A200").EntireRow.Hidden = False
End Sub
Avatar billede Dan Elgaard Ekspert
18. marts 2025 - 14:15 #10
Intet i vejen med Jens' løsning, men lidt kortere:

Sub SkjulLinjer()
    Cells.EntireRow.Hidden = False
    For x = 1 To 200
        Cells(x, 1).EntireRow.Hidden = (Cells(x, 1) = -1)
    Next
End Sub
Avatar billede hbl Juniormester
18. marts 2025 - 14:27 #11
Tak for hjælpen.
Det virker med de to knapper, selv om gennemløbstiden for makroen er forholdsvis lang.
Jeg har en løsning der virker, men jeg arbejder nok lidt videre med filtrer formlen, da den er langt mere elegant. Så må jeg se om jeg kan få outputtet lidt mere elegant også.

Mange tak for hjælpen.
Avatar billede hbl Juniormester
18. marts 2025 - 15:24 #12
jeg tænkte på om man kan programmere filterfunktionen i VBA?

Det er stadig i forlængelse af ovennævnte, men for ikke at blande tingene sammen, spørger jeg mere direkte:
Kan man programmere sig ud af at når en celle i kolonne K ændres, ikke ved fysisk indtasstning, men på baggrund af en =Hvis(xxx;xxx;xxx), så aktiveres filteret i kolonne K?

Jeg syntes at foreslåede makroer tager ret lan tid om at gennemløbes,(8-10 sek) , og det er jo ikke brugervenligt i vore dage. Filterfunktionen virker jo uden ventetid.
Avatar billede jens48 Ekspert
18. marts 2025 - 16:20 #13
FILTRER funktionen virker både på manuel indtastning og hvis ændringen sker via en formel.
Avatar billede ebea Ekspert
18. marts 2025 - 17:03 #14
For at "skrue" lidt ned for kodens gennemløbs tid, kan der justeres en anelse i Dan's løsning i #10.

Sub SkjulLinjer()
    Application.ScreenUpdating = False
    Dim x As Long
    Dim LastRow As Long
   
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For x = 1 To LastRow
        Cells(x, 1).EntireRow.Hidden = (Cells(x, 1).Value = -1)
    Next
    Application.ScreenUpdating = True
End Sub
Avatar billede Peter Professor
19. marts 2025 - 19:09 #15
Jeg lagde hele dit spørgsmål ind i Grok.com (AI), og fik dette 😉
Jeg kan hjælpe dig med at lave en VBA-kode, der automatisk skjuler eller viser rækker på Ark2 baseret på værdierne i kolonne A, når data ændres i Ark1. Her er en løsning:

Hvor skal koden ligge?
Koden skal placeres i Ark1's kode-modul (ikke "Denne_projektmappe" eller Ark2), fordi du vil have, at den kører, når der sker ændringer i Ark1. Dette gøres ved at bruge Worksheet_Change -begivenheden, som automatisk udløses, når data i Ark1 redigeres.

Logik
Når en celle i Ark1 ændres, tjekker vi, om ændringen påvirker "markørerne" i kolonne A på Ark2.
Derefter løber vi gennem de 200 rækker på Ark2 og skjuler eller viser dem baseret på værdien i kolonne A (0 = vis, -1 = skjul).
VBA-kode
Hendes er koden:

vba

Bryde sammen

Indpakning

Kopi
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Slå beregninger og skærmopdatering fra for at gøre koden hurtigere
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
   
    ' Definer variabler
    Dim ws2 As Worksheet
    Dim i As Long
    Dim lastRow As Long
   
    ' Sæt reference til Ark2
    Set ws2 = ThisWorkbook.Sheets("Ark2")
   
    ' Antag at vi tjekker rækker fra 2 til 201 (200 rækker i alt)
    lastRow = 201
   
    ' Løb gennem rækkerne i Ark2
    For i = 2 To lastRow
        If ws2.Cells(i, 1).Value = 0 Then
            ws2.Rows(i).Hidden = False ' Vis rækken
        ElseIf ws2.Cells(i, 1).Value = -1 Then
            ws2.Rows(i).Hidden = True ' Skjul rækken
        End If
    Next i
   
    ' Genaktiver beregninger og skærmopdatering
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
Sådan installerer du koden
Åbn din projektmappe i Excel.
Tryk på Alt + F11 for at åbne VBA-editoren.
I venstre rude (Project Explorer) finder du "Ark1" under "Microsoft Excel-objekter".
Dobbeltklik på "Ark1" for at åbne dets kode-modul.
Kopier og indsæt ovenstående kode i vinduet.
Luk VBA-editoren ( Alt + Q ).
Tilpasninger
Rækkeinterval : Koden antager, at dine 200 rækker starter fra række 2 og går til række 201 på Ark2. Hvis det er et andet interval (fx række 5 til 204), skal du ændre For i = 2 To lastRow til fx For i = 5 To 204 .
Afhængighed af Ark1 : Hvis "markørerne" i Ark2 kun opdateres, når specifikke celler i Ark1 ændres (fx et bestemt område som A1:B50), kan du tilføje en betingelse for at begrænse, hvornår koden kører. Eksempel:
vba

Bryde sammen

Indpakning

Kopi
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Tjek om ændringen sker i et bestemt område, fx A1:B50
    If Not Intersect(Target, Me.Range("A1:B50")) Is Nothing Then
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
       
        Dim ws2 As Worksheet
        Dim i As Long
        Dim lastRow As Long
       
        Set ws2 = ThisWorkbook.Sheets("Ark2")
        lastRow = 201
       
        For i = 2 To lastRow
            If ws2.Cells(i, 1).Value = 0 Then
                ws2.Rows(i).Hidden = False
            ElseIf ws2.Cells(i, 1).Value = -1 Then
                ws2.Rows(i).Hidden = True
            End If
        Next i
       
        Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
    End If
End Sub
Ark-navne : Sørg for, at arknavnet i koden ( "Ark2" ) matcher det faktiske navn på dit ark. Hvis det hedder noget andet (fx "Sheet2"), skal du ændre det i ThisWorkbook.Sheets("Ark2") .
Hvordan virker det?
Når du ændrer noget i Ark1, udløser Worksheet_Change koden.
Koden tjekker hver række i kolonne A på Ark2 og skjuler eller viser rækken baseret på værdien (0 eller -1).
Application.ScreenUpdating = False og Calculation = xlCalculationManual gør det hurtigere, især med 200 rækker.
Bemærkninger
Hvis "markørerne" i Ark2 beregnes med formler baseret på Ark1, skal du sikre dig, at disse formler opdateres korrekt, inden koden kører. Ovenstående kode antager, at markørerne allerede er opdateret.
Gem projektmappen som en makroaktiveret fil ( .xlsm ), så koden kan køre.
Avatar billede excelent Ekspert
31. marts 2025 - 08:25 #16
Højreklik på Ark2's fane, vælg "Vis programkode"
Indsæt denne kode :

Private Sub Worksheet_Activate()

Worksheets("Ark2").Range("A1:A200").AutoFilter Field:=1, Criteria1:="<>-1", visibledropdown:=True

End Sub

Obs. der skal være en værdi/overskrift i celle A1 på ark2

koden aktiveres hver gang du åbner/vælger Ark2
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Stort udvalg af Excel kurser til alle niveauer og jobfunktioner

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester