Gebruik Filter en Split - lukt niet volledig

Status
Niet open voor verdere reacties.

Plotinus

Gebruiker
Lid geworden
25 mrt 2007
Berichten
649
Het volgende is een voortzetting van een vraag van 9 juni 2020 waarbij snb mij op het goede spoor heeft gezet. Het ging om via een combox een lijst plaatsen aan te bieden en vervolgens bij selectie in een textbox de bijbehorende gemeente weer te geven. Dit is gerealiseerd door vanuit een Excelsheet de twee kolommen met deze gegevens in een Doc variabele ("plaats") in de brief in te lezen en deze door splitsen en filteren weer uit te lezen zoals boven geschetst. Maar nu wil ik er ook de provincie erbij hebben (uitlezen); de derde kolom in de Excelsheet. Dat lukt me helaas niet, omdat ik 'Split' en 'Filter' niet helemaal goed begrijp zoals door snb toegepast: door de derde kolom vanuit de Excel-sheet wordt de gemeente niet juist meer weergegeven, laat staan de provincie.

Code:
Private Sub ComboBox1_Change()
    If ComboBox1.ListIndex > -1 Then TextBox1 = Mid(Filter(Split(ThisDocument.Variables("plaats"), Chr(0)), "_")(ComboBox1.ListIndex), 2)
    If ComboBox1.ListIndex > -1 Then TextBox3 = Mid(Filter(Split(ThisDocument.Variables("plaats"), Chr(0)), "_")(ComboBox1.ListIndex), 2)

End Sub


Iemand een idee hoe dit op te lossen?

Bijgevoegd ook de sheet van waaruit de data is opgehaald.
 

Bijlagen

  • Brief plus Excel-sheet.zip
    97,6 KB · Weergaven: 24
Laatst bewerkt:
https://www.helpmij.nl/forum/showth...jk-dropboxen-in-Word-vullen-vanuit-Excelsheet

heel kort samengevat
zo kwam je aan die string
c00 = c00 & Chr(0) & sn(j, 3) & Chr(0) & "_" & sn(j, 2) -> blijkbaar een tekststring met telkens char(0) & plaats & char(0) & "_" & gemeente

en zo ga je er mee verder
Split(ThisDocument.Variables("plaats"), Chr(0)) -> knipt die tekst in stukjes telkens op die char(0)
Filter(bovenstaande, "_",1) -> filtert er alle stukjes uit die "_" bevatten, dus de gemeenten
Filter(...)(ComboBox1.ListIndex) -> geeft het zoveelste element uit je gefilterde array weer bepaald door de combobox1.listindex
Mid(...bovenstaand..., 2) -> omdat je van bovenstaande die voorloop "_" niet wil zien, toon je pas vanaf het 2e karakter

Bij die filter stond oorspronkelijk die rode ",1" er niet bij. Als die niet gespecifieerd wordt, dan is die verondersteld true of 1 en filter je dus op alle tekstfragmenten die een "_" bevatten, dus de gemeenten.
Maak je die rode tekst ",0", dan filter je alle tekstfragmenten die geen "_" bevatten, dus de plaatsen
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/filter-function
 
Laatst bewerkt:
Het hele principe van je lijst klopt niet; je kunt niet beginnen met het selecteren van een plaats en dan de rest laten invullen, omdat je initiële lijst niet klopt: die bevat dubbele waarden. Neem alleen een plaats als Oudega: die komt voor in drie gemeenten. Weliswaar in dit geval allemaal in Friesland, maar dat is ook niet bij voorbaat altijd zo. Kijk je breder, dan heb je bijvoorbeeld een aantal plaatsen in verschillende provincies die IJsselstein of Valkenburg heten. En dan heb je echt een probleem. Kortom: wil je 100% zeker weten dat je de juiste plaats selecteert, dan moet je beginnen met een keuzelijst met Provincie, dan Gemeente en dan pas Plaats. Als alternatief kun je natuurlijk wel beginnen met de plaatsnaam (die weet je immers) maar dan moet je daarna dus een keuzelijst hebben voor de bijbehorende gemeentes, en eventueel provincies. Al zal dat laatste vermoedelijk niet nodig zijn, omdat de gemeentenamen uniek zijn, in tegenstelling dus tot de plaatsnamen.

Maar je moet dus van groot naar klein filteren, en niet andersom. Wat ook logisch is natuurlijk :). Volgens mij zit je dus al vanaf 9 juni 2020 op een verkeerd spoor op de goede trein te wachten :d.
 
Dank voor de duidelijke uitleg cow18!
Ik houd echter het probleem dat ik wel met twee (Excel) kolommen data om kan gaan maar niet met drie (zie hieronder het vette/bold aanhangsel): lees ik plaats en gemeente in (de eerste twee kolommen):

Code:
 Tabel = .sheets("Locatie").Cells(1).currentregion
        For j = 2 To UBound(Tabel)
            Adres= Adres& Chr(0) & Tabel(j, 1) & Chr(0) & "_" & Tabel(j, 2) [B]'& Chr(0) & "_" & Tabel(j, 3)[/B]
        Next j
        ThisDocument.Variables("Loactie") = Mid(Adres, 2)

Dan kan ik de 'plaats' wel uitlezen in het rolmenu 'CBPlaats':

Code:
CBPlaats.List = Filter(Split(ThisDocument.Variables("Locatie"), Chr(0)), "_", 0)

De 'gemeente' kan ik als volgt in het textvak 'TBGemeente' uitlezen:

Code:
 If CBPlaats.ListIndex > -1 Then TBGemeente.Value = Mid(Filter(Split(ThisDocument.Variables("Locatie"), Chr(0)), "_", 1)(CBPlaats.ListIndex), 2)

Maar lees ik dus de derde kolom (provincie) ook in, dan loopt het in de soep: de derde kolom wordt dan ook meegenomen bij het zoeken van de gemeente waardoor niet meer de juiste gemeente bij een plaats wordt gezocht, maar ook de provincie.

Eigenlijk zoek ik iets van een - in Excel termen - .Offset (0,2)

Overigens lukt het wel via een For-Next-lus, maar dan moet ik de data twee keer inlezen: met en zonder 'Chr(0)' wat ook niet echt slim/handig is.

Heb je een idee hoe dit op te lossen?


Bedankt voor je opmerking OctaFish. Je hebt natuurlijk gelijk, maar in mijn werkgebied speelt dit gelukkig niet en het vertrekpunt is nou eenmaal de plaats waarbij dus de gemeente en provincie bij gezocht moeten worden.
 
En dan herhaal ik weer dat in jouw bestand dus meerdere plaatsen meerdere keren voorkomen. En dat je dus op basis daarvan in die gevallen niet de goede gemeente kan vinden. Als je met een beperkte plaatsenlijst werkt, zou ik die dus eerst opschonen zodat elke plaats uniek is, en derhalve ook maar één gemeente en provincie heeft gekoppeld.
 
ik gok dat dit het gewenste resultaat geeft.
in de combobox1 kies je het zoveelste element en dan toon je in textbox1 en textbox3 ook de zoveeltste respektievelijk plaats of gemeente, met in acht name van de opmerkingen van Octafish
Code:
Private Sub ComboBox1_Change()
    If ComboBox1.ListIndex > -1 Then TextBox1 = Mid(Filter(Split(ThisDocument.Variables("plaats"), Chr(0)), "_"[COLOR="#B22222"],1[/COLOR])(ComboBox1.ListIndex), 2)
    If ComboBox1.ListIndex > -1 Then TextBox3 = Mid(Filter(Split(ThisDocument.Variables("plaats"), Chr(0)), "_"[COLOR="#B22222"],0[/COLOR])(ComboBox1.ListIndex), 2)

End Sub
 
Dank Voor je reactie cow18. Blijkt helaas niet te werken. Ik heb echter wel een werkbare andere oplossing gevonden die op elke tabel van toepassing is: een for-next-lus. Door de stapgrootte te baseren op het aantal kolommen in je Excel-datasheet kun je heel gericht een bepaalde kolom toewijzen aan bijvoorbeeld een list van een combox. De keuze die de gebruiker vervolgens daarin maakt kun je in een volgende for-next-lus gebruiken om de de naast ligggende velden uit te lezen. Werkt prima en heel vlot, veilig en begrijpelijk. Alleen een paar stappen meer.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan