• 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.

Rijen verbergen

Status
Niet open voor verdere reacties.

Figaro75

Gebruiker
Lid geworden
12 dec 2011
Berichten
91
Ik maak in excel voor mijn werk af en toe formulieren.
Via voorbeelden,o.a. van dit forum probeer ik deze formulieren zo gebruiksvriendelijk te maken door acties onder knoppen te zetten zodat mijn collega's niet zelf gaan 'rommelen' in het bestand.
De meeste hebben namelijk beperkte kennis/ervaring/interesse van excel.
Ik heb dus wel interesse in excel maar een beperkte kennis/begrip van VBA:(

Voor het verbergen van rijen maak ik vaak gebruik van een (verborgen) hulpkolom met daarin een formule die afhankelijk van bepaalde voorwaarden bv Ja of Nee of "" invult.
Met een knop verbergen en tonen zorg ik met VBA het daadwerkelijk verbergen en weer tonen van rijen.

Ik zou echter wel eens rijen willen verbergen die aan verschillende voorwaarden voldoet.
Alleen met de huidige code is mij dat tot nu toe nooit gelukt.
Als ik de IIF regel nogmaals plaats dan geeft hij een foutmelding.

Dus hoe kan ik via VBA in verschillende Ranges laten zoeken en rijen verbergen/tonen?

Mijn huidige code die ik altijd gebruik:
Code:
Sub Verbergen()
Application.ScreenUpdating = False
For Each cl In [B15:B999]
    cl.EntireRow.Hidden = IIf(cl.Value = "", True, False)

'For Each cl In [A15:A999]
'    cl.EntireRow.Hidden = IIf(cl.Value = "XH", True, False)    <-- dit werkt dus niet !!
'Next

Application.ScreenUpdating = True
End Sub

Sub Tonen()
Application.ScreenUpdating = False

For Each cl In [A15:A999]
    cl.EntireRow.Hidden = IIf(cl.Value = "", False, False)
Next
Application.ScreenUpdating = True
End Sub
 
test deze eens

Sub Verbergen()
Application.ScreenUpdating = False
For Each cl In [B15:B999]
If cl.Value = "" Then cl.EntireRow.Hidden = True
Next
Application.ScreenUpdating = True
End Sub
 
Jean-Paul

Bedankt voor je reactie maar ik zou graag op meerdere voorwaarden rijen willen verbergen/tonen.
Dus als ik bv rijen wil verbergen die in een bepaalde kolom leeg zijn en die in een andere kolom een specifieke waarde hebben.
Het kan dus dan voorkomen dat rijen die in kolom B niets hebben staan verborgen moeten worden maar ook de rijen waarin in kolom X die specifieke waarde voorkomt (en kolom B dus bv wel gevuld is)

Nu gebruik ik een hulpkolom met =Als formules om verschillende voorwaarden te bepalen maar ik zou het graag rechtstreeks in de macro willen hebben i.p.v. een formule/verborgen kolom.
 
Post eens een voorbeeld bestand met duidelijke informatie wat je wil bereiken, dat werkt makkelijker.
 
Ik heb mijn bestand (linkje) toegevoegd.

Opmerkingen:
Rij 15: is een compleet lege tussenregel, deze mag niet verborgen worden
Rij 16: in A16 heb ik de volgende formule staan om ervoor te zorgen dat A16 niet verborgen wordt als er iets in B16 of B15 staat --> =ALS(B16="";ALS(VERSCHUIVING(B16;-1;0)="";"";"H");"H")
Rij 17-31: hier (A) heb ik de volgende formule staan om ervoor te zorgen dat rij 17-31 niet verborgen wordt als er iets in G17 of G16 staat --> =ALS(G16="";ALS(VERSCHUIVING(G16;-1;0)="";"";"H");"H")
Rij 32-37: zijn verzamelregels welke niet verborgen hoeven te worden (maar hier is kolom G dus wel leeg!) --> =ALS(B32="";ALS(VERSCHUIVING(B32;-1;0)="";"";"H");"H")
Rij 38: is een compleet lege tussenregel, deze mag niet verborgen worden als de bovenliggende rij tekst heeft staan in kolom B --> =ALS(B38="";ALS(VERSCHUIVING(B38;-1;0)="";"";"H");"H")

Daarnaast zijn er nog een tweetal macro's die rijen naar een ander tabblad kopieert en verbergt, deze zet de tekst "XH" in kolom A

Dit is echter maar 1 voorbeeld, ik heb ander soortige lijsten waar het ook handig zou zijn als er zonder extra formule rijen verborgen/getoond kunnen worden.

Projectoverzicht

Het mooiste zou dus zijn als ik in VBA kan laten selecteren op kolom G leeg, kolom B leeg, kolom B leeg tenzij...... etc.
 
Laatst bewerkt:
Een voorbeeld is altijd een goed idee
Toch een voorschotje
De lus die je gebruikt klopt niet.
Je hebt twee een for in één next

Code:
For Each cl In [B15:B999]
    cl.EntireRow.Hidden = IIf(cl.Value = "", True, False)
'    cl.EntireRow.Hidden = IIf(cl.Value = "XH", True, False)    <-- dit werkt dus niet !!
'Next
Dit zal al beter gaan.

Door van select case gebruik te maken heb je meer flexibiliteit.
Bijvoorbeeld:
Code:
Sub Verbergen()
Dim bSwitch As Boolean
Application.ScreenUpdating = False
For Each cl In [B15:B999]
bSwitch = False
    Select Case cl.Value
        Case ""
            bSwitch = True
        Case "XH"
            bSwitch = True
'etcetera
    End Select
cl.EntireRow.Hidden = bSwitch

Application.ScreenUpdating = True
End Sub

Mvg Leo
 
@Leo,

Bedankt voor je reactie, ga er morgen eens mee aan de slag.

Nog een extra vraagje.
Kan ik i.p.v. [B15:B999] ook laten zoeken in benoemde bereiken?
 
Laatst bewerkt:
Test het maar eens.

Code:
range("B15:B999").name = "Figaro75"
range("Figaro75").select
 
@Harry,

Vanwege een beurs er gisteren niet meer aan toe gekomen....

Code:
For Each cl In [Test]
Dit werkt......mooi

Op de een of andere manier werkte het benoemen van de range niet.
Klopt het dat een range niet dezelfde naam kan hebben als een aanwezige macro.........?

Denk dat dat het was waardoor ik steeds een fout kreeg want ik heb die ene range nu hernoemt en nu werkt het wel...beetje dom van mij zelf dus, had er helemaal niet bij stil gestaan.
Voordeel met de benoemde range is dat hij dus niet rijen controleert die nog niet in de range zitten.

Heel erg bedankt voor je hulp, zo leer ik steeds meer van VBA :thumb:
 
Als je met haken schrijft kan je ook een Sub aanroepen.
Ik heb ergens gelezen dat haken voor vertraging zorgen, maar het staat denk ik chic.
Geen haken maar aanduiden met Range, kom je ook niet in de war.


Zie verschillende mogelijkheden.
Code:
Sub hsv_2()
 Figaro75
End Sub
Sub Figaro75()
Range("B15:B999").Name = "Figaro75"
Range("Figaro75").Select
   '[Figaro75].Select  'geeft foutmelding
  [HSV_3]
 Range("A1:A10").Name = "HSV"
[HSV].Select
HSV_4
End Sub
Sub HSV_3()
 MsgBox "HSV_3"
End Sub
Sub HSV_4()
 MsgBox "HSV_4"
End Sub
 
Vermijd For.... Next lus indien je zoekt in veel cellen.
Beter en sneller is eerst te filteren en vervolgens code los te laten op de zichtbare cellen.

Met vriendelijke groet,


Roncancio
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan