Avatar billede kim1a Ekspert
27. februar 2012 - 15:08 Der er 15 kommentarer og
1 løsning

Skjul hvis vist og vis hvis skjult

Kære eksperter

Jeg er ny i VBA, så træd varsomt :-)

Jeg har et ark med statistik for en række filialer, nogle af disse filialer er opdelt i underafdelinger, ligesom der er flere typer af medarbejdere.

Jeg ønsker at lave makroer til at sætte i knapper der kan trykkes på så man kan ændre arkets udseende alt efter hvilke filialer og typer/afdelinger man vil se.

En af mine makroer ser således ud:
Rows("25").Select
If Selection.EntireRow.Hidden = False Then _Selection.EntireRow.Hidden = True Else _Selection.EntireRow.Hidden = False
Rows("30").Select
If Selection.EntireRow.Hidden = False Then _Selection.EntireRow.Hidden = True Else _Selection.EntireRow.Hidden = False

_ er blot indsat for at lette læseforståelsen her - det er forsættelsen af en linje.
Makroen checker om linjen er skjult - hvis det er tilfældet skal den vise den og visa versa.

Problemet begynder når jeg har flere af denne type og enkelte af makroerne skal skjule/vise de samme linjer. Her kan opstå en fejl hvis man klikker på først en type vis/skjul og derefter på en anden uden at have "nulstillet" den første.

jeg overvejer om jeg blot skal lave en knap der nulstiller, men det fremmer ikke læsevenligheden. Arket bruges til folk som f.eks. går i stå hvis kolonne a er uden for billedet.
Avatar billede Mads Larsen Nybegynder
28. februar 2012 - 09:46 #1
Nu er jeg ikke helt sikker på jeg forstår problemet helt? Lyder som om der går kage i det, når der trykkes på 2 knapper lige efter hinanden?

Men når du snakker om nulstille er det så du vil vise alle rækker igen?

Du kunne evt. prøve med :

    If Rows("25").EntireRow.Hidden = True Then
        Rows("25").EntireRow.Hidden = False
    Else
        Rows("25").EntireRow.Hidden = True
    End If

Istedet for at vælge rækken først.
Avatar billede kim1a Ekspert
28. februar 2012 - 10:31 #2
Det kan godt være det er lidt nemmere at vise det:

Linjenr - tekst - data
1 - Filial A - Type A
2 - Filial A - Type B
3 - Filial B - Type A
4 - Filial B - Type B

Jeg skal bruge en makro som kan skjule/vise type B og en anden som kan skjule/vise Filial A.

Problemet er at hvis jeg f.eks. har skjult Type B og så derefter vil skjule filial A så ender jeg (med mit nuværende niveau af makro) med at jeg pludselig har det til at se således ud:
1 - Rækken skjult
2 - Filial A - Type B
3 - Filial B - Type A
4 - Rækken skjult

Det er jo fordi jeg bruger linjens nummer til at angive - og makroen reelt blot gør det omvendte af nuværende status - altså hvis rækken er skjult viser den.
Når så jeg f.eks. har den skjult i forvejen (fordi den hører til filial A) så vil den blive vist når jeg vælger at trykke på knappen for skjul/vis Type B.

Se filen på http://shares.keriksen.dk/s#11cc2bcb-cef9-4acd-8650-b71324c0b919/keriksencloud.clouddrive.keriksen.dk/hj%C3%A6lp.xlsm
Avatar billede Mads Larsen Nybegynder
28. februar 2012 - 11:21 #3
Håber det kan læses.
Det ser ud til at se ordenligt ud når det bliver kopieret videre :)

Jeg har tilføjet nogen globale variabler.
Dim TypeA As Boolean
Dim TypeB As Boolean
Dim TypeC As Boolean

Sub Opdeling()
'
' Skjul/Vis Opdeling
'

    For i = 8 To 22 Step 1
        If Cells(i, 2).Text = "Type A" Then
            If TypeA = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        ElseIf Cells(i, 2).Text = "Type B" Then
            If TypeB = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        ElseIf Cells(i, 2).Text = "Type C" Then
            If TypeC = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        Else
            If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
        End If
    Next
   
    For i = 33 To 42 Step 1
        If Cells(i, 2).Text = "Type A" Then
            If TypeA = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        ElseIf Cells(i, 2).Text = "Type B" Then
            If TypeB = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        ElseIf Cells(i, 2).Text = "Type C" Then
            If TypeC = False Then
                If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
            End If
        Else
            If Rows(i).EntireRow.Hidden = True Then Rows(i).EntireRow.Hidden = False Else Rows(i).EntireRow.Hidden = True
        End If
    Next

End Sub

Sub Vis_adm()
'
' Skjul/Vis admin
'
    If TypeC = False Then
        TypeC = True
    Else
        TypeC = False
    End If
         
    Rows("10").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("15").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("20").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("25").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("30").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("35").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("40").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("45").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("50").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("55").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("60").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("65").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("70").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("75").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Rows("80").Select
    If Selection.EntireRow.Hidden = False Then Selection.EntireRow.Hidden = True Else Selection.EntireRow.Hidden = False
    Range("A1").Select
   
End Sub
Avatar billede Mads Larsen Nybegynder
28. februar 2012 - 11:22 #4
Håber det kan hjælpe dig lidt.
Avatar billede kim1a Ekspert
28. februar 2012 - 11:57 #5
Du skal da have point for dit forsøg - men jeg kan ved at starte med at skjule filial og dernæst type ende ud med et skema hvor f.eks. filial G og type C står alene

Din kode var bare lidt mere "lækker" end min :-)
Avatar billede store-morten Ekspert
28. februar 2012 - 12:25 #6
Har du overvejet at lege med filter?

Sub SkjulTypeC()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2, Criteria1:=Array( _
        "I alt", "Type A", "Type B", "="), Operator:=xlFilterValues
End Sub

Sub SkjulFilialA_B_C_F_G()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1, Criteria1:=Array( _
        "Filial D", "Filial E", "Filial H", "Filial I", "Filial J", "Filial K", "Filial L", _
        "Filial M", "Filial N", "Total", "="), Operator:=xlFilterValues
End Sub
Sub VisAlle()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1
End Sub
Sub VisAlleYTyper()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1
End Sub
Sub VisAlleFilialer()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2
End Sub

Eks.: http://gupl.dk/674816/
Avatar billede store-morten Ekspert
28. februar 2012 - 12:49 #7
Rettet lidt små fejl, mere oveskueligt opsat.
Sub SkjulTypeC()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2, Criteria1:=Array( _
        "I alt", _
        "Type A", _
        "Type B", _
        "="), _
        Operator:=xlFilterValues
End Sub

Sub SkjulFilialA()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1, Criteria1:=Array( _
        "Filial B", _
        "Filial C", _
        "Filial D", _
        "Filial E", _
        "Filial F", _
        "Filial G", _
        "Filial H", _
        "Filial I", _
        "Filial J", _
        "Filial K", _
        "Filial L", _
        "Filial M", _
        "Filial N", _
        "Total", "="), _
        Operator:=xlFilterValues
End Sub

Sub SkjulFilialA_B_C_F_G()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1, Criteria1:=Array( _
        "Filial D", _
        "Filial E", _
        "Filial H", _
        "Filial I", _
        "Filial J", _
        "Filial K", _
        "Filial L", _
        "Filial M", _
        "Filial N", _
        "Total", "="), _
        Operator:=xlFilterValues
End Sub

Sub VisAlle()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1
End Sub

Sub VisAlleFilialer()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1
End Sub

Sub VisAlleTyper()
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2
End Sub

http://gupl.dk/674818/
Avatar billede kim1a Ekspert
28. februar 2012 - 12:49 #8
Se så langt var jeg jo ikke kommet i min VBA bog endnu :-)

Det giver fin mening, men kræver desværre fire knapper - hvilket måske er lige i overkanten af hvad brugerne kan håndtere.

Men tak for hjælpen begge to - smid svar og jeg deler point ud.
Avatar billede Mads Larsen Nybegynder
28. februar 2012 - 13:12 #9
Her er et svar..

Håber du kan bruge det til dit ark :)
Avatar billede kim1a Ekspert
28. februar 2012 - 13:30 #10
Hey hvorfor ville den ikke dele - jeg skulle nok have ventet på svar fra store-morten også :-(
Avatar billede Mads Larsen Nybegynder
28. februar 2012 - 13:31 #11
Tror jeg du har ret i :)

Men hvad endte det egentlig med?

Fandt du en løsning på problemet?
Avatar billede store-morten Ekspert
28. februar 2012 - 17:40 #12
Prøv at kikke om dette kan bruges:
Sub SkjulFilialA_B_C_F_G()

If Range("A7").Value = "Filial" Then
      ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1, Criteria1:=Array( _
        "Filial D", _
        "Filial E", _
        "Filial H", _
        "Filial I", _
        "Filial J", _
        "Filial K", _
        "Filial L", _
        "Filial M", _
        "Filial N", _
        "Total", "="), _
        Operator:=xlFilterValues
        Range("A7").Value = "Filial On"
Else
  ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=1
  Range("A7").Value = "Filial"
End If

End Sub

Sub SkjulTypeC()

If Range("B7").Value = "Type" Then
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2, Criteria1:=Array( _
        "I alt", _
        "Type A", _
        "Type B", _
        "="), _
        Operator:=xlFilterValues
    Range("B7").Value = "Type On"
Else
    ActiveSheet.Range("$A$7:$B$81").AutoFilter Field:=2
  Range("B7").Value = "Type"
End If
   
End Sub

http://gupl.dk/674830/
Grupper fjernet, bruger du det?
http://gupl.dk/674831/
Avatar billede kim1a Ekspert
28. februar 2012 - 18:17 #13
Jeg brugte store-mortens første løsning, tilpasset egne evner - og så brugte jeg din løsning på kolonner således at jeg kan vise hvad typerne består af.

Jeg er dog ikke med på hvad det sidste er store-morten har lavet omkring.
Avatar billede store-morten Ekspert
28. februar 2012 - 18:31 #14
Reduceret til to knapper der slår filter til/fra
Avatar billede kim1a Ekspert
28. februar 2012 - 18:56 #15
Jeg vil stadig gerne give dig point for din hjælp - hvordan gør vi det? Kan du ligge svar i en tråd der er accepteret svar i?
Avatar billede store-morten Ekspert
28. februar 2012 - 19:28 #16
Nej, det kan man ikke.

Men du har vist viljen, om point-givning, så det er nok for mig. (Denne gang, smiler ;-) )
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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