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

Herhalende waarden in regels verwijderen

Status
Niet open voor verdere reacties.

Ruudh59

Gebruiker
Lid geworden
30 nov 2013
Berichten
56
Er zijn (eenvoudige) manieren om lege cellen in een bereik te vullen.

Groep.Ding.aantal.........Groep.Ding.aantal
1........A.....2................1.......A......2
..........B.....4................1.......B......4
..........C.....1....wordt:..1.......C......1
2........C.....5................2.......C......5
..........D.....2................2.......D......2
3........E......7................3.......E......7

(let niet op de puntjes, maar spaties werden weggehaald bij het plaatsen van het bericht)

Dat is handiger als je draaitabellen wilt maken of gewoon wil filteren en sorteren.

Voor presentatie doeleinden wil je misschien juist het tegenovergestelde.

Hoe kan ik herhalende waarden in regels verwijderen?
 
Laatst bewerkt:
Even een voorbeeldbestand plaatsen met daarin de gewenste uitkomst is wenselijk hier.
Maar hier alvast een suggestie (Aangenomen dat de "groep" in kolom A staat)

Code:
Sub jec()
 With Range("A2", Range("A" & Rows.Count).End(xlUp))
   .Value = Evaluate(Replace("if(#=" & .Offset(-1).Address & ","""",#)", "#", .Address))
 End With
End Sub
 
Laatst bewerkt:
OF:

je maakt ze m.b.v. voorwaardelijke opmaak onzichtbaar
 
De voorwaardelijke opmaak klinkt goed, maar ik heb de formule niet voor elkaar gekregen.

Ik heb quick en dirty een stukje VBA opgesteld (met zeer weinig VBA kennis).
Het werkt, maar nu wordt regel voor regel verwerkt en dat gaat niet erg snel.
Waarschijnlijk kan iemand met degelijke VBA kennis dat in slimmere code omzetten.


Als de waarde in kolom A zich herhaalt op een volgende regel, dan wordt deze samen met de waarde in kolom B verwijderd.

Dim rng As Range
Dim cellA1 As Range
Dim cellA2 As Range
Dim x As Integer

Worksheets("Worksheet").Activate

Set rng = Range("Tabel")

Range("A2").Select 'beginnen na de kopregel
Set cellA1 = Range(ActiveCell.Address)
ActiveCell.Offset(1, 0).Select
Set cellA2 = Range(ActiveCell.Address)

For x = 2 To rng.rows.Count
Set cellA2 = Range(ActiveCell.Address)
If cellA2.Value = cellA1.Value Then
ActiveCell.Value = "" 'waarde in kolom A verwijderd
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "" 'waarde in kolom B verwijderd
ActiveCell.Offset(0, -1).Select
Else
Set cellA1 = Range(ActiveCell.Address)
End If
ActiveCell.Offset(1, 0).Select
Next
 
Zie methode in post 2, kan niet sneller dan dat
 
Het is een evaluate, dus mag je eventjes niet helemaal hetzelfde nemen als een gewone formule, maar :

veronderstel dat je bereik, dat je wil behandelen A2:Z100 is, dan staat in die formule kort door de bocht
=als(A2:Z100=A1:Z99;"";A2:A100)
dus is de celinhoud gelijk aan de cel erboven, dan cel leeghalen en anders de waarde erin zetten.
Die # is een parameter/symbool die intern vervangen (zie replace) wordt door de gewenste A2:Z100

Daar kan geen enkele macro tegen op, vooral niet macro's die activate en select bevatten, maar Ruud had zich vooraf al verschoond :cool:
 
Laatst bewerkt:
Ik vraag nog even door...

Begrijp ik het goed, dat ik deze methode kan toepassen zoals deze staat beschreven en ik geen variabelen hoef in te vullen (het bereik is ook al ingevuld door de rows.count van de tabel)?

Wat wordt de toevoeging als ik op basis van de vergelijking (in de A-kolom) zowel de waarde in de A-kolom als de B-kolom wil wissen?
 
sorry, het bereik gaat maar over 1 kolom de A en niet A tot Z, maar in principe zou wat je vraagt ook moeten gaan, even denken ...

Code:
Sub jec()
     Set c = Range("A2", Range("A" & Rows.Count).End(xlUp))
     With c.Resize(, 2)
          MsgBox "# wordt vervangen door " & c.Address & vbLf & "@ door " & c.Offset(-1).Address
          MsgBox "die toestand tussen de haakjes van evaluate is na vervanging :" & vbLf & Replace(Replace("if(#=@,""""," & .Address & ")", "#", c.Address), "@", c.Offset(-1).Address)
          
          .Value = Evaluate(Replace(Replace("if(#=@,""""," & .Address & ")", "#", c.Address), "@", c.Offset(-1).Address))
     End With
End Sub
EDIT : achteraf nog aangepast en msgboxes toegevoegd
Belangrijk is dus die # en @ enkel als stomme symbolen/variabelen te zien, die intern door hun waarde vervangen zullen worden.
2e zaak, als in een normale formule een dubbel aanhalingsteken voorkomt dan moet die verdubbeld worden, want 1 dubbel aanhalingsteken is om te switchen tussen "formule-modus" en "variabelen-modus"
je moet gewoon iets deftigs krijgen in die evaluate-string, mijn 2e msgbox, zoniet krijg je een foutmelding en gebeurt er niets

Ik ben een slechte uitlegger, ik laat het over aan JEC ...:eek:
 
Laatst bewerkt:
Het is ook niet makkelijk uit te leggen:d. Het is eigenlijk gewoon een Excel formule op een slimme manier in VBA gieten.

Code:
Sub jec()
 With Range("A2", Range("A" & Rows.Count).End(xlUp))
   .Resize(, 2).Value = Evaluate("if(" & .Offset(-1).Address & "=" & .Address & ",""""," & .Resize(, 2).Address & ")")
 End With
End Sub

Is hetzelfde als
Code:
=ALS(A1:A6=A2:A7;"";A2:B7)
 
:cool:, 1 variabele minder en het is inderdaad moeilijk uit te leggen, meeleven met de formule terwijl je ze schrijft ...
 
Veel sneller:

Code:
Sub M_snb()
  sn=cells(1).currentregion.columns(1)

  for j=2 to ubound(sn)
    if sn(j,1)="" then sn(j,1)=sn(j-1,1)
  next

  cells(1).currentregion.columns(1)=sn
End Sub

of zo:

Code:
Sub M_snb()
   for each it in cells(1).currentregion.specialcells(4).areas
     it=it.cells(1).offset(-1).value
   next
End Sub
 
Laatst bewerkt:
Heb je dat getest?
 
:d
Code:
Public Sub VulLegeCellenMetVerwijzingNaarErboven()
    Range("A1").CurrentRegion.SpecialCells(4).FormulaR1C1 = "=R[-1]C"
End Sub
 

Bijlagen

  • helpmij ruudh59 VulLegeCellenMetVerwijzingNaarErboven.xlsm
    14,3 KB · Weergaven: 6
Laatst bewerkt:
@alphamax, 't is net het omgekeerde, wisVolleCellenMetVerwijzingNaarErboven :d
 
Heb meerdere keren de evaluatie methode en de array methode getest. In bijna alle gevallen is de evaluatie de snelste methode
 
Bedankt allemaal. Veel opties om uit te proberen en kennis over VBA te vergroten...

De evaluate werkt goed, maar lijkt een nadeel te hebben...

Ik krijg op de rijen die niet gewist worden in kolom B af en toe de inhoud "#waarde!" te zien i.p.v. de oorspronkelijke inhoud.

Nu is mij opgevallen dat in de inhoud van de cellen die worden vervangen door "#waarde!" het teken @ en/of # is gebruikt.
 
Ook als je die van post #10 pakt?

Anders deze:

Code:
Sub jecc()
 Dim ar, i As Long
 ar = Cells(1).CurrentRegion
 
 For i = UBound(ar) To 2 Step -1
   If ar(i, 1) = ar(i - 1, 1) Then ar(i, 1) = "": ar(i, 2) = ""
 Next
 
 Cells(1).CurrentRegion = ar
End Sub
 
Laatst bewerkt:
Nog een variant.
Code:
Sub hsv()
 Range("a2", Cells(Rows.Count, 1).End(xlUp)).Name = "b"
 [offset(b,,,,2)] = [if(b=offset(b,-1,),"",offset(b,,,,2))]
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan