Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Excel > Excel - Ερωτήσεις / Απαντήσεις > [Συναρτήσεις] Άθροιση υπό όρους

Excel - Ερωτήσεις / Απαντήσεις Ότι έχει σχέση με συναρτήσεις, μορφοποίηση, εκτυπώσεις γραφήματα κτλ.

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #21  
Παλιά 19-12-10, 01:27
Το avatar του χρήστη gr8styl
Super Moderator
Όνομα: Θανάσης Στυλιανίδης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-10-2009
Περιοχή: Βρυξέλλες, Βέλγιο
Μηνύματα: 758
Προεπιλογή

Καλησπέρα/Καλημέρα σε όλους και όλες.

Επειδή δεν μου αρέσουν οι προσωπικές διαμάχες θα περιοριστώ στο να πω ότι:
όταν εγώ ρώτησα όχι μόνο για το δάσος:
"Δηλαδή το αρχικό ποσό δεν έχει σχέση με τις εργασίες ?"
ρώτησα και για το δέντρο:
"Γίνονται εργασίες χωρίς να υπάρχουν χρήματα ?"
και ζήτησα να μάθω ακόμα και το είδος του δέντρου:
"πιστοποίηση = ???"

Δεν πήρα συγκεκριμένη απάντηση σε κανένα από τα 3 ερωτήματα και ερμήνευσα την απάντηση σαν:

"δεν μας γ..... Αν μπορείς δώσε μου την λύση σε αυτό που ζητάω και μην με σκοτίζεις."
Γεγονός που με δυσαρέστησε και έκφρασα σε επόμενο μήνυμα μου.

Μάλλον πρόκειται για παρεξήγηση (και ίσως λάθος ερμηνεία της απάντησης) που όμως νομίζω ξεκαθάρισε.

Τέλος καλό όλα καλά βρέθηκε κάποια λύση και αυτό μετράει.

Πάμε παρακάτω.

Θέτω λοιπόν νέο διπλό ερώτημα:

α) Χρειάζεται να συνεχίσουμε το ψάξιμο; Μιας και η πολύ καλή λύση του Τάσου "δεν ικανοποιεί πλήρως" το ζητούμενο όπως το προσδιόρισε τόσο ο ίδιος λέγοντας "σαν αρχή..." αλλά και ο Ανδρέας λέγοντας ότι "έχει βρει την πρώτη λύση" και όχι απαραίτητα την ιδανική.
(Δηλαδή αν έχουμε σαν αριθμούς τους αριθμούς από 1-9 και ψάχνουμε αποτέλεσμα 9 θα μας δώσει σαν λύση το 1, 2, 6 και όχι το 9 που όπως είπε η Μάρω είναι το επιθυμητό αποτέλεσμα.
Με άλλα λόγια το ποια λύση θα πάρουμε με το κώδικα του Τάσου εξαρτάται από το πως είναι καταχωρημένοι οι αριθμοί μας. Ο κώδικας δεν λαμβάνει καθόλου υπόψιν το πόσοι αριθμοί συμμετέχουν στο αποτέλεσμα.
Μια ταξινόμηση κατά αύξουσα σειρά (δυνατότητα που μας δίνει ο Τάσος με το checkbox) νομίζω θα μας δώσει πάντα την λύση με το μεγαλύτερο πλήθος αν δεν κάνω λάθος. Το αντίστροφο δηλαδή μια ταξινόμηση με φθίνουσα σειρά δεν νομίζω ότι θα μας δώσει την λύση με το μικρότερο πλήθος.
)
Για να βρούμε δηλαδή την ιδανική λύση πρέπει να εξετάσουμε όλους τους συνδυασμούς όπως έχω ήδη πει.

ή β) θεωρούμε ότι έχει καλυφθεί το θέμα; Άρα πάμε για άλλα.

Γεγονός είναι ότι το συγκεκριμένο ερώτημα έφερε στην επιφάνεια δύο νέα για το φόρουμ μας ζητήματα:
1) Επίλυση (Solver) στο excel και 2) χρήση recursion σε κώδικα VBA.
όπου ίσως θα ήταν σκόπιμο να ανοιχτούν σαν νέα θέματα αν υπάρχει ανάγκη.

Φιλικά
Θανάσης
Απάντηση με παράθεση
  #22  
Παλιά 19-12-10, 19:28
Όνομα: Μάρω
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 09-03-2010
Περιοχή: Αθήνα
Μηνύματα: 287
Προεπιλογή

Συμφωνώ μαζί σου Θανάση στο θέμα της ταξινόμησης.
Η λύση του Τάσου με γλύτωσε πάντως από ένα μεγάλο πονοκέφαλο.
Δεν είμαι πλεονέκτρα αλλά αν υπήρχε λύση για μικρότερο πλήθος δεν θα έλεγα όχι .
Δυστυχώς οι γνώσεις μου δεν φτάνουν μέχρι εκεί για να μπορώ να βοηθήσω παραπάνω.



Την καλησπέρα μου,
Μάρω
Απάντηση με παράθεση
  #23  
Παλιά 20-12-10, 00:56
Το avatar του χρήστη gr8styl
Super Moderator
Όνομα: Θανάσης Στυλιανίδης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-10-2009
Περιοχή: Βρυξέλλες, Βέλγιο
Μηνύματα: 758
Προεπιλογή

Καλησπέρα/ καλημέρα σε όλους και όλες

Φίλε Τάσο,
υπάρχει κάποιο λάθος στο 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  
Παλιά 20-12-10, 09:30
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Φίλοι μου καλημέρα!

Το αρχικό συνημμένο που είχα ανεβάσει φτιάχτηκε "στα γρήγορα" λόγω ώρας (δείτε την ώρα του
μηνύματος...) και φόρτου εργασίας αφήνοντας το ανοιχτό για οποιαδήποτε προγραμματιστική βελτίωση /επέκταση.
Στο παρακάτω συνημμένο πρόσθεσα κάποιες λεπτομέρειες, λαμβάνοντας υπ όψη μου τις παρατηρήσεις σας.
Φυσικά όποιος θέλει μπορεί να το μετατρέψει/βελτιώσει ή να κάνει τις παρατηρήσεις του.

Να είστε καλά

Τάσος
Συνημμένα Αρχεία
Τύπος Αρχείου: xls xl_CombineNumbers.xls (81,0 KB, 29 εμφανίσεις)
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #25  
Παλιά 20-12-10, 19:19
Το avatar του χρήστη gr8styl
Super Moderator
Όνομα: Θανάσης Στυλιανίδης
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-10-2009
Περιοχή: Βρυξέλλες, Βέλγιο
Μηνύματα: 758
Προεπιλογή

Φίλε Τάσο,
Το πρόβλημα που περιέγραψα στο προηγούμενο 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  
Παλιά 20-12-10, 22:55
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.035
Προεπιλογή

Φίλε Θανάση καλησπέρα!
Έχεις δίκιο με τη γραμμή "ccrMatch = ccrMatch - ArrItems(x)"

Στην αρχή, όταν έκανα τις δοκιμές μου το είχα κι εγώ έτσι (είναι λογικό).
Όμως λαμβάνοντας υπόψη μου:
Παράθεση:
1. Την μέχρι και 500% αύξηση χρόνου που προκαλεί η γραμμή αυτή κατά την εκτέλεση του Script.

2. Τον λόγο δημιουργίας/ύπαρξης αυτού του αρχείου.
Δεν φτιάχτηκε για να υπολογίζει 5 - 10 αριθμούς αλλά εκατοντάδες, ακόμα και χιλιάδες, κάτι που είναι αδύνατο για τον ανθρώπινο νου.
(που όπως φαίνεται και στην πράξη το κάνει σωστά!)
αποφάσισα να αλλάξω την "ccrMatch...." σε Exit for!

Σε κάθε άλλη περίπτωση θα χρησιμοποιούσα την "ccrMatch...."

Καλό βράδυ!

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #27  
Παλιά 21-12-10, 02:53
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Γεια και χαρά στη παρέα!

Μιας και (όπως λέτε) το θέμα βρίσκεται ακόμη στο "εργαστήριο", αν έχετε ακόμη όρεξη,
δείτε στο συνημμένο και μια δική μου (για την ώρα όχι και τόσο έξυπνη) πρόταση.

Χωρίς να έχω δει τις τελευταίες εξελίξεις, είχα σκεφτεί και εγώ τη χρήση αναδρομής (προφανώς Τάσο είχαμε συνάντηση πνευμάτων πάλι )
μιας και η σειριακή υλοποίηση τέτοιων περιπτώσεων μοιάζει αρκετά δύσκολη (αν όχι αδύνατη).

Η συνάρτηση SumNums στο συνημμένο, αθροίζει όσο γίνεται πιο κοντά στον στόχο τα διαθέσιμα ποσά, επαναλαμβάνει τη διαδικασία
καλώντας τον εαυτό της κάθε φορά με διαφορετική θέση εκκίνησης και στην επιστροφή της συγκρίνονται τα αθροίσματα
και επιλέγεται το μεγαλύτερο άρα και πιο κοντινό στο στόχο.
Για την ώρα, τα αθροίσματα που επιστρέφει είναι πάντα μικρότερα ή ίσα του στόχου.
(Αν φυσικά υπάρχει διαθέσιμο ποσό μικρότερο ή ίσο του στόχου.)

Όταν την έγραφα, είχα στο μυαλό μου τα διαθέσιμα ποσά σε φθίνουσα ταξινόμηση και νομίζω πως έτσι δουλεύει και καλύτερα.

Στην περιοχή "Ομάδα1" του μοναδικού φύλλου έχει εισαχθεί η προσαρμοσμένη συνάρτηση χρήστη (UDF) SumTarget
ως τύπος πίνακα (Ctrl+Shift+Enter) πολλαπλών κελιών η οποία χρησιμοποιεί τη συνάρτηση SumNums
και επιστρέφει τα ποσά που επιλέχθηκαν για το άθροισμα-στόχο1.
Στις υπόλοιπες ομάδες ο τύπος λαμβάνει υπόψη τα ποσά που έχουν χρησιμοποιηθεί στις προηγούμενες ομάδες
ώστε να αποφευχθεί η επιλογή ενός διαθέσιμου ποσού άνω της μιας φοράς.

Αν δεν βαριέστε λοιπόν, κάντε μερικές δοκιμές, και αν προκύψουν, θέστε και τα σχόλια σας.

Ομολογώ πως, όπως αυτό της βέλτιστης κοπής, έτσι και αυτό εδώ, είναι ένα πάρα πολύ
ενδιαφέρον και προκλητικό για την κοινότητα του φόρουμ θέμα!
Συνεπώς, δεν έχω παρά να ευχαριστήσω θερμά τη Μάρω που το έθεσε. Μάρω!

Αν λοιπόν βρεθεί η βέλτιστη λύση για το άθροισμα βάσει στόχου και βελτιωθεί η λύση της βέλτιστης κοπής,
τότε θα ανοίξουμε και ένα θέμα για τη συμμετρική κατανομή φορτίων σε τριφασικό δίκτυο.

Εις το επανιδείν λοιπόν!
Γιάννης
Συνημμένα Αρχεία
Τύπος Αρχείου: zip SumToTarget.zip (19,9 KB, 15 εμφανίσεις)
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #28  
Παλιά 21-12-10, 12:18
Όνομα: Μάρω
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 09-03-2010
Περιοχή: Αθήνα
Μηνύματα: 287
Προεπιλογή

Γιάννη καλώς όρισες στην κουβέντα μας,
"έπαιξα" λίγο με το συνημμένο σου αλλά δεν κατάφερα να φτάσω στο επιθυμητό αποτέλεσμα.
Σχεδόν πάντα μου έδινε αποκλίσεις έως και 0,60€ (πράγμα που δεν μας βολεύει).
Εάν για παράδειγμα δώσουμε το πόσο 1.087,63 μας δίνει απόκλιση έως 0,09€ ενώ θα μπορούσε
να χρησιμοποιήσει τα ποσά:
544,17 €
257,13 €
125,97 €
72,96 €
30,50 €
30,26 €
26,64 €
όπως το παράδειγμα του Τάσου.
Θα το κοιτάξω καλύτερα και αν έχω προτάσεις θα σου πω.
Σε ευχαριστώ πολύ για το χρόνο σου.


Καλημέρα σε όλους,
Μάρω
Απάντηση με παράθεση
  #29  
Παλιά 21-12-10, 19:06
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα στην παρέα

Γιάννη, με χαρά βλέπω να συμμετέχεις στο γοητευτικό και ζόρικο πρόβλημα της Μάρως.
Έκανα κάποιες δοκιμές αθροίζοντας κάποιους αριθμούς και βάζοντας ως στόχο το άθροισμά τους. Το πρόγραμμα στην πλειοψηφία των περιπτώσεων έδωσε αποτέλεσμα άμεσα και κοντά στο στόχο. Διαπίστωσα ότι δε χρησιμοποιούσε υποχρεωτικά τους αριθμούς που άθροιζα, γι’ αυτό υπήρχαν και οι μικροαποκλίσεις.
Έπεσα όμως και σε μία περίπτωση που προβληματίζει.
Ενώ υπάρχουν τα ποσά 30,50 και 30,26 (30,50 + 30,26 = 60,76), αν θέσουμε ως στόχο το άθροισμα τους (60,76) παίρνουμε αποτέλεσμα 57,47 (=45,42 + 12,05).

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #30  
Παλιά 23-12-10, 00:18
Όνομα: Ανδρέας
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 06-12-2010
Περιοχή: Θεσσαλονίκη
Μηνύματα: 17
Προεπιλογή

Γειά σε όλους σας,

προσπάθησα κι εγώ να ψάξω για μια καλή λύση.

Ουσιαστικά ακολούθησα την τακτική του Τάσου (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.

Τα αποτελέσματα τα γράφει ανοίγοντας καινούργιο φύλλο εργασίας. Σε περίπτωση που υπάρχει είδη ένα φύλλο με αποτελέσματα, ανοίγει καινούργιο φύλλο εργασίας και το αριθμεί.

Όποιος ενδιαφέρεται, ας κάνει μερικές δοκιμές.

Φιλικά
Ανδρέας
Συνημμένα Αρχεία
Τύπος Αρχείου: zip mdragon_solution.zip (658,0 KB, 13 εμφανίσεις)
Απάντηση με παράθεση
Απάντηση στο θέμα

Ετικέτες
recursion, vba


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός 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.