Γειά σε όλους σας,
προσπάθησα κι εγώ να ψάξω για μια καλή λύση.
Ουσιαστικά ακολούθησα την τακτική του Τάσου (concept), θέλησα να αποφύγω όμως την υλοποίηση με recursion και να δώσω μια iterative λύση (με loops). Το θέμα με μια συνάρτηση, η οποία καλεί τον εαυτό της, είναι, ότι «κοστίζει» πολύ. Επιπλέον το βάθος είναι διαφορετικό σε κάθε compiler.
Το τελευταίο τεστ έδειξε ότι καταφέρνει με 20.000 τιμές μέσα σε λιγότερο από 10 δευτερόλεπτα να δείξει τα 50 καλύτερα αθροίσματα.
Ο κώδικας δεν είναι γραμμένος με
VBA, αλλά με C# και ενσωματωμένος στο αρχείο του Excel.
Στο μήνυμα αυτό επισυνάπτω την εγκατάσταση (Setup) του αρχείου, διότι η λύση απαιτεί:
- MS Office 2007/2010
- .NET 4 Framework
- VSTO 2010 (VSTO 4)
Σε περίπτωση που δεν έχετε κάτι από τα παραπάνω, η εγκατάσταση τα κατεβάζει αυτόματα, οπότε εγκαθίστανται και αυτά.
Η απεγκατάσταση γίνεται ως γνωστόν από τον πίνακα ελέγχου.
Το αρχείο Excel έχει ακριβώς ένα φύλλο (BestFit), όπου περιμένει τις τιμές. Οι τιμές μπορούν να γραφούν σε μια στήλη, σε μια σειρά, σε περισσότερες στήλες και σειρές, σε περισσότερα areas (σύνθετες επιλογές). Οι τιμές μπορούν να είναι και συναρτήσεις.
Το πλήθος των κελιών που αποτελεί τα επιμέρους ποσά, πρέπει να είναι επιλεγμένο (selected).
Στη συνέχεια επιλέγετε το «Mdragon-ribbon», όπου εκεί καθορίζετε τη τιμή για το επιθυμητό άθροισμά (GOAL), το όριο ανοχής (EPSILON), και πόσα αποτελέσματα να δείξει (KEEP).Αν επιλέξετε π.χ. 5, τότε δείχνει τα 5 καλύτερα αποτελέσματα (όχι τα 5 πρώτα). Έπειτα START.
Τα αποτελέσματα τα γράφει ανοίγοντας καινούργιο φύλλο εργασίας. Σε περίπτωση που υπάρχει είδη ένα φύλλο με αποτελέσματα, ανοίγει καινούργιο φύλλο εργασίας και το αριθμεί.
Όποιος ενδιαφέρεται, ας κάνει μερικές δοκιμές.
Φιλικά
Ανδρέας