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

Samenvoegen van regels in een adressenlijst

Status
Niet open voor verdere reacties.

IvoBookish

Gebruiker
Lid geworden
12 feb 2010
Berichten
111
Goedendag,

Ik loop tegen een terugkomend probleem aan:
op div. plekken word mijn adressen lijst in- en aangevuld. Alleen krijg ik daardoor div dubbele regels omdat er regelmatig voor dezelfde mensen adressen in- aangevuld word. Soms ook met menselijke foutjes.
Ondertussen gaat het over een 10.000 regels/adressen en dat word wat te veel om handmatig te reorganiseren.

Hierbij een kleiner voorbeeld:
Schermafdruk 2017-06-10 12.42.54.png

Nu weet ik zelf niet zo goed of dit wel op te lossen is, er zitten veel variabelen in maar wie weet ziet iemand van jullie hier een uitdaging in?
vaste waarde moet zijn het e-mail adres, die ga ik gebruiken.
Ik heb al wat zitten spelen met vert.zoeken maar het lukt me maar niet.
Ik werk met een nederlandse versie van office 365.

Bekijk bijlage test.xlsx
 
Selecteer het hele bereik en via Duplicaten verwijderen op kolom E.
Dan worden alle regels met gelijke mailadressen verwijderd.
 
Hi Cobbe,

Dank je wel, echter raak ik dan overige data op die regels kwijt. snap je wat ik wil bereiken?
Ik wil dus eigenlijk geen data verliezen, dus soms kijg ik een @adres met telefoon nummer en de volgende keer met naam en voornaam. Als ik die dan samenvoeg heb ik een regel met @adres, voornaam, achternaam en tel.

dat is wat ik zou willen berijken.
 
Dat wordt een lastige denk ik zo.:)
 
Welnee.
Voeg een leeg werkblad 2 in, maak kolom G op als tekst ivm voorloopnul en draai onderstaande code.
Code:
Sub tsh()
    Dim Br
    Dim i As Long, j As Long
    Dim Bq
    
    Br = Sheets(1).Cells(1).CurrentRegion.Resize(, 9)
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(Br)
            Bq = .Item(Br(i, 5))
            If IsEmpty(Bq) Then ReDim Bq(8)
            For j = 0 To 8
                If Br(i, j + 1) <> "" Then Bq(j) = Br(i, j + 1)
            Next
            .Item(Br(i, 5)) = Bq
        Next
        Sheets(2).Cells(1, 1).Resize(.Count, 9) = Application.Index(.Items, 0)
    End With
End Sub
 
Laatst bewerkt:
Geheel foutloos loopt deze ook niet, anders wel mooie code.

Als er een verschillend tel.nummer achter de 2de janpietersen@gmail.com staat wordt het 1ste nr. gewist.
 
Klopt wat je zegt. Per veld wordt maar één waarde onthouden.
 
Dus zelfde resultaat als via Duplicaten verwijderen.

Daarom ook lastiger als op eerste zicht blijkt.
 
Nee, het resultaat is niet hetzelfde als met duplicaten verwijderen. Een veld wordt niet overschreven met een lege waarde.
 
Dank Timshel, ik ga daar naar kijken!
nog niet zo heel erg thuis in macro's/scripts maar zou er uit moeten kunnen komen, evt een handmatige sortering om de dubbele telefoonnummers te vinden voorafgaande zou het moeten kunnen fixen.
 
TS moet maar zeggen of het voldoet. Als rekening moet worden gehouden met verschillende telefoonnummers in kolom G is daar wel een mouw aan te passen, maar de code kan toch niet uitmaken of er sprake is van een typefout, een verouderd nummer of dat het contact inderdaad zakken vol met mobieltjes heeft.
 
Ik kan de macro niet zo goed lezen, maar kan ik er vanuit gaan dat de laatst ingegeven waarde word gebruikt?
vb: ik krijg nu in regel 1:
janpietersen lege cel lege cel pietersen janpietersen@gmail.com lege cel 0612345678 lege cel gouda

die a1 (janpietersen) zie ik in rij 2 terug maar had liever die van rij 1 (jan) daar gezien.
Ik snap dat dit wellicht een menselijk oog nodig heeft?
 
ontdubbelen van adressen is zelfs in professionele applicaties vaak nog een handmatig iets, in de zin dat bij meerdere records er door de gebruiker vaak een keuze gemaakt moet worden wat behouden moet worden.

Belangrijkste is het proberen dubbelingen zoveel mogelijk te voorkomen. en als dat niet mogelijk is dan zou ik bij een adreslijst waar mailadres de sleutel is eerder streven naar een masterlist waar het mailadres maar 1x op voorkomt en een aantal velden waar je uit kunt afleiden in welke adresbestanden dit mailadres voorkomt.

Vervolgens kun je de masterlijst gaan verrijken met de overige informatie. velden die in 2 lijsten exact overeenkomen neem je over. je neemt 1 lijst als basisinformatie en daarna vul je vanuit de overige lijsten de info aan die ontbreekt en bij dubbele en afwijkende waardes vraag je om een keuze. te maken.
 
Roelman, das idd de beste benadering naar de toekomst toe denk ik.
1x nu de lijst "cleanen" (met hulp van de eerder gegeven macro) en vervolgens vanuit de nieuwe lijsten laten aanvullen, goed idee!

hoe zou ik dat het beste kunnen aanpakken?
3 tabbladen, 1 cleaned, 2 nieuwe lijst, 3 een samenvoeging er van?
Met verticaal zoeken mailadres opzoeken en met "als leeg" aanvullen vanuit tabblad 2?

of is dat met een macro veel eenvoudiger/sneller op te lossen?
 
Wat @roeljongman zegt.
Ik heb de code aangevuld. In zoverre begeef ik me op glad ijs dat de computer wordt geïnstrueerd hoe menselijke interpretatieverschillen in elkaar steken. Mogelijk gaat de aanpassing op een andere plek juist ten koste van de gegevensintegriteit.
Code:
Sub tsh()
    Dim Br
    Dim i As Long, j As Long, t As Long
    Dim Bq
    
    Br = Sheets(1).Cells(1).CurrentRegion.Resize(, 9)
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(Br)
            Bq = .Item(Br(i, 5))
            If IsEmpty(Bq) Then ReDim Bq(8)
            t = 0
            For j = 0 To 3
                t = t - (Bq(j) = "") + (Br(i, j + 1) = "")
            Next
            For j = 0 To 8
                If (j > 3 And Br(i, j + 1) <> "") Or (j < 4 And t >= 0) Then Bq(j) = Br(i, j + 1)
            Next
            .Item(Br(i, 5)) = Bq
        Next
        Sheets(2).Cells(1, 1).Resize(.Count, 9) = Application.Index(.Items, 0)
    End With
End Sub
 
Laatst bewerkt:
Snap wat je bedoeld Timshel, voor het test bestand werkt hij nu zo goed als mogelijk iig. Dank daar voor. voor het origineel zal het wellicht wat minder goed werken maar ik vermoed dat ik iig een hoop geholpen ben.
Pakt hij nu de kortst ingevulde celinhoud? of is het ingewikkelder dan dat?
 
De code kijkt nu apart naar het aantal velden dat is ingevuld in kolom A t/m D, naamgegevens.
De code onthoudt naamgegevens waarvan de meeste velden gevuld zijn.
 
Roelman, das idd de beste benadering naar de toekomst toe denk ik.
of is dat met een macro veel eenvoudiger/sneller op te lossen?

als je eenmaal de masterlijst heb zou ik dat ook met macro's blijven doen. je moet even exact uitdenken wat in welke volgorde moet.
mogelijk kan je een deel wel met formules oplossen maar bepalen wat toegevoegd moet worden en wat moet worden gecontroleerd zou ik door een macro laten doen.
Ik denk dat ik een "beslislijst" zou maken op een tabblad met de gegevens uit beide lijsten. daarna bekijken hoe je die beslisadressen presenteert aan de gebruiker.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan