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

Probleem met tussenvoegsel: ""van den""

Status
Niet open voor verdere reacties.

fwalraven

Gebruiker
Lid geworden
30 apr 2006
Berichten
168
Hallo,

Ik probeer voornaam en achternaam met tussenvoegsel te sorteren in 2 kolommen. Middels een macro
Alleen tussenvoegsel "van den" werkt niet mee.

Waarom alleen "van den" niet?

Zie bij gevoegd bestand.

Frans
 

Bijlagen

Laatst bewerkt:
Jou array begint bij (0) en je begint bij 1 met splitsen, hij neemt dus de eerste niet mee.
 
Je kan wel bij 1 beginnen als je Option Base 1 boven de macro zet.
Dus als eerste regel in de module.
 
Alternatief:
Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
  
  With CreateObject("Adodb.recordset")
    For j = 1 To 3
      .Fields.Append Choose(j, "voor", "tussen", "achter"), 129, 20
    Next
    .Open
        
    For j = 1 To UBound(sn)
      st = Split(sn(j, 2))
      .AddNew
      .Fields("voor") = st(0)
      .Fields("achter") = st(UBound(st))
      .Fields("tussen") = Join(Filter(Filter(st, st(0), 0), st(UBound(st)), 0))
      .Update
    Next
    .Sort = "achter, voor"
    c00 = Application.Trim(Replace(.getstring, vbTab, " "))
     
    MsgBox c00
  End With
    
  Cells(1, 4).Resize(UBound(sn)) = Application.Transpose(Split(c00, vbCr))
End Sub
 
Laatst bewerkt:
Nog een alternatief dat geen macro nodig heeft en ook geen lijst met tussenvoegsels.
 

Bijlagen

Macro variant

Code:
Sub jec()
 Dim ar, sp, i As Long
 ar = Cells(1).CurrentRegion.Resize(, 4)
 
 For i = 1 To UBound(ar)
   sp = Split(ar(i, 2))
   If UBound(sp) > 2 Then
     ar(i, 3) = sp(0)
     ar(i, 4) = Join(Array(sp(3), sp(1), sp(2)))
   Else
     ar(i, 3) = sp(0)
     ar(i, 4) = sp(1)
     If UBound(sp) > 1 Then ar(i, 4) = sp(2) & " " & ar(i, 4)
   End If
 Next
 
 Cells(1).CurrentRegion.Resize(, 4) = ar
End Sub
 
Als je office 365/2021 hebt kan het ook met één dynamische formule

Code:
=LET(y;XML.FILTEREN("<x><y>"&SUBSTITUEREN(B1;" ";"</y><y>")&"</y></x>";"//y");z;AANTALARG(y);KIEZEN({1\2};INDEX(y;1);TEKST.COMBINEREN(" ";;INDEX(y;z);ALS.FOUT(INDEX(y;REEKS(z-2;;2));""))))
 
Laatst bewerkt:
Nog een duitje:

Code:
Sub M_snb()
  With Cells(1).CurrentRegion.Resize(, 3)
    sn = .Value
    For j = 1 To UBound(sn)
      sn(j,3) = Split(sn(j, 2))(UBound(Split(sn(j, 2))))
    Next
    .Value = sn
    .Sort Cells(1, 3)
    .Columns(3).ClearContents
  End With
End Sub
 
@snb, ik zie bij deze de gevraagde output niet terug
 
Bij mij is kolom B dan gesorteerd op achternaam.
 
Als alleen sortering voldoet wel, even afwachten dan maar
 
Allen bedankt voor het meedenken en oplossingen.

Het probleem is toch groter als alleen "van den".

Dit heb ik opgelost door als 1e tussenvoegsel "XXXXX" te plaatsen en of de optie van Edmoor "Option base1" te gebruiken.

Andere problemen die te voorschijn komen in het bestand zijn voor namelijk dubbele achternamen en of tussenvoegsels tussen de dubbele achternamen.

Bv: Johannes Cornelius Janssen van den Heuvel of Franciscus Josephus Janssen Bouwmeester
Ik hou het voorlopig op macro2 en kijk wel of er mogelijkheden zijn om voor de dubbele achternamen ook een oplossing is te vinden.

In het bijgevoegde bestand is te zien wat er gebeurd met de voorgestelde oplossingen.

Overigens het zijn bestanden van meer dan 1000 rijen.

Frans
 

Bijlagen

De formule optie doet het volgens mij aardig goed.
Echter is het bijna niet te doen om alle variaties af te vangen
 
Laatst bewerkt:
Suggestie: geef dit op. De variatie aan voornaam, achternaam, tussenvoegsel etc. is te onsystematisch om daarvoor een systematische code of formule te maken. Onregelmatigheid kun je niet programmeren.
Kijk maar eens een week naar alle overlijdensadvertenties in de krant.
 
De internationale bibliothekenorganisatie IFLA heeft de gangbare manier van sorteren per land onderzocht en in richtlijnen vervat.[11] FOBID, de Nederlandse koepelorganisatie in het bibliotheek- en documentatiewezen, heeft de IFLA-richtlijnen overgenomen in de Regels voor catalogusbouw. Uitgangspunt is dat de nationaliteit van een auteur het ‘richtsnoer’ is voor de sortering van auteursnamen – dus Nederlandse schrijvers worden op de Nederlandse manier gesorteerd, Belgische auteurs op de ‘Belgische’ wijze, Franse schrijvers op de Franse manier enzovoorts. Ook bibliotheken in andere landen hebben de IFLA-regels overgenomen, soms met kleine afwijkingen. Bijvoorbeeld de namen:


  • Willem de Vries
  • Willem de Vrieze
  • Willem van de Vries
  • Willem van de Vriezen
  • Willem van der Vries
  • Willem van der Vrieze
worden gesorteerd als:

  • Vries, Willem de
  • Vries, Willem van de
  • Vries, Willem van der
  • Vrieze, Willem de
  • Vrieze, Willem van de
  • Vriezen, Willem van der
Iemand die De Vries heet, wordt bijvoorbeeld in het Nederlandse telefoonboek niet onder de D, maar onder de V gevonden. Voorvoegsels worden in Nederland dan ook in een database vaak in een apart veld opgenomen.
bron: https://nl.wikipedia.org/wiki/Tussenvoegsel

En mocht dat niet lukken dan is hier een tabel met allen in nederland voorkomende tussenvoegsels, Tabel 36 Voorvoegsels bij de Rijksdienst voor Identiteitsgegevens (RvIG)
 
Laatst bewerkt:
Interessant. Bedankt Alphamax.:thumb:
 
Ook met de laatste voorgestelde voorbeelden gaat het niet goed.

De te grote variaties met dubbele achternamen gaat niet goed.

Frans
 
Frans, het lijkt me lastig als er dubbele voornamen zijn, dan weet je niet of er achternamen of voornamen zijn.
verder: als je een lijst van tussenvoegsels (zie link van Alfamax uit post 15) maakt, is het best acceptabel op te lossen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan