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

Dubbele verwijderen, maar eerste kolom samenvoegen

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

jen

Gebruiker
Lid geworden
16 nov 2001
Berichten
325
Ik heb in Excel 2003, 2 kolommen gemaakt.

In kolom a staan namen, in kolom b staan adressen (gesorteerd).

Als het adres dubbel voorkomt, dan moet deze rij verwijderd worden, maar de namen moeten samengevoegd worden. Is dit mogelijk?

voorbeeld:
Kees > De Tas 25
Truus > De Tas 25
Joop > De Deel 1

Moet worden:

Kees en Truus > De Tas 25
Joop > De Deel 1
 
Met Excel zal je hier niet uit gaan komen.
Je moet hier voor de stap naar VBA gaan maken (VBA-editor = alt + f11 in Excel)

Laat een lijst met alle unieken maken waarna je mbv een loop de waarden van deze unieken in je database laat controleren. ieder overeenkomende waarde sla je op in een array waarna je op het einde van je loop de array gegevens achter je unieke plaatst.
Hierna kan je de gegevens overschrijven met je nieuwe of deze op een apart blad laten staan zodat je ook nog je 1e gegevens behoud.
Zal misschien nog wel een efficientere code manier zijn maar dit is degene welke het eerst in me naar boven komt.

Succes.
 
Hoi

Array's zijn inderdaad handig.

In deze situatie zou ik echter gaan voor een Collectie.

Op mijn site staat code die beide doet in 1 voorbeeld. Ga naar Excel, VBA-code, VBA tools, Collectie & array.

De code is niet voor doetjes ;) , maar als je het voorbeeld begrijpt dan zal het voldoende info opleveren om dit ook aan te kunnen.

Wigi
 
Bekijk dit voorbeeld eens.
Iets andere code dan Wigi op zijn pagina heeft gezet maar werkt ook ok.
@Wigi: is zeker niet voor beginners die code op je pagina, welke zou dat wel zijn voor dit probleem?. :).

Code in vb staat achter het blad Unieken, zodar je deze activeert wordt de code uitgevoerd. Open file, en ga eerst naar een andere tab en weer terug naar Unieken, Voila.

Code:
Private Sub Worksheet_Activate()
Dim c, d As Range
Dim arraynummer, x As Long
Dim laatsteregel, laatsteregelII As Long
Dim Namenlijst As String
Dim Namen()
Dim rOldList As Range

Set MyRangeI = Worksheets("Unieken")
Set MyRangeII = Worksheets("Gegevens")

'tegen knipperen van het beeld
Application.ScreenUpdating = False

'Leeg eerste de oude unieken lijst
MyRangeI.Range("A2:B" & MyRangeI.Range("A65536").End(xlUp).Row + 1).Clear
'Waar willen we de unieken vandaan halen
Set rOldList = MyRangeII.Range("B1:B" & MyRangeII.Range("B65536").End(xlUp).Row)
'Gebruik AdvancedFilter om de unieken te contr0oleen en te kopieren naar het blad Unieken
rOldList.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=MyRangeI.Range("A2"), Unique:=True

laatsteregel = MyRangeI.Range("A65536").End(xlUp).Row
laatsteregelII = MyRangeII.Range("A65536").End(xlUp).Row

'geef de array een bereik zodat alle namen er eventueel in passen
ReDim Namen(laatsteregelII)

    For Each c In MyRangeI.Range("A2:A" & laatsteregel)
        arraynummer = 1
        For Each d In MyRangeII.Range("B1:B" & laatsteregelII)
            If d.Value = c.Value Then
                'vul de array met de naam Namen
                Namen(arraynummer) = d.Offset(, -1).Value
                arraynummer = arraynummer + 1
            End If
        Next
        
        'loop door array heen om de gegevens om te zetten naar een string
        'zodat deze makkelijker weer te geven is
        For x = 1 To arraynummer - 1
            If Namen(x) <> "" Then
                If x = 1 Then
                    Namenlijst = Namen(1)
                Else
                    Namenlijst = Namenlijst & ", " & Namen(x)
                End If
            Else
                Exit For
            End If
        Next
        
        'Vul de gegevens in
        c.Offset(, 1) = Namenlijst

        'maak de Namenlijst leeg voor de volgende vergelijking
        Namenlijst = ""
        'Geef de array weer x aantal lege plaatsen (eigenlijk leeg je hem nu)
        ReDim Namen(laatsteregelII)

    Next

'tegen knipperen van het beeld
Application.ScreenUpdating = True

End Sub
 

Bijlagen

@Wigi: is zeker niet voor beginners die code op je pagina, welke zou dat wel zijn voor dit probleem?. :)

Ferenc, er is geen code die dit op 1-2-3 doet én simpel is ;)

Ik heb niet de hele code doorgenomen (ziet er wel toppie uit). Maar dit:

Code:
For x = 1 To arraynummer - 1
            If Namen(x) <> "" Then
                If x = 1 Then
                    Namenlijst = Namen(1)
                Else
                    Namenlijst = Namenlijst & ", " & Namen(x)
                End If
            Else
                Exit For
            End If
        Next

doet mij sterk denken aan Join(Namen,", ").

En deze lus

Code:
For Each d In MyRangeII.Range("B1:B" & laatsteregelII)
            If d.Value = c.Value Then
                'vul de array met de naam Namen
                Namen(arraynummer) = d.Offset(, -1).Value
                arraynummer = arraynummer + 1
            End If
        Next

zou nog een autofilter kunnen zijn. De code waarin ik eerder referereerde bevat ook iets voor de Autofilter, en ook Split (wat het omgekeerde is van Join).

Wigi
 
Laatst bewerkt:
Ik ga kijken hoe ver ik kom met jullie informatie. Alvast heel erg bedankt voor de snelle reactie.
 
Het werkt perfect.
Dit bespaart mij uren werk.

Nogmaals heel erg bedankt.

Groeten,

Jen
 
Bedankt, na al die tijd heeft mij dit ook geholpen!
@Demeter: Is het ook mogelijk om bestaande kolommen (met postcode en woonplaats) te laten staan? Deze worden nu verwijderd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan