Avatar billede Nadiavbronx Juniormester
28. juni 2016 - 20:32 Der er 27 kommentarer og
1 løsning

Skjul kolonner i VBA

Hej
Jeg er ved at lave et skema i excel, hvori man indtaster et tal i en celle fx "E5" = 2 derefter skal alle kolonner udover to kolonner som går fra "F14:Y14" skjules, så der ikke er unødvendige celler i skemaet.

Vh. Nadia
Avatar billede kim1a Ekspert
28. juni 2016 - 22:17 #1
Skjul kolonner i vba:
Columns("A:A").entirecolumn.hidden = true

Så manger du blot at definere nogle variable som vælger hvilke kolonner...

En ide kunne være at skjule dem alle via vbaen først og så bagefter definere hvilke der skal vises (hvis det er nemmere).
Avatar billede Nadiavbronx Juniormester
29. juni 2016 - 08:52 #2
Jeg kan umiddelbart ikke få koden til at virke... Men dette skyldes måske at jeg har en del kodning stående inden da..
Avatar billede jens48 Ekspert
02. juli 2016 - 22:24 #3
For eksempel sådan:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("E5")) Is Nothing Then
    Columns("F:Y").Hidden = True
    For x =5 To 5 + Cells(5, 5)
    Columns(x).Hidden = False
    Next
  End If
End Sub
Avatar billede Nadiavbronx Juniormester
04. juli 2016 - 16:16 #4
Jeg har nu gemt kolonnerne til at starte med, men hvilken kode skal jeg så bruge til at fremkalde dem en efter en??
Avatar billede kim1a Ekspert
04. juli 2016 - 21:50 #5
Columns("[hvad end du har kaldt kolonnerne]").entirecolumn.hidden = false
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 09:20 #6
Hvad med hvis jeg gerne vil vise fx 5 kolonner F:J hvis celle værdien i C4 = 5, hvad er koden så?
Avatar billede jens48 Ekspert
05. juli 2016 - 09:30 #7
Som jeg skrev i #3:

  For x =5 To 5 + Cells(5, 5)
    Columns(x).Hidden = False
    Next
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 11:01 #8
Når du skriver "for x = 5 to 5 + cells (5, 5)" - hvad indikere så i denne at de skal gå ud fra hvad der skrives i cellen C4? Og hvad betyder det at der står 5 + cells (5, 5) ??
Avatar billede jens48 Ekspert
05. juli 2016 - 11:14 #9
I dit første indlæg skrev du E5 og det har jeg skrevet som Cells(5,5), men da du har rettet det til C4, bør du skrive Cells(4,3) i stedet.
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 11:28 #10
Det giver god mening, men når jeg intaster koden og skriver 5 i celle C4, så fremkommer kun 4 kolonner, hvor der skal fremkommer 5??
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 11:38 #11
Skal koden som du skrev i #7 skal den bare gentages op til 20, hvis jeg værdien i C4 kan være fra 1-20??
Avatar billede jens48 Ekspert
05. juli 2016 - 12:49 #12
Hvis det stadig er kolonnerne F til Y det drejer sig om vil makroen se således ud:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("C4")) Is Nothing Then
    Columns("F:Y").Hidden = True
    For x = 5 To 5 + Cells(4, 3)
    Columns(x).Hidden = False
    Next
  End If
End Sub
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 13:29 #13
Koden virker godt, men viser en kolonne mindre end hvad der står i cellen C4?
Avatar billede jens48 Ekspert
05. juli 2016 - 15:11 #14
Det forstår jeg ikke. Hvis jeg f. eks skriver 2 i C4, så vises kolonnerne F og G
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 15:30 #15
Jeg har rettet koden lidt til og nu virker dem optimalt - mange tak for hjælpen..

Ved du evt. hvordan man summerer en sum med kun de viste celler?? Fx. en formel som kun summerer de celler der vises og ikke medregner de skjulte celler??
Avatar billede jens48 Ekspert
05. juli 2016 - 16:28 #16
Der findes en funkion der hedder
=SUBTOTAL(109;F4:F23), men den virke kun når området er lodret. Hvis du vælger for en række tæller den alt med.
Men med en makro vil det kunne lade sig gøre. Jeg har sat den ind i den oprindelige makro, og summen skrives i E5.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("C4")) Is Nothing Then
    Columns("F:Y").Hidden = True
    For x = 5 To 5 + Cells(4, 3)
    Columns(x).Hidden = False
    Next
   
    Range("E5") = 0
    For x = 6 To 25
    If Columns(x).Hidden = False Then
    Range("E5") = Range("E5") + Cells(4, x) 'række 4 testes
    End If
    Next
 
  End If
End Sub
Avatar billede Nadiavbronx Juniormester
05. juli 2016 - 20:12 #17
Den ovenstående løsning du har skrevet tager den både højde for skjulte rækker og kolonner?
Avatar billede jens48 Ekspert
06. juli 2016 - 00:23 #18
Nej, den checker kun for skjulte kolonner, og summerer kun række 4 (bestemt af 4-tallet i 10. række (cells(4,x))
Avatar billede Nadiavbronx Juniormester
06. juli 2016 - 00:35 #19
Du kender ikke til en kode der tager højde for begge dele, altså hvis jeg har skjult nogle rækker og har skjult nogle kolonner skal den ikke medregne værdierne i de skjulte kolonner og rækker??
Avatar billede jens48 Ekspert
06. juli 2016 - 00:40 #20
Skriv hvilke rækker og kolonner der skal checkes, så laver jeg den i morgen
Avatar billede Nadiavbronx Juniormester
06. juli 2016 - 01:24 #21
Tak! Det er sådan at alt efter hvor mange rækker og kolonner der er viste så skal den udregne som at hvis der fx er 3 rækker vist og 5 kolonner så udgøre de til sammen 100% uden at medregne de resterende 7 skjulte rækker og de resterende kolonner.

Når alle rækker er vist drejer det sig om række 15 til og med 24, og alle kolonner er fra G til og med Z.

Og værdierne skal regnes for hver af rækkerne og til sidst summeres de i en celle som udgøre de 100%
Så får række 15, skal resultatet stå i celle F15, og for række 16 i F16 osv.

Mange tak for din hjælp!
Avatar billede jens48 Ekspert
06. juli 2016 - 09:11 #22
Hvis jeg har forstået dig korrekt kan du bruge denne makro:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("C4")) Is Nothing Then
    Columns("F:Y").Hidden = True
    For x = 5 To 5 + Cells(4, 3)
    Columns(x).Hidden = False
    Next
   
    Range("F15:F24").ClearContents
    For r = 15 To 24
    For k = 7 To 25
    If Columns(k).Hidden = False Then
    Cells(r, 6) = Cells(r, 6) + Cells(r, k)
    End If
    Next
    Next
 
  End If
End Sub
Avatar billede Nadiavbronx Juniormester
06. juli 2016 - 10:37 #23
Jeg har disse koder stående i arket nu:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C4")) Is Nothing Then
       
        If Range("C4") <> "" Then
            Application.ScreenUpdating = False
           
            n = Range("C4")
           
            Range("14:25").Rows.Hidden = False
            Range(15 + n & ":25").Rows.Hidden = True
           
            Application.ScreenUpdating = True
           
        End If
       
    End If
   
  If Not Intersect(Target, Range("C5")) Is Nothing Then
    Columns("G:Z").Hidden = True
    For x = 5 To 6 + Cells(5, 3)
    Columns(x).Hidden = False
    Next
  End If

End Sub
 
Hvis jeg sætter den kode ind som du har lavet ovenfor så kan jeg umiddelbart ikke få det til at virke. Cellen som angiver antal rækker er C? og koden som angiver antal kolonner der skal vises er C5.
Avatar billede jens48 Ekspert
06. juli 2016 - 12:59 #24
Prøv med denne makro:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C4:C5")) Is Nothing Then
        If Target.Row = 4 And Range("C4") <> "" Then
            Application.ScreenUpdating = False
            Range("F15:F24").EntireRow.Hidden = True
            For x = 14 To 14 + Cells(4, 3)
            Rows(x).Hidden = False
            Next
        End If
        If Target.Row = 5 And Range("C5") <> "" Then
            Columns("G:Z").Hidden = True
            For x = 6 To 6 + Cells(5, 3)
            Columns(x).Hidden = False
            Next
        End If
             
  Range("F15:F24").ClearContents
    For r = 15 To 24
    For k = 7 To 25
    If Columns(k).Hidden = False Then
    Cells(r, 6) = Cells(r, 6) + Cells(r, k)
    End If
    Next
    Next
 
  Application.ScreenUpdating = True
End If
End Sub
Avatar billede Nadiavbronx Juniormester
06. juli 2016 - 20:16 #25
Jeg kan umiddelbart ikke få koden til at virke - når jeg efter at have indsat koden i arket prøver at skjule nogle kolonner og rækker så tæller den stadig de skjulte rækker med og siger at den er 500% i første rækker, hvor den skal tælle hvor mange celler der er udfyldt med et 1-tal ud af de viste kolonner i rækken...
Avatar billede jens48 Ekspert
06. juli 2016 - 23:55 #26
Makroen kører kun, hvis du skriver noget i cellerne C4 eller C5. Hvis du bruger andre metoder til at skjule rækker eller kolonner, sker der ingen genberegning
Avatar billede Nadiavbronx Juniormester
07. juli 2016 - 09:08 #27
Okay jeg prøver lige igen så, men hvor angiver den hvilken celle den skal skrive summen i?
Avatar billede jens48 Ekspert
07. juli 2016 - 09:19 #28
Det er instruktionen
  Cells(r, 6) = Cells(r, 6) + Cells(r, k)
Altså i kolonne F for den givne række
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

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