• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Kolommen verbergen

  • Onderwerp starter Onderwerp starter AatB
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

AatB

Gebruiker
Lid geworden
15 dec 2007
Berichten
257
Hallo,

Ik zou graag een knop willen hebben, dat als ik er op klik kolommen verborgen worden waarvan de cellen in rij1 een bepaalde waarde hebben (bijvoorbeeld een x).
Als ik daarna weer op de knop druk, moeten alle verborgen kolommen weer zichtbaar worden.
De naam van de knop moet de variabele x worden.

Wie kan mij helpen?

Groeten,

Aat
 
Aat

Hier is code om je op weg te zetten:

Code:
Sub verbergen()

    Dim r As Range
    
    For Each r In Rows(1)
        
        If r.Value = "x" Then
            Columns(r).Hidden = True
        Next
        
        If r.Column > r.Parent.UsedRange.Columns.Count Then Exit For
        
    Next

End Sub

Ik zou een toggleknop gebruiken en geen gewone knop. Een toggleknop heeft 2 mogelijke standen: ingedrukt of niet ingedrukt. Een gewone knop komt altijd weer op nadat je daarop geklikt hebt.

Wigi
 
Hallo Wim,

ziet er simpel uit, maar ik krijg een compileerfout Next zonder For.....

mvg,

Aat
 
Sorry

Code:
 If r.Value = "x" Then
            Columns(r).Hidden = True
        [B]End If[/B]
 
Sorry

Code:
 If r.Value = "x" Then
            Columns(r).Hidden = True
        [B]End If[/B]

Compileren gaat nu goed, maar bij het uitvoeren van de macro krijg ik...

Fout 13 bij het uitvoeren
Typen komen niet met lekaar overeen.


mvg,

Aat
 
AatB, Volgens mij loopt het fout bij het zoeken van iedere 'range' in een 'row'. Als je Rows(1) verandert in Range("A1:IV1") dan loopt de code wel verder.
Daarnaast moet je dan ook nog dit deeltje aanpassen...
Code:
Columns([COLOR="blue"]r[/COLOR]).Hidden = True
...in...
Code:
Columns([COLOR="blue"]r.Column[/COLOR]).Hidden = True
...of in...
Code:
[COLOR="blue"]r.[/COLOR]Columns.Hidden = True
....omdat je anders nog een foutmelding krijgt. De standaard waarde van range is namelijk z'n 'value'. Dus bij Columns(r) wordt er gezocht naar kolom 'x' ;)

Groet, Leo

P.s. ik hoop dat Wim kan uitleggen waarom het misloopt met zoeken in iedere 'range' in een 'row'
 
Laatst bewerkt:
Code:
Columns(r).Hidden = True

moet inderdaad

Code:
Columns(r.Column).Hidden = True

zijn. Excuses, 't was precies al laat toen ik dat schreef :o

Waarom het niet zo werkt weet ik niet zo direct. Want als ik dit uitvoer:

Code:
Sub s()
    MsgBox TypeName(Rows(1))
End Sub

krijg ik een Range als antwoord.

Wat wel werkt, is

Code:
For Each r In Rows(1)[B].Cells[/B]

maar dat is nog geen verklaring natuurlijk. Wel al een oplossing :thumb:

Wigi
 
Code:
Columns(r).Hidden = True

moet inderdaad

Code:
Columns(r.Column).Hidden = True

zijn. Excuses, 't was precies al laat toen ik dat schreef :o

Waarom het niet zo werkt weet ik niet zo direct. Want als ik dit uitvoer:

Code:
Sub s()
    MsgBox TypeName(Rows(1))
End Sub

krijg ik een Range als antwoord.

Wat wel werkt, is

Code:
For Each r In Rows(1)[B].Cells[/B]

maar dat is nog geen verklaring natuurlijk. Wel al een oplossing :thumb:

Wigi

Echt top...bedankt ik kan hier mee verder. O ja, de laatste kolom wordt niet verborgen.
Kun je ook met een voorbeeldje aangeven hoe ik een knop met verbergen en weer zichtbaar moet maken?

Bedankt....Aat
 
Code:
  If r.Column > r.Parent.UsedRange.Columns.Count Then Exit For

dat stukje code kan ook voor "foutieve" dingen zorgen.

Code:
r.Parent.UsedRange.Columns.Count

telt het aantal kolommen in de gebruike range op het desbetreffende worksheet, terwijl de for lus begint in kolom 1 (A) en zo door alle kolommen totdat bovenstaande code hem stopt. Maar die code laat hem in sommige gevallen verkeerd stoppen. Stel volgende voorbeeld, met enkel deze data in de worksheet:

H1="x"
H2=7
I1="y"
I2=6

Met de code van Wigi gaat kolom H nooit verborgen worden, ookal voldoet ze aan de voorwaarde, want H1 bevat een "x".
Waarom werkt ze niet:

Omdat volgende regel code:

Code:
r.Parent.UsedRange.Columns.Count

geeft als uitkomst 2. En dus gaat de code afgebroken worden wanneer r.Column groter wordt als 2. Maw, hij gaat nooit aan kolom H geraken, en gaat al bij kolom C stoppen.

Een mogelijke oplossing, maar er zullen wel betere zijn, maar dit is één van de korste alternatieven denk ik, is volgende regel code:

Code:
 If r.Column > r.Parent.Range("A1").SpecialCells(xlCellTypeLastCell).Column Then Exit For

Je kan natuurlijk ook pas aan de eerste column van usedrange beginnen loopen, dat zal nog efficienter zijn.
 
Code:
  If r.Column > r.Parent.UsedRange.Columns.Count Then Exit For

dat stukje code kan ook voor "foutieve" dingen zorgen.

Code:
r.Parent.UsedRange.Columns.Count

telt het aantal kolommen in de gebruike range op het desbetreffende worksheet, terwijl de for lus begint in kolom 1 (A) en zo door alle kolommen totdat bovenstaande code hem stopt. Maar die code laat hem in sommige gevallen verkeerd stoppen. Stel volgende voorbeeld, met enkel deze data in de worksheet:

H1="x"
H2=7
I1="y"
I2=6

Met de code van Wigi gaat kolom H nooit verborgen worden, ookal voldoet ze aan de voorwaarde, want H1 bevat een "x".
Waarom werkt ze niet:

Omdat volgende regel code:

Code:
r.Parent.UsedRange.Columns.Count

geeft als uitkomst 2. En dus gaat de code afgebroken worden wanneer r.Column groter wordt als 2. Maw, hij gaat nooit aan kolom H geraken, en gaat al bij kolom C stoppen.

Een mogelijke oplossing, maar er zullen wel betere zijn, maar dit is één van de korste alternatieven denk ik, is volgende regel code:

Code:
 If r.Column > r.Parent.Range("A1").SpecialCells(xlCellTypeLastCell).Column Then Exit For

Je kan natuurlijk ook pas aan de eerste column van usedrange beginnen loopen, dat zal nog efficienter zijn.

Bedankt allemaal. Het werkt nu goed.

Aat
 
Bedankt Finch, dat wist ik niet. Ik dacht dat UsedRange in jouw geval zou verwijzen naar A1:I2. Niet dus.


Geen probleem, daarvoor dient een forum toch.
Ook tof om te zien dat je niet te beroerd bent om zoiets toe te geven, dat siert een mens :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan