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

Zoeken combinatie van getallen in tabel

Status
Niet open voor verdere reacties.

gerben3

Gebruiker
Lid geworden
2 nov 2013
Berichten
7
Ik heb een totaal bedrag. Dit is een som van een aantal getallen in een tabel. Kan ik Excel laten zoeken welke combinatie van die getallen dit totaal bedrag is.

Voorbeeld je krijgt een totaal betaling binnen op je bankafschrift maar je hebt geen specificatie van de betaalde openstaande posten. Kan je dan Excel laten zoeken in die tabel welke openstaande posten matchen met dat totaal betaalde bedrag?

Alvast bedankt voor het meedenken.
 
ja, dat is mogelijk, maar vaak nogal reken-intensief.
Dus moet je het excel zo gemakkelijk mogelijk maken, dus niet zoeken met alle getallen in die tabel, maar bv enkel 5-10 specifieke getallen uit de tabel
 
De getallenreeks is niet groot. Dat kan redelijk eenvoudig beperkt worden. Alleen hoe pak ik dat dan aan. Heb zitten zoeken naar een formule hiervoor maar kan niets vinden.
 

Bijlagen

  • Afletteren Excel.xlsx
    9,8 KB · Weergaven: 37
met een formules is het kwasi onmogelijk, je kan "oplosser" (of Solver) installeren bij de opties voorin en dan kan je die je probleem laten oplossen.
zie bijlage
 

Bijlagen

  • Afletteren Excel.xlsx
    16 KB · Weergaven: 51
Ik heb een poging gedaan om de Oplosser na te bootsen m.b.v. VBA, en het werkt redelijk goed tot combinaties van 8 bedragen.
Mijn conclusie is dat de som van willekeurige bedragen nooit op 27.285,27 zal uitkomen. 1 cent minder wel.
Ik weet uit ervaring dat bij financiele systemen soms met afrondingen werkt (bij BTW berekening) en dat het voor kan komen dat het bedrag 1 cent verschilt.
De som 27.285,26 komt wel voor in mijn methode (en bij cow18 vlgs mij ook)
Zie bijlage.....
In het gedeelte met de vinkjes kun je heel makkelijk zelf handmatig combinaties maken.
Ik denk dat de oplosser slimmer gemaakt kan worden, maar zal daar een nieuw topic voor starten.
 

Bijlagen

  • Afletteren Excel (pcb).xlsb
    27,2 KB · Weergaven: 29
Ik heb nog een methode gevonden op het web....
Het werkt met 3 named ranges en een Matrix-formule.
Hij geeft de oplossing binnen een minuut of 2.
De beperking is echter dat er maximaal 19 bedragen in de getallenreeks mogen zitten.
De formule werkt goed, maar ik snap helemaal niks van die formule.
In de bijlage zit een voorbeeld met een handleiding......
Wie durft en kan de formule kraken ?
 

Bijlagen

  • Afletteren Excel(Matrix Formule).xlsx
    13,4 KB · Weergaven: 43
waw, knap.
Kraken is misschien voor het weekend, tenzij iemand nieuwsgieriger is dan ik.
De site waar je dit voorbeeld van gepikt hebt, hadden die anders geen verdere uitleg ?
 
heel indrukwekkend, alleen als je doel 0.01€ afwijkt van een mogelijke oplossing, dan krijg je niets, ook geen "beste" benadering.
In je linkje staan daar anders wel een aantal verwante oplossingen, die meer richting de gekende solver gaan, ik ga daar eens mijn licht opsteken.
 
Toch een poging gedaan om een VBA routine te maken die gewoon alle mogelijke combinaties afloopt.
Mijn angst was dat het heel veel tijd zou kosten, maar dat valt wel mee als de reeks bedragen beperkt blijft tot 25 stuks.
Het geeft wel de mogelijkheid om meerdere oplossingen te vinden en als er geen exacte oplossing is, dan de dichtsbijzijnde oplossing te vinden.
 

Bijlagen

  • Afletteren Excel(VBA)1.xlsb
    21,8 KB · Weergaven: 40
Ik ben steeds verrast door de bondige manier van oplossen.

een gedachte die nu eventjes bij mij opkomt.
Je getallenreeks is gesorteerd van klein naar groot.
Moest het nu eens omgekeerd zijn, van groot naar klein, dan denk ik dat je in een bepaalde loop er sneller uitgegooid zal worden omdat je voorbij de al gevonden dif komt.
Dus alhoewel ik al verrast ben door de snelheid, zou dit een wezenlijk verschil maken ? Misschien denk/gok ik fout.
Anders probeer ik het vanavond zelf eens uit.

Correctie na een bezinningsperiode, ik denk dat het niet uitmaakt, maar eigenlijk zou je op het einde het aantal effectief afgewerkte loops moeten tellen om het zeker te zijn.
Het gebruik van vermenigvuldigen van arrays zou misschien ook een verschil kunnen maken ipv. individueel vermenigvuldigen en optellen.
Ook die laatste opmerking trek ik in.

Ik zit te manier te zoeken om hopeloze takken (als je al voorbij de doel + dif bent) vervroegd af te breken.
Anderzijds als je net geen 10.000.000 loops afwerkt in 7 sec, heeft dat dan nog wel zin ?
 
Laatst bewerkt:
Je kunt dit met VB ook recursief oplossen. Dit voorbeeld toont steeds de beste oplossing tot dan toe in het direct venster van de vbe.
De bedragen moeten vooraf oplopend gesorteerd zijn.
Hoe kleiner het doelbedrag hoe sneller de oplossingen bepaald zijn.
 

Bijlagen

  • Afletteren Excel.xlsm
    25,5 KB · Weergaven: 45
Laatst bewerkt:
Hoe knap ik dit ook vind, mijn kleine hersenen willen hier niet bij en kunnen het, zelfs na lezen van de oplossing, niet reproduceren.
Recursief, dat gaat precies tegen mijn geloof in, ook vroeger al.
Bestaat er een handleiding "Recursive for dummies" om het pad te effenen ?
 
Ik betwijfel dat je kleine hersenen hebt, getuige de vele dagelijkse spinsels op dit forum...
Heb je al gegoogeld op "recursion for dummies"? Heel veel hits! Overigens hebben we allemaal wel ergens een blinde vlek.
Soms kan het tijdens het ontwikkelen helpen om de recursieve functie eronder te kopiëren, en die tweede te callen vanuit de eerste.
Hieronder een verbeterde versie van de functie uit #12, ik zag dat daar nog een poging tot optimalisatie in zit die juist averechts werkt. Onderstaande procedure is nog een factor sneller. Gelijk ook maar de do/loop vervangen door for/next.

Code:
Private Sub ZoekOplossing(ByVal Startrij As Long, ByVal Oplossing As String, ByVal Subtotaal As Double)
    Dim i As Long
    For i = Startrij To UBound(Bedragen)
        If Subtotaal + Bedragen(i) = Doelbedrag Then  ' een oplossing gevonden
            PrintOplossing Subtotaal, CDbl(Bedragen(i)), Oplossing
            Exit Do
        ElseIf Subtotaal + Bedragen(i) > Doelbedrag Then  ' stop zoeken; vorige is mogelijk ook kandidaat
            If i > Startrij Then PrintOplossing Subtotaal, CDbl(Bedragen(i - 1)), Oplossing ' vorige, als die er is
            PrintOplossing Subtotaal, CDbl(Bedragen(i)), Oplossing ' huidige
            Exit Do
        Else ' verder zoeken
            ZoekOplossing Startrij:=i + 1, Oplossing:=Oplossing & "+" & Bedragen(i), Subtotaal:=Subtotaal + Bedragen(i)
        End If
    Next
End Sub
 
Frans, de nieuwe versie werkt goed, als je Exit Do vervangt door Exit For ;-)
 
ik ga er dit weekend nog een keer naar kijken, die site voor "dummies".
Vroeger zat ik in de automatisering (PLCs). Zoiets schrijven, waardoor je in een eindeloze lus lijkt te zitten, dat was "not done".
Het is dus meer dan koudwatervrees, het gaat in tegen mijn geloof (grapje) !
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan