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

Snellere code

Status
Niet open voor verdere reacties.

robinvdveeken

Gebruiker
Lid geworden
7 sep 2010
Berichten
84
Beste experts,

Inmiddels ben ik al een stuk verder met VB.
Toch vraag ik me af of de code zoals in de bijlage niet sneller kan.
Uiteindelijk word het geheel onwerkbaar doordat het laden bij elke verandering erg lang duurt.
Alvast bedankt.

Groeten,
Robin
 

Bijlagen

Ik zou gebruik maken van de Select Case methode.
Ik heb alvast een begin gemaakt.
Code:
Select Case Target.Address
    Case Range("B98").Address
        Rows("99:99").Hidden = Range("B98").Value <> "Anders"
    Case Range("B112").Address
        Rows("113:115").Hidden = Range("B112").Value = "Nee"




End Select
De macro kijkt welke cel is aangepast en zoekt deze in de Cases.
Je zou het ook met IF... ELSEIF kunnen doen maar dat heeft niet mijn bepaald mijn voorkeur.

Met vriendelijke groet,


Roncancio
 
hoi Roncancio

je kan ook in 2 kolommen bv E en F in vullen wat je wil
bv in E128 zet je"Nee" en in F128 zet je welke rijen verborgen moeten worden als in kolom B of C Nee staat
in kolom F128 staat dan bv 130:135 of zo
Daarna wordt de macro redelijk kort.
je kan die kolommen later verbergen

wil je een voorbeeld dan verzin ik wel wat. maar niet vandaag ben even weg (biljarten):P
 
hoi Roncancio

je kan ook in 2 kolommen bv E en F in vullen wat je wil
bv in E128 zet je"Nee" en in F128 zet je welke rijen verborgen moeten worden als in kolom B of C Nee staat
in kolom F128 staat dan bv 130:135 of zo
Daarna wordt de macro redelijk kort.
je kan die kolommen later verbergen

wil je een voorbeeld dan verzin ik wel wat. maar niet vandaag ben even weg (biljarten):P

Dat is ook een manier.
Dan is het wellicht een idee om de combinaties (waarde - cellenbereik) apart in een werkblad te zetten zodat bij een wijziging in een bepaalde cel naar die combinatie gezocht kan worden.
Ik ben overigens niet de TS:P

Met vriendelijke groet,


Roncancio
 
Bedankt voor de Reacties,

Toch heb ik liever een iets langere macro.
Als ik dan alle gegevens van de lijsten in de 2e tabblad zet dan kan er later ook nog redelijk eenvoudig wat gewijzigd worden.
Ik zal de code dan ook omkloppen naar het eerste voorbeeld van Roncancio.
Het probleem waar ik wel tegen aanloop,
Als er iets in de lijsten word gewijzigd dan wel toegevoegd dat veranderd dat niet in de pulldown menu's op de eerste pagina.
Is dit aan te passen?
Als ik klaar ben met kloppen zal ik het bestand weer posten.
Bedankt!
 
De code heb ik omgeklopt in de andere manier.
Toch werk het bij het wijzigen niet zoals het hoort.
Ik denk dat komt omdat deze Cases op dezelfde dingen betrekking hebben.
Iemand suggesties?
Bedankt.
 

Bijlagen

De code heb ik omgeklopt in de andere manier.
Toch werk het bij het wijzigen niet zoals het hoort.
Ik denk dat komt omdat deze Cases op dezelfde dingen betrekking hebben.
Iemand suggesties?
Bedankt.

Code:
    Case Range("C129").Address
        Rows("132:132").Hidden = Range("C129").Value <> "Moeller"
    Case Range("C129").Address
        Rows("130:130").Hidden = Range("C129").Value <> "Anders"

Bovenstaande gaat niet werken.
VBA komt nooit bij de 2e Case omdat al aan de 1e voldaan wordt.

Je kunt ze wel bij elkaar zetten.
Code:
    Case Range("C129").Address
        Rows("132:132").Hidden = Range("C129").Value <> "Moeller"
        Rows("130:130").Hidden = Range("C129").Value <> "Anders"

Met vriendelijke groet,


Roncancio
 
misschien heb je hier iets aan

je moet je voorwaarden dan wel voortaan in de naast liggende kolommen invullen

en dan leest deze macro ze uit
het is al ingevuld

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rij As Integer, Kolom As Integer, Cel As Range
  Dim DoelCellen As Range
  Dim EindRij As Integer, EindKolom As Integer, TekstB As String, TekstC As String
  EindRij = Sheets("Blad1").UsedRange.Rows.Count
  EindKolom = Sheets("Blad1").UsedRange.Columns.Count - 1
  Set DoelCellen = Cells(1, 100)
  For Kolom = 6 To EindKolom Step 3
    Set DoelCellen = Union(DoelCellen, Range(Cells(98, Kolom), Cells(EindRij, Kolom)))
  Next Kolom
  Set DoelCellen = DoelCellen.SpecialCells(xlCellTypeConstants)
  For Each Cel In DoelCellen
    If Rows(Cel.Row).Hidden = False Then
      Rij = Cel.Row
      TekstB = LCase(Cells(Rij, 2)): TekstC = LCase(Cells(Rij, 3))
      If Cel.Offset(0, -1) = "<>" Then
        Rows(Cel.Offset(0, 1).Value).Hidden = LCase(Cel) <> TekstB And LCase(Cel) <> TekstC
      Else
        Rows(Cel.Offset(0, 1).Value).Hidden = (LCase(Cel) = TekstB Or LCase(Cel) = TekstC)
      End If
    End If
  Next Cel
End Sub

groet sylvester
 
hoi

De code heb ik omgeklopt in de andere manier.
Toch werk het bij het wijzigen niet zoals het hoort.
Ik denk dat komt omdat deze Cases op dezelfde dingen betrekking hebben.
Iemand suggesties?
Bedankt

wat voor wijzigingen gaan fout?

een regel toevoegen? (dat moet natuurlijk ook zonder wijzigingen in de macro kunnen) (daar voor is het gebruik van enige functies in ( eventueel verborgen) kolommen noodzakelijk )
of bedoel je gewoon het invullen van wat er ingevuld moet worden?

groet sylvester
 
even een andere insteek, zodat je rechts niets meer hoeft in te vullen, er wordt wel gebruik gemaakt van CurrentRegion, dus lege kolommen en rijen rondom zijn belangrijk om het bereik te bepalen, lees daarom eerst eens de help over CurrentRgion, als je dat begrip nog niet kende.
Ik heb me verder nog niet verdiept in het probleem, maar in het kort omschreven wordt hier gekeken welke B-cellen gewijzigd zijn en dan worden de rijen onder de B-cel van dat CurrentRegion verborgen als die cel 1. een data-validatie heeft en de inhoud "nee" of "NVT" is.
Ik zie dat hiermee nog maar 80% van de gevallen opgelost zijn, dus dat je eventueel ook nog naar de lettergrootte van de ernaast liggende A-cel moet kijken voor de grote blokken, of kijken naar de eerstvolgende niet-lege A-cel onder deze rij om het geheel netjes af te werken, maar ik wou eerst even de reactie afwachten.
Let op : deze macro zal dus enkel het gebied aanpakken rond de huidig gewijzigde cel(len), hij zal dus niet het ganse werkblad doorlopen en zou dus in een wip klaar moeten zijn.

Code:
Private Sub worksheet_Change(ByVal Target As Range)
  Dim isect As Range, c As Range, Bereik As Range, i As Integer, j As Integer
  Set isect = Intersect(Target, Columns("B"))              'welke cellen in de B-kolom zijn er gewijzigd
  If isect Is Nothing Then Exit Sub                        'geen enkele = stoppen
  For Each c In isect.Cells                                '1 voor 1 de gewijzigde B-cellen aflopen
    On Error Resume Next
    i = 0: i = c.Validation.Type                           'kijk of er een data-validatie staat in die cel
    On Error GoTo 0
    If i <> 0 Then                                         'er staat een validatie in die cel
      Set Bereik = c.CurrentRegion.Columns(1)              'aaneensluitend gebied rondom gewijzigde cel
      With Bereik
        j = .Rows.Count + .Row - c.Row - 1                 'aantal rijen van dat bereik + startrij - rij gewijzigde cel - 2 = aantal rijen van dat aaneengesloten gebied staan nog onder de huidige cel ??
      End With
      If j > 0 Then
        Set Bereik = c.Offset(1).Resize(j)                 'alle B-cellen onder c binnen dat aaneengesloten gebied
        MsgBox Bereik.Address
        Select Case UCase(c.Value)                         'wat staat er in je gewijzigde cel ? (hoofdletters)
          Case "NEE", "NVT"
            Bereik.EntireRow.Hidden = True                 'dat bereik verbergen
          Case Else
            Bereik.EntireRow.Hidden = False                'dat bereik weer zichtbaar maken
        End Select
      End If
    End If
  Next
End Sub
 
Bedankt voor de reacties!
Ik ben eruit, met hulp van wat andere topics heb ik het zo kunnen maken dat het bereik van de lijsten groter is maar dat lege cellen worden overgeslagen. Dit betekend dat het voor leken eenvoudiger is iets aan de lijst toe te voegen.
Al met al zal het document nog veel uitgebreider worden, bij vragen kom ik ongetwijfeld weer terug maar op een ander topic. Dit is fantastisch zo! Nogmaals bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan