Toon posts:

VBA: Tabbladen verbergen/tonen op basis van waarde

Pagina: 1
Acties:

Onderwerpen

Vraag


  • Richard Ven
  • Registratie: Maart 2021
  • Laatst online: 16-04-2021
Goedemiddag,

Op dit moment ben ik bezig met een doorrekening voor projecten. Ik wil met een VBA tabbladen tonen of juist verbergen.

Dit is wat ik op dit moment heb:
Private Sub Tabbladkeuze(ByVal Target As Range)
If [B7] = "Asfalt" Then
Sheets("blad2").Visible = -1 - xlSheetVisible
Sheets("blad3").Visible = 0 - xlSheetHidden
Sheets("blad4").Visible = 0 - xSheetHidden
End If
End Sub

B7 is een dropdown van asfalt, elementen en berm. Als ik asfalt selecteer hoop ik te bereiken dat enkel het tabblad "Asfalt" (blad2) zichtbaar wordt voor de gebruiker. Wanneer ik bovenstaande functie invul komt er na de keuze geen verandering in tabbladen. Heeft iemand een oplossing?

Alvast bedankt!

Groet Richard.

[Voor 87% gewijzigd door Richard Ven op 15-03-2021 15:39]

Alle reacties


  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 16:48

g0tanks

Moderator CSA
Zoek even op hoe je refereert naar een celwaarde in VBA. Dat is niet door er blokhaken omheen te zetten.

Daarnaast snap ik niet wat - xlSheetVisible en - xSheetHidden doen. Lijkt me dat die stukken overbodig zijn.

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • +1Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Richard Ven schreef op maandag 15 maart 2021 @ 15:35:
Wanneer ik bovenstaande functie invul komt er na de keuze geen verandering in tabbladen. Heeft iemand een oplossing?
Je moet Excel wel meedelen dat er wat moet gebeuren als er een een wijziging in het blad plaatsvindt ('Private sub Worksheett_Change') en best ook nog: alleen als een wijziging van B7 plaatsvindt.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

g0tanks schreef op maandag 15 maart 2021 @ 15:45:
Zoek even op hoe je refereert naar een celwaarde in VBA. Dat is niet door er blokhaken omheen te zetten.
Het is niet zo wijdverbreid bekend, maar: https://docs.microsoft.co...y-using-shortcut-notation :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Richard Ven
  • Registratie: Maart 2021
  • Laatst online: 16-04-2021
dix-neuf schreef op maandag 15 maart 2021 @ 16:12:
[...]
Je moet Excel wel meedelen dat er wat moet gebeuren als er een een wijziging in het blad plaatsvindt ('Private sub Worksheett_Change') en best ook nog: alleen als een wijziging van B7 plaatsvindt.
Deze verwijzing heb ik inderdaad toegepast. Ik heb reeds een formule toegepast voor een variabele die regels doet verbergen. Hetzelfde wil ik nu dus met tabbladen. Als ik dan "End Sub'' doe kan ik dezelfde verwijzing niet nogmaals toepassen. Ik neem dan aan dat de tabbladverwijzing boven de "End Sub" moet komen? Ik heb geen idee of het daar anders van wordt.

De verwijzing naar B7 was inderdaad niet goed. Ik heb er nu dit van gemaakt, maar hij functioneert nog steeds niet naar behoren:
If (B7) = ("Asfalt") Then
Sheets("Asfalt").Visible = True
Else
Sheets("Elementen").Visible = False
Else
Sheets("Berm").Visible = False
End If
End Sub

Groet Richard

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Richard Ven schreef op maandag 15 maart 2021 @ 16:53:Deze verwijzing heb ik inderdaad toegepast.
Die zie ik toch niet staan. Kies in de vba-editor bij Blad1 aan de rechterkant: Worksheet en daarnaast: Change, dan heb je al het begin en eind van je macro.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Wat uitleg bij The Worksheet_Change event; zie punt 1 op deze webpagina:

https://www.exceltip.com/...-events-in-excel-vba.html

  • DVX73
  • Registratie: November 2012
  • Laatst online: 17:33
Ik denk dat je dit zoek:

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "B7"
Call Tabbladkeuze(Target.value)
End Select
End Sub

Sub Tabbladkeuze (svalue as string)
Select svalue
Case "Asfalt"
Sheets("blad2").Visible = -1 - xlSheetVisible
Sheets("blad3").Visible = 0 - xlSheetHidden
Sheets("blad4").Visible = 0 - xSheetHidden
Case "Berm"
Sheets("blad2").Visible = 0 - xlSheetHidden
Sheets("blad3").Visible = -1 - xlSheetVisible
Sheets("blad4").Visible = 0 - xSheetHidden
Case else
Sheets("blad2").Visible = 0 - xlSheetHidden
Sheets("blad3").Visible = 0 - xlSheetHidden
Sheets("blad4").Visible = 0 - xSheetHidden
End Select
End sub

Kan zijn dat er nog wat foutjes in zitten.

Het idee is:
De eerste sub wordt uitgevoerd als het werkblad wordt gewijzigd.
Hierbij wordt de cel die wordt gewijzigd als de range Target gedefinieerd.

Vervolgens wordt gekeken welk adres deze cel heeft.
Wanneer deze B7 is dan wordt de volgende sub aangeroepen, hierbij wordt de waarde van deze cel als string meegegeven.

De sub Tabbladkeuze past aan de hand van deze waarde de zichtbaarheid van de tabbladen aan.

  • Richard Ven
  • Registratie: Maart 2021
  • Laatst online: 16-04-2021
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "B7"
Call Tabbladkeuze(Target.value)
End Select
End Sub

Sub Tabbladkeuze (svalue as string)
Select svalue
Case "Asfalt"
Sheets("blad2").Visible = -1 - xlSheetVisible
Sheets("blad3").Visible = 0 - xlSheetHidden
Sheets("blad4").Visible = 0 - xSheetHidden
Case "Berm"
Sheets("blad2").Visible = 0 - xlSheetHidden
Sheets("blad3").Visible = -1 - xlSheetVisible
Sheets("blad4").Visible = 0 - xSheetHidden
Case else
Sheets("blad2").Visible = 0 - xlSheetHidden
Sheets("blad3").Visible = 0 - xlSheetHidden
Sheets("blad4").Visible = 0 - xSheetHidden
End Select
End Sub

Dit lijkt aardig in de richting te gaan waar ik de oplossing wil zoeken. Dan rest mij 1 vraag waar ik denk dat het verkeerd gaat. Ik heb al een worksheet change toegepast mbt tot het verbergen van regels. Wat ik nu volledig heb is dit:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Activate
If Not Application.Intersect(Range("B23"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is = "in asfalt": Rows("25:26").EntireRow.Hidden = True
Rows("24").EntireRow.Hidden = False
Case Is = "in elementenverharding": Rows("25").EntireRow.Hidden = False
Rows("24").EntireRow.Hidden = True
Rows("26").EntireRow.Hidden = True
Case Is = "in berm": Rows("24:25").EntireRow.Hidden = True
Rows("26").EntireRow.Hidden = False
Case Is = "Combinatie: in asfalt en elementenverharding": Rows("24:25").EntireRow.Hidden = False
Rows("26").EntireRow.Hidden = True
Case Is = "Combinatie: in asfalt en berm": Rows("25").EntireRow.Hidden = True
Rows("24").EntireRow.Hidden = False
Rows("26").EntireRow.Hidden = False
Case Is = "Combinatie: in elementenharding en berm": Rows("25:26").EntireRow.Hidden = False
Rows("24").EntireRow.Hidden = True
Case Is = "Combinatie: in asfalt, elementenverharding en berm": Rows("200").EntireRow.Hidden = True
Rows("24:26").EntireRow.Hidden = False
Case Is = "Invullen": Rows("24:26").EntireRow.Hidden = False
Rows("200").EntireRow.Hidden = True
End Select
End If
Select Case Target.Address
Case "B7"
Call Tabbladkeuze(Target.Value)
End Select
End Sub


Sub Tabbladkeuze(svalue As String)
Select svalue
Case "Asfaltcollector"
Sheets("Asfaltcollector").Visible = True
Sheets("Kunstgrascollector").Visible = False
Sheets("Asfalt- en kunstgrascollector").Visible = False
Case "Kunstgrascollector"
Sheets("Asfaltcollector").Visible = False
Sheets("Kunstgrascollector").Visible = True
Sheets("Asfalt- en kunstgrascollector").Visible = False
Case Else
Sheets("Asfaltcollector").Visible = True
Sheets("Kunstgrascollector").Visible = True
Sheets("Asfalt- en kunstgrascollector").Visible = True
End Select
End Sub

Ik heb nu enkel geen idee waar het precies verkeerd gaat. Waarschijnlijk in het vaker toepassen van een worksheet change. Ik hoor graag wat ik verkeerd doe :)

  • Arjan90
  • Registratie: September 2005
  • Laatst online: 21:57
Kun je je code niet even in [code] tags toevoegen inclusief de tabs? Dan leest het echt een stuk prettiger. Ik kom er zo zelf bijna niet doorheen of moet het zelf in Excel gaan invoeren om het goed te kunnen lezen. Ik gebruik zelf code=vb zodat hij ook automatisch gearceerd wordt. Dat ziet er dan zo uit:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveSheet.Activate
    
    If Not Application.Intersect(Range("B23"), Range(Target.Address)) Is Nothing Then
        Select Case Target.Value
            Case Is = "in asfalt":
                Rows("25:26").EntireRow.Hidden = True
                Rows("24").EntireRow.Hidden = False
            Case Is = "in elementenverharding":
                Rows("25").EntireRow.Hidden = False
                Rows("24").EntireRow.Hidden = True
                Rows("26").EntireRow.Hidden = True
            Case Is = "in berm":
                Rows("24:25").EntireRow.Hidden = True
                Rows("26").EntireRow.Hidden = False
            Case Is = "Combinatie: in asfalt en elementenverharding":
                Rows("24:25").EntireRow.Hidden = False
                Rows("26").EntireRow.Hidden = True
            Case Is = "Combinatie: in asfalt en berm":
                Rows("25").EntireRow.Hidden = True
                Rows("24").EntireRow.Hidden = False
                Rows("26").EntireRow.Hidden = False
            Case Is = "Combinatie: in elementenharding en berm":
                Rows("25:26").EntireRow.Hidden = False
                Rows("24").EntireRow.Hidden = True
            Case Is = "Combinatie: in asfalt, elementenverharding en berm":
                Rows("200").EntireRow.Hidden = True
                Rows("24:26").EntireRow.Hidden = False
            Case Is = "Invullen":
                Rows("24:26").EntireRow.Hidden = False
                Rows("200").EntireRow.Hidden = True
        End Select
    End If
    
    Select Case Target.Address
    Case "B7"
    Call Tabbladkeuze(Target.Value)
    
    End Select
End Sub


Inhoudelijk zou ik echt even terug gaan naar de basis. Bouw één functionaliteit in. Bouw vervolgens de volgende. Testen, testen, testen. Nu "gooi" je heel veel code in één keer op het internet, maar dan is je helpen al een stuk lastiger. Bovendien is het moeilijk om tips te geven. Toch een paar tips die ik je probeer mee te geven. Waarom heb je bovenaan de code "ActiveSheet.Activate" staan? Hij is al geactiveerd, immers het is je actieve sheet.

Daarnaast zou ik bij een verwijzing naar een bereik ook áltijd je worksheet vooraf noemen. Dus bijvoorbeeld ActiveSheet.Rows("200").EntireRow.Hidden ipv Rows("200").EntireRow.Hidden. Zeker als je complexere VBA gaat schrijven ga je jezelf bedanken dat je jezelf dat hebt aangeleerd. Een stuk code om dat bijvoorbeeld te doen is:
Visual Basic:
1
2
3
4
Set wb = ThisWorkbook
Set ws = ActiveWorksheet

ws.Row("200").EntireRow.Hidden = True


Probeer je code eens te debuggen, ga regel voor regel verwerken (dit doe je in de macro scherm door op F8 te drukken, elke keer dat je F8 drukt ga je naar de volgende regel). In dit geval wordt de code gestart doordat je een actie uitvoert, dan kun je een zgn. "break" (onderbrekingspunt) toevoegen aan je code. Doe dat bijvoorbeeld op de bovenste regel van je code, je kan dit doen door op de regel te gaan staan in de VBA editor en vervolgens op F9 te drukken. De regel wordt dan donkerrood gearceerd. Dan kun je elke stap volgen in je code en kijken wat er precies wel (en niet) gebeurt. Je ziet dan gelijk in de code waar hij is, door bijv. over een variabele/verwijzing te gaan met je muis zie je de waarde die hij heeft.

"Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid."


  • DVX73
  • Registratie: November 2012
  • Laatst online: 17:33
Zoals ik het begrijp wil je in 2 gevallen code uitvoeren:
1) wanneer de waarde in b23 gewijzigd wordt
2) wanneer de waarde in B7 gewijzigd wordt

Zoals @Arjan90 aangeeft is het aan te bevelen de code op te knippen.

Dus maakt een aparte sub die b23 afhandelt.

Je krijgt dan zoiets:
Visual Basic:
1
2
3
4
5
6
7
8
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "B7"
Call Tabbladkeuze(Target.value)
Case "B23"
Call yournamehere(Target.value)
End Select
End Sub

[Voor 0% gewijzigd door DVX73 op 17-03-2021 14:32. Reden: soort code vergeten]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee