| Excel - Ερωτήσεις / Απαντήσεις Ότι έχει σχέση με συναρτήσεις, μορφοποίηση, εκτυπώσεις γραφήματα κτλ. |
![]() |
| | Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
|
#21
|
|
Καλησπέρα/Καλημέρα σε όλους και όλες. Επειδή δεν μου αρέσουν οι προσωπικές διαμάχες θα περιοριστώ στο να πω ότι: όταν εγώ ρώτησα όχι μόνο για το δάσος: "Δηλαδή το αρχικό ποσό δεν έχει σχέση με τις εργασίες ?" ρώτησα και για το δέντρο: "Γίνονται εργασίες χωρίς να υπάρχουν χρήματα ?" και ζήτησα να μάθω ακόμα και το είδος του δέντρου: "πιστοποίηση = ???" Δεν πήρα συγκεκριμένη απάντηση σε κανένα από τα 3 ερωτήματα και ερμήνευσα την απάντηση σαν: "δεν μας γ..... Αν μπορείς δώσε μου την λύση σε αυτό που ζητάω και μην με σκοτίζεις." Γεγονός που με δυσαρέστησε και έκφρασα σε επόμενο μήνυμα μου.Μάλλον πρόκειται για παρεξήγηση (και ίσως λάθος ερμηνεία της απάντησης) που όμως νομίζω ξεκαθάρισε. ![]() Τέλος καλό όλα καλά βρέθηκε κάποια λύση και αυτό μετράει. ![]() Πάμε παρακάτω. Θέτω λοιπόν νέο διπλό ερώτημα: ![]() α) Χρειάζεται να συνεχίσουμε το ψάξιμο; Μιας και η πολύ καλή λύση του Τάσου "δεν ικανοποιεί πλήρως" το ζητούμενο όπως το προσδιόρισε τόσο ο ίδιος λέγοντας "σαν αρχή..." αλλά και ο Ανδρέας λέγοντας ότι "έχει βρει την πρώτη λύση" και όχι απαραίτητα την ιδανική. (Δηλαδή αν έχουμε σαν αριθμούς τους αριθμούς από 1-9 και ψάχνουμε αποτέλεσμα 9 θα μας δώσει σαν λύση το 1, 2, 6 και όχι το 9 που όπως είπε η Μάρω είναι το επιθυμητό αποτέλεσμα. Με άλλα λόγια το ποια λύση θα πάρουμε με το κώδικα του Τάσου εξαρτάται από το πως είναι καταχωρημένοι οι αριθμοί μας. Ο κώδικας δεν λαμβάνει καθόλου υπόψιν το πόσοι αριθμοί συμμετέχουν στο αποτέλεσμα. Μια ταξινόμηση κατά αύξουσα σειρά (δυνατότητα που μας δίνει ο Τάσος με το checkbox) νομίζω θα μας δώσει πάντα την λύση με το μεγαλύτερο πλήθος αν δεν κάνω λάθος. Το αντίστροφο δηλαδή μια ταξινόμηση με φθίνουσα σειρά δεν νομίζω ότι θα μας δώσει την λύση με το μικρότερο πλήθος.) Για να βρούμε δηλαδή την ιδανική λύση πρέπει να εξετάσουμε όλους τους συνδυασμούς όπως έχω ήδη πει. ή β) θεωρούμε ότι έχει καλυφθεί το θέμα; Άρα πάμε για άλλα. Γεγονός είναι ότι το συγκεκριμένο ερώτημα έφερε στην επιφάνεια δύο νέα για το φόρουμ μας ζητήματα: 1) Επίλυση (Solver) στο excel και 2) χρήση recursion σε κώδικα VBA. όπου ίσως θα ήταν σκόπιμο να ανοιχτούν σαν νέα θέματα αν υπάρχει ανάγκη. Φιλικά Θανάσης |
|
#22
| |||
| |||
|
Συμφωνώ μαζί σου Θανάση στο θέμα της ταξινόμησης. Η λύση του Τάσου με γλύτωσε πάντως από ένα μεγάλο πονοκέφαλο. Δεν είμαι πλεονέκτρα αλλά αν υπήρχε λύση για μικρότερο πλήθος δεν θα έλεγα όχι .Δυστυχώς οι γνώσεις μου δεν φτάνουν μέχρι εκεί για να μπορώ να βοηθήσω παραπάνω. Την καλησπέρα μου, Μάρω |
|
#23
|
|
Καλησπέρα/ καλημέρα σε όλους και όλες Φίλε Τάσο, υπάρχει κάποιο λάθος στο xl_CompineNumbers.xls που ανέβασες, και δεν εννοώ το p αντί του b για το combine ![]() Αν δώσουμε σαν αριθμούς 8 , 7, 6, 5, 3, 2 χωρίς ταξινόμηση ή αν ο πρώτος αριθμός είναι μεγαλύτερος του ζητούμενου, δηλαδή για τους αριθμούς 11, 9 , 3, 6 χωρίς ταξινόμηση Με ζητούμενο αποτέλεσμα 9 και στις δύο περιπτώσεις δεν βρίσκει λύση, ενώ είναι προφανές. Κάνω λοιπόν μια πρόταση/διόρθωσης ![]() αλλάζουμε το τελευταίο "Exit FOr" σε "ccrMatch = ccrMatch - ArrItems(x)" και έτσι νομίζω ότι λύνεται το πρόβλημα. Τώρα για το ελάχιστο πλήθος νομίζω ότι θα γίνει πολύ χρονοβόρα για να εξετάσει όλους τους συνδυασμούς και να βρει τον ιδανικό. Μάλλον θα πρέπει να αρκεστούμε στην αντίστροφη ταξινόμηση που όμως όπως προείπα ναι μεν δεν εγγυάται το ελάχιστο πλήθος, αλλά είναι σαφώς μικρότερο από την αύξουσα ταξινόμηση η οποία δίνει το μέγιστο πλήθος. Ας αλλάξουμε λοιπόν και το "Order1:=xlAscending" σε "Order1:=xlDescending" στην CommandButton2_Click() Καλή βδομάδα σε όλους και καλές γιορτές. Θανάσης :icon_out: ΥΓ. Τάσο, ξαναλέω ότι θα πρέπει να το ανεβάσεις στα χρήσιμα. |
|
#24
| ||||
| ||||
|
Φίλοι μου καλημέρα! Το αρχικό συνημμένο που είχα ανεβάσει φτιάχτηκε "στα γρήγορα" λόγω ώρας (δείτε την ώρα του μηνύματος...) και φόρτου εργασίας αφήνοντας το ανοιχτό για οποιαδήποτε προγραμματιστική βελτίωση /επέκταση.Στο παρακάτω συνημμένο πρόσθεσα κάποιες λεπτομέρειες, λαμβάνοντας υπ όψη μου τις παρατηρήσεις σας. Φυσικά όποιος θέλει μπορεί να το μετατρέψει/βελτιώσει ή να κάνει τις παρατηρήσεις του. Να είστε καλά Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
|
#25
|
|
Φίλε Τάσο, Το πρόβλημα που περιέγραψα στο προηγούμενο post (αριθμοί 11, 9, 3 ζητώντας το 9) δεν δίνει λύση, ενώ είναι προφανής. θα πρέπει όπως είπα: να αλλάξουμε το τελευταίο "Exit FOr" σε "ccrMatch = ccrMatch - ArrItems(x)" τέταρτη γραμμή από το τέλος της CompineNumbers(...) Με το Exit For αγνοείς τις υπολειπόμενες συγκρίσεις, και παρότι πολύ σωστά αφαιρείς την τελευταία καταχώρηση από την NowVal (NowVal.Remove NowVal.Count) δεν αφαιρείς από το ccrMatch την τιμή της. Νομίζω ότι αυτό είναι λάθος στην περίπτωση όπου το ccrMatch δεν είναι μικρότερο από το (SetPt + 0.001 + ccrValOver). Τι λες μήπως κάνω εγώ λάθος; ![]() Τα λέμε. Θανάσης. |
|
#26
| ||||
| ||||
|
Φίλε Θανάση καλησπέρα! Έχεις δίκιο με τη γραμμή "ccrMatch = ccrMatch - ArrItems(x)" Στην αρχή, όταν έκανα τις δοκιμές μου το είχα κι εγώ έτσι (είναι λογικό). Όμως λαμβάνοντας υπόψη μου: Παράθεση:
Σε κάθε άλλη περίπτωση θα χρησιμοποιούσα την "ccrMatch...." Καλό βράδυ! Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
|
#27
| ||||
| ||||
|
Γεια και χαρά στη παρέα! Μιας και (όπως λέτε) το θέμα βρίσκεται ακόμη στο "εργαστήριο", αν έχετε ακόμη όρεξη, δείτε στο συνημμένο και μια δική μου (για την ώρα όχι και τόσο έξυπνη) πρόταση. Χωρίς να έχω δει τις τελευταίες εξελίξεις, είχα σκεφτεί και εγώ τη χρήση αναδρομής (προφανώς Τάσο είχαμε συνάντηση πνευμάτων πάλι ) μιας και η σειριακή υλοποίηση τέτοιων περιπτώσεων μοιάζει αρκετά δύσκολη (αν όχι αδύνατη). Η συνάρτηση SumNums στο συνημμένο, αθροίζει όσο γίνεται πιο κοντά στον στόχο τα διαθέσιμα ποσά, επαναλαμβάνει τη διαδικασία καλώντας τον εαυτό της κάθε φορά με διαφορετική θέση εκκίνησης και στην επιστροφή της συγκρίνονται τα αθροίσματα και επιλέγεται το μεγαλύτερο άρα και πιο κοντινό στο στόχο. Για την ώρα, τα αθροίσματα που επιστρέφει είναι πάντα μικρότερα ή ίσα του στόχου. (Αν φυσικά υπάρχει διαθέσιμο ποσό μικρότερο ή ίσο του στόχου.) Όταν την έγραφα, είχα στο μυαλό μου τα διαθέσιμα ποσά σε φθίνουσα ταξινόμηση και νομίζω πως έτσι δουλεύει και καλύτερα. Στην περιοχή "Ομάδα1" του μοναδικού φύλλου έχει εισαχθεί η προσαρμοσμένη συνάρτηση χρήστη (UDF) SumTarget ως τύπος πίνακα (Ctrl+Shift+Enter) πολλαπλών κελιών η οποία χρησιμοποιεί τη συνάρτηση SumNums και επιστρέφει τα ποσά που επιλέχθηκαν για το άθροισμα-στόχο1. Στις υπόλοιπες ομάδες ο τύπος λαμβάνει υπόψη τα ποσά που έχουν χρησιμοποιηθεί στις προηγούμενες ομάδες ώστε να αποφευχθεί η επιλογή ενός διαθέσιμου ποσού άνω της μιας φοράς. Αν δεν βαριέστε λοιπόν, κάντε μερικές δοκιμές, και αν προκύψουν, θέστε και τα σχόλια σας. ![]() Ομολογώ πως, όπως αυτό της βέλτιστης κοπής, έτσι και αυτό εδώ, είναι ένα πάρα πολύ ενδιαφέρον και προκλητικό για την κοινότητα του φόρουμ θέμα! ![]() Συνεπώς, δεν έχω παρά να ευχαριστήσω θερμά τη Μάρω που το έθεσε. Μάρω! Αν λοιπόν βρεθεί η βέλτιστη λύση για το άθροισμα βάσει στόχου και βελτιωθεί η λύση της βέλτιστης κοπής, τότε θα ανοίξουμε και ένα θέμα για τη συμμετρική κατανομή φορτίων σε τριφασικό δίκτυο. Εις το επανιδείν λοιπόν! Γιάννης
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ![]() ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
|
#28
| |||
| |||
|
Γιάννη καλώς όρισες στην κουβέντα μας, "έπαιξα" λίγο με το συνημμένο σου αλλά δεν κατάφερα να φτάσω στο επιθυμητό αποτέλεσμα. Σχεδόν πάντα μου έδινε αποκλίσεις έως και 0,60€ (πράγμα που δεν μας βολεύει). Εάν για παράδειγμα δώσουμε το πόσο 1.087,63 μας δίνει απόκλιση έως 0,09€ ενώ θα μπορούσε να χρησιμοποιήσει τα ποσά: 544,17 € 257,13 € 125,97 € 72,96 € 30,50 € 30,26 € 26,64 € όπως το παράδειγμα του Τάσου. Θα το κοιτάξω καλύτερα και αν έχω προτάσεις θα σου πω. Σε ευχαριστώ πολύ για το χρόνο σου. ![]() Καλημέρα σε όλους, Μάρω |
|
#29
| |||
| |||
|
Καλησπέρα στην παρέα Γιάννη, με χαρά βλέπω να συμμετέχεις στο γοητευτικό και ζόρικο πρόβλημα της Μάρως. Έκανα κάποιες δοκιμές αθροίζοντας κάποιους αριθμούς και βάζοντας ως στόχο το άθροισμά τους. Το πρόγραμμα στην πλειοψηφία των περιπτώσεων έδωσε αποτέλεσμα άμεσα και κοντά στο στόχο. Διαπίστωσα ότι δε χρησιμοποιούσε υποχρεωτικά τους αριθμούς που άθροιζα, γι’ αυτό υπήρχαν και οι μικροαποκλίσεις. Έπεσα όμως και σε μία περίπτωση που προβληματίζει. Ενώ υπάρχουν τα ποσά 30,50 και 30,26 (30,50 + 30,26 = 60,76), αν θέσουμε ως στόχο το άθροισμα τους (60,76) παίρνουμε αποτέλεσμα 57,47 (=45,42 + 12,05). Φιλικά/Γιώργος |
|
#30
| |||
| |||
|
Γειά σε όλους σας, προσπάθησα κι εγώ να ψάξω για μια καλή λύση. Ουσιαστικά ακολούθησα την τακτική του Τάσου (concept), θέλησα να αποφύγω όμως την υλοποίηση με recursion και να δώσω μια iterative λύση (με loops). Το θέμα με μια συνάρτηση, η οποία καλεί τον εαυτό της, είναι, ότι «κοστίζει» πολύ. Επιπλέον το βάθος είναι διαφορετικό σε κάθε compiler. Το τελευταίο τεστ έδειξε ότι καταφέρνει με 20.000 τιμές μέσα σε λιγότερο από 10 δευτερόλεπτα να δείξει τα 50 καλύτερα αθροίσματα. Ο κώδικας δεν είναι γραμμένος με VBA, αλλά με C# και ενσωματωμένος στο αρχείο του Excel. Στο μήνυμα αυτό επισυνάπτω την εγκατάσταση (Setup) του αρχείου, διότι η λύση απαιτεί:
Σε περίπτωση που δεν έχετε κάτι από τα παραπάνω, η εγκατάσταση τα κατεβάζει αυτόματα, οπότε εγκαθίστανται και αυτά. Η απεγκατάσταση γίνεται ως γνωστόν από τον πίνακα ελέγχου. Το αρχείο Excel έχει ακριβώς ένα φύλλο (BestFit), όπου περιμένει τις τιμές. Οι τιμές μπορούν να γραφούν σε μια στήλη, σε μια σειρά, σε περισσότερες στήλες και σειρές, σε περισσότερα areas (σύνθετες επιλογές). Οι τιμές μπορούν να είναι και συναρτήσεις. Το πλήθος των κελιών που αποτελεί τα επιμέρους ποσά, πρέπει να είναι επιλεγμένο (selected). Στη συνέχεια επιλέγετε το «Mdragon-ribbon», όπου εκεί καθορίζετε τη τιμή για το επιθυμητό άθροισμά (GOAL), το όριο ανοχής (EPSILON), και πόσα αποτελέσματα να δείξει (KEEP).Αν επιλέξετε π.χ. 5, τότε δείχνει τα 5 καλύτερα αποτελέσματα (όχι τα 5 πρώτα). Έπειτα START. Τα αποτελέσματα τα γράφει ανοίγοντας καινούργιο φύλλο εργασίας. Σε περίπτωση που υπάρχει είδη ένα φύλλο με αποτελέσματα, ανοίγει καινούργιο φύλλο εργασίας και το αριθμεί. Όποιος ενδιαφέρεται, ας κάνει μερικές δοκιμές. Φιλικά Ανδρέας |
![]() |
| Ετικέτες |
| recursion, vba |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
| ||||
| Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
| [Συναρτήσεις] Άθροιση ποσότητας ανά κωδικό. | nikosjc | Excel - Ερωτήσεις / Απαντήσεις | 3 | 02-04-14 13:36 |
| [ Συναρτήσεις ] ΑΘΡΟΙΣΗ ΧΡΟΝΟΥ | vangelis67 | Access - Ερωτήσεις / Απαντήσεις | 4 | 29-11-11 15:58 |
| [Συναρτήσεις] ΑΘΡΟΙΣΗ ΣΤΟ EXCEL | alatis | Excel - Ερωτήσεις / Απαντήσεις | 2 | 04-10-11 15:46 |
| [Γενικά] Ευρεση και αθροιση δεδομένων | misirlis | Excel - Ερωτήσεις / Απαντήσεις | 2 | 08-05-11 17:05 |
| [Γενικά] αθροιση | misirlis | Excel - Ερωτήσεις / Απαντήσεις | 11 | 11-01-11 05:17 |
Η ώρα είναι 21:47.

και έκφρασα σε επόμενο μήνυμα μου.



.

αφήνοντας το ανοιχτό για οποιαδήποτε προγραμματιστική βελτίωση /επέκταση.
) 

Μάρω! 

Αλλαγή σε γραμμικό τρόπο

