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

Complexe uitdaging

Status
Niet open voor verdere reacties.
Beste Sylvester,

Dat staat voor het actuele jaartal. Volgend jaar zal dit bijvoorbeeld 19THJ0022 zijn.

Gr. Ben
 
wat moet er gebeuren als in de lijst zowel 18 als 19 voorkomt?
de jaartallen staan voor de namen dus gewoon standaard sorteren werkt dan niet .

misschien is het handiger om de tekst van kolom A te anders uit te splitsen .
niet zo:
18TQR0027 #1 x 18THJ0003 naar 18TQR0027 # 1 x 18THJ0003
maar zo:
18TQR0027 #1 x 18THJ0003 naar TQR180027 # 1 x THJ180003
of het jaartal er helemaal achter:
18TQR0027 #1 x 18THJ0003 naar TQR002718 # 1 x THJ000318
 
Laatst bewerkt:
Hi Sylvester,

Sorry dan begreep ik je verkeerd. Een lijst die ik invoer zal maar van 1 jaartal zijn.
Volgend jaar bijvoorbeeld zal de lijst die ik aanbied wel 19 zijn, maar dat betreft dan ook alle combinaties.

Gr. Ben
 
Hi Sylvester,

We hebben de macro geprobeerd en hij werkt heerlijk. Er is momenteel veel meer rust in de kas door deze nieuwe methode.
Hopelijk kun je nog een keertje tijd vinden om ook aan de laatste puntjes te werken.

Mvg,
Ben
 
@BenL

Deze draad staat al maandenlang op opgelost, terwijl uit jouw laatste reaktie het tegendeel blijkt.
Kun je de status van de draad daarmee in overeenstemming brengen ?
 
Hi SNB,

De originele vraag is gemarkeerd als opgelost. Wat nu rest is nog een nieuw idee voor finetuning. Zie ook post #35

Sylvester, megagoed, bedankt!

Alleen selecties 143 t/m 193 en 695 t/m 734 hebben 19 waardes ipv. 20. Enig idee hoe dit komt?

Ik zal het topic in ieder geval op opgelost zetten.
Als ik later eventueel nog wat nieuwe finetuning heb, zal ik dat hieronder plaatsen of in een nieuw topic?

Cow ook nog bedankt voor alle effort!

Ben
 
hallo, wat snb zegt is wel handig, dan kijken de echte cracks ook naar het probleem.

ik denk dat je dan allang een oplossing had gehad.

ik was er even niet bij.

bij deze mijn poging, ik hoop dat je er iets aan hebt.

geef vooral je wensen door.
 

Bijlagen

  • Vaderprobeersel (10.xlsm
    122,2 KB · Weergaven: 77
Sylvester, dit is nog beter dan ik had kunnen bedenken!

Bedankt voor alle hulp!

Ben
 
@sylv

Het is nooit verstandig cel A1 in een werkblad ('huidig') leeg te houden.
Dan kun je nl. geen gebruik maken van currentregion of usedrange (en die zijn niet voor niets geïntroduceerd).
Hoe beter het werkboek is gestruktureerd hoe minder code je nodig hebt om de manco's in de struktuur van het werkboek op te vangen.

Mij ontgaat de zin van de dubbeling van gegevens in werkblad 'huidig' in kolom A 1n kolommen c t/m g.
Verwijder kolom c t/m g en werk alleen met kolom A.

Mij ontgaat de zin om een bestaand werkblad te verwijderen en vervolgens een werkblad toe te voegen met dezelfde naam.
Gewoon toetsen of het werblad bestaaat en indien niet: aanmaken.
Dan is de hernieuwde opmaak van het werkblad ook niet nodig.
Natuurlijk is het veel handiger dat werkblad al in het werkboek te hebben, opgemaakt en wel; dan hoef je daarnaar helemaal niet meer om te kijken en vervalt de helft van je code.

In plaats van een 'custom type' (dat programmeertechnisch allang vervangen is door de klasse) is het gebruik van een dictionary die arrays bevat voor-de-hand-liggender.

Code:
Sub M_snb()
   if [not(isref(nieuw!A1))] then sheets.add.name="nieuw"    ' eenmalige aanmaak van werkblad 'nieuw"
   sn=sheets("huidig").cells(1).currentregion                       ' inlezen van je baissgegevens
End sub

Kun jij stap voor stap uitschrijven wat nu de bedoeling van de vragensteller is ?
Daartoe is hij niet in staat gebleken.
Daarop zijn al diverse helpers afgehaakt.
Als jij het naar (impliciet) gewenste eindtoestand hebt kunnen programmeren, kun jij het waarschijnlijk wel stap voor stap beschrijven.
Aan de hand daarvan kunnen we vervolgens als leerprojekt gaan kijken op welke verschillende manieren dit in VBA geprogrammeerd kan worden.
 
Laatst bewerkt:
snb, wat bedoel je met "implidiet" ?

Als jij het naar (implidiet) gewenste eindtoestand hebt kunnen programmeren, kun jij het waarschijnlijk wel stap voor stap beschrijven.
als je naar de oplossing kijkt, kan daar een stappen plan uit gehaald worden.

het blad verwijderen en daarna terug zetten is "voor mij" de eenvoudigste manier om met een schone lei te beginnen.

Mij ontgaat de zin van de dubbeling van gegevens in werkblad 'huidig' in kolom A 1n kolommen c t/m g.
Verwijder kolom c t/m g en werk alleen met kolom A.
als iemand zijn gegevens onhandig aangeleverd krijgt, dan pas ik de macro aan.
meestal is dat een luxe probleem.

soms is het een hele uitdaging om uit een vraag of antwoord van iemand te halen wat er bedoeld wordt, maar het is Ben uiteindelijk toch gelukt.


het stappen plan zal ik later posten.
 
snb, hier een beschrijving

het gaat hier om kruisingen van heren en vrouwen.
verder wordt het beschreven van uit de heren. kolom "G" Blad "Huidig"
heren mogen met meerdere vrouwen. (dus kan een heer voorkomen in meerdere kruisingen)

definities:
0) een kruising bevat een heer en een vrouw
1) een heer bestaat uit een familienaam en een voornaam.
2) familie bevat alle heren met de zelfde familienaam
3) de familienaam van een heer bestaat uit de 3 letters van de heer .bvb: heernaam = 18TKL0044 dan is familienaam TKL
4) de voornaam van een heer bestaat uit de laatste 4 letters van de heer . in dit geval dus 0044
5) een Blok is een beperkt aantal heren met de zelfde familienaam.

eisen:

1) een Blok mag niet meer dan 20 verschillende voornamen (van heren) bevatten. (daarna begint het volgende blok op een nieuwe pagina)
2) een pagina mag niet meer dan 30 kruisingen bevatten.
3) een pagina mag niet meer dan 1 familienaam bevatten.
4) per pagina wordt er op vrouw gesorteerd.
5) in de kop van iedere pagina staan gegevens over de familie , Blok , voornamen enz. zie blad1 en in het resultaat op blad "Nieuw"

ik "geloof" dat het een redelijke omschrijving is.
 
Naar een grof stappen plan

doel:
verdeel de aangeboden lijst in de families van de heren.
verdeel de families van de heren in Blokken van maximaal 20 verschillende heren
verdeel de blokken in pagina's van maximaal 30 kruisingen.

stappen:
1) sorteer de lijst op heren,vrouwen, tussennrummers
2) doorloop de lijst en sla per onderdeel alle relevante gegevens op:

per pagina: aantal kruisingen; gevonden voornamen;het Blok;de familie
per blok:aantal kruisingen;aantal unieke voornamen;eerste voornaam van het Blok; laatste voornaam van het Blok; aantal pagina's van het blok;de familie
per familie:aantal kruisingen;aantal Blokken;....
ps ik ben vast nog wel iets vergeten.

3) voeg aan de hand van de gevonden gegevens de koppen toe, maak de lijst op en sorteer steeds per pagina op de vrouwen.

dat is alles, zo valt het best wel mee.
 
Laatst bewerkt:
@Sylv

Controleer de gegevens bij TKL eens: ik heb 2 meer kruisingen dan jij.

Toegepast op het werkblad huidig:

Code:
Sub M_snb()
    With Blad1.Cells(1).CurrentRegion.Resize(, 7)
        .Sort Blad1.Cells(1, 7), , Blad1.Cells(1, 3), , , Blad1.Cells(1, 5)
        y = 1
        
        For j = 1 To .Rows.Count
           x = (InStr(c00, Left(Blad1.Cells(j, 7), 5)) = 0 And c00 <> "")
           If (Len(c00) = 200 And InStr(c00, Blad1.Cells(j, 7)) = 0) Or j - y = 29 Or x Then
              Blad1.Cells(j + x, 8).Resize(, 3) = Array(Mid(c00, 2, 5), j - y + 1 + x, Mid(c00, 2) & Blad1.Cells(j, 7))
              Blad1.Range(Blad1.Cells(y, 1), Blad1.Cells(j + x, 7)).Sort Blad1.Cells(y, 3)
              c00 = ""
              y = j + 1 + x
           End If
           If InStr(c00, Blad1.Cells(j, 7)) = 0 Then c00 = c00 & "/" & Blad1.Cells(j, 7)
        Next
        
    End With
End Sub
 
snb, nr 003 en 0076 zitten er bij jou te vaak in.
en als je de rijen van TKL telt kom je op 60
 
Het moeten er toch ook 60 zijn?

Code:
Sub M_snb()
  MsgBox UBound(Filter(Application.Transpose(Blad1.Cells(1).CurrentRegion.Value), "TKL")+1)
End Sub

Uit jouw overzicht komen er maar 58.

Ik voeg geen elementen toe; ze worden alleen gegroepeerd/gesorteerd.
 
Laatst bewerkt:
In tabblad nieuw:
Het resultaat van jouw routine:
in cel A584: Heer TKL aantal kruisingen 58

Daaronder
1 pag van 26
1 pag van 30
1 pag van 2

Totaal 58

Mijn verbeterde versie:

Code:
Sub M_snb()
  With Blad1.Cells(1).CurrentRegion.Resize(, 7)
    .Sort Blad1.Cells(1, 7), , Blad1.Cells(1, 3), , , Blad1.Cells(1, 5)
    y = 1
        
    For j = 1 To .Rows.Count
      If (InStr(c00, Left(Blad1.Cells(j, 7), 5)) = 0 And c00 <> "") Or (Len(c00) = 200 And InStr(c00, Blad1.Cells(j, 7)) = 0) Or (j - y > 30) Then
        Blad1.Cells(j - 1, 8).Resize(, 3) = Array(Mid(c00, 2, 5), j - 1 - y - (j - y < 31), Mid(c00, 2) & Blad1.Cells(j, 7))
        Application.Range(Blad1.Cells(y, 1), Blad1.Cells(j - 1, 7)).Sort Blad1.Cells(y, 3), , Blad1.Cells(y, 5)
        c00 = ""
        y = j
      End If
      If InStr(c00, Blad1.Cells(j, 7)) = 0 Then c00 = c00 & "/" & Blad1.Cells(j, 7)
    Next
  end with
End Sub
 
Laatst bewerkt:
ik neem aan dat jij mijn oplossing uit post 47 gebruikt . daar staat in blad nieuw in rij 584 "Heer TKL aantal kruisingen 60"

probeer het maar zonder eerst Blad Huidig te veranderen.

dus downloaden en op de knop drukken.
 
Laatst bewerkt:
snb, bij TKL krijg je nu 26,30,3

dat is 59 ipv 60

en jouw 30 staat een rij te laag
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan