Excel samples - Χρήσιμα αρχεία & παραδείγματα Αρχεία Ms-Excel διαθέσιμα για τα μέλη του Forum. |
![]() |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
![]() Δημιουργός: Γιώργος Καπετανόπουλος (Kapetang) Ημερομηνία: 13/8/2016 ------------------------------------------------------------------------------------------- Σύγκριση περιοχών Αρκετές φορές χρειάζεται να συγκρίνουμε τα στοιχεία μιας περιοχής κελιών με τα στοιχεία μιας άλλης περιοχής (βασική περιοχή) και να βρούμε τα στοιχεία της που υπάρχουν ή δεν υπάρχουν στη άλλη περιοχή (βασική περιοχή). Μια λύση στο παραπάνω πρόβλημα δίνεται, με κώδικα (VBA), στο συνημμένο αρχείο. Κάθε περιοχή, ανεξάρτητα από την άλλη, μπορεί να έχει μορφή γραμμής, στήλης ή ορθογωνίου. Συνεπώς μπορεί να έχουμε, με βάση τη μορφή των περιοχών, 9 συνδυασμούς. Ο κώδικας αντιμετωπίζει και τις 9 περιπτώσεις. Επίσης οι περιοχές μπορεί να είναι στο ίδιο ή σε διαφορετικά φύλλα. Για τον ορισμό κάθε περιοχής ο χρήστης θα πρέπει να δώσει τα κελιά που την ορίζουν στη μορφή C2:L100 (προσοχή οι χαρακτήρες είναι αγγλικοί) και το όνομα του φύλλου που την περιέχει. Το αποτέλεσμα εξάγεται σε στήλη, την οποία μπορεί να ορίσει ο χρήστης δίνοντας το πάνω κελί στη μορφή C3 και το όνομα του φύλλου που την περιέχει. Τα παραπάνω στοιχεία συμπληρώνονται σε μια φόρμα χρήστη (User Form). Στη φόρμα θα πρέπει να τσεκάρουμε ή να καθαρίσουμε ένα CheckBox, αν θέλουμε τα στοιχεία που ανήκουν στη βασική περιοχή ή αυτά που δεν ανήκουν. Η μέθοδος, σε γενικές γραμμές, εκτελεί τα παρακάτω βήματα: 1) Αντιγράφει τα στοιχεία της βασικής περιοχής σε ένα μονοδιάστατο Array Z 2) Ταξινομεί τα στοιχεία του Array Z 3) Εκτελεί δυαδική αναζήτηση στο ταξινομημένο Array, για κάθε στοιχείο της προς σύγκριση περιοχής και δημιουργεί ένα Array X με τα στοιχεία που ικανοποιούν τους όρους αναζήτησης (ανήκουν ή δεν ανήκουν στη βασική περιοχή). 4) Εμφανίζει το αποτέλεσμα. Η μέθοδος εφαρμόζεται σε περιοχές που περιέχουν κείμενο, αριθμούς ή ημερομηνίες και πέρα από την ευελιξία της, είναι και εξαιρετικά γρήγορη. Σημειώνω ότι, στον υπολογιστή μου, για τη σύγκριση των στηλών που υπάρχουν στο φύλλο [Σύγκριση ...], χρειάζεται 0,5 δευτερόλεπτα, ενώ η προηγούμενη πρότασή μου και του Σπύρου, 14 και 74 δευτερόλεπτα αντίστοιχα. Για τις προηγούμενες προτάσεις κλικ: http://www.ms-office.gr/forum/excel-...si-stilon.html Τελευταία επεξεργασία από το χρήστη kapetang : 14-08-16 στις 01:15. Αιτία: Αλλαγή συνημμένου (Πιο αξιόπιστη διάκριση αριθμών/ημερομηνιών) |
#2
|
![]()
Όταν «χτίζουμε» ένα κώδικα, μας απασχολούν πολλά πράγματα... Ένα από αυτά είναι και η ταχύτητα... Σημαντικό μεν, αλλά αυτό, είναι το τελευταίο που θα μας απασχολήσει και θα το βελτιώσουμε στο τέλος... Τι να το κάνω αν έχω έναν γρήγορο κώδικα, αλλά να εξαρτώμαι, από το αν ο χρήστης κάνει λάθη; Πρέπει λοιπόν, πριν απ' όλα να απαγορεύσω κάποια πράγματα στο χρήστη και να τον διευκολύνω, σε κάποια άλλα, ώστε να «τρέξει» καλά ο κώδικάς μου. Για παράδειγμα, δεν πρέπει να χρησιμοποιούμε, το φυσικό όνομα φύλλων αλλά το κωδικό. Μπορεί να έχω φροντίσει στον κώδικα να «παίρνω» πάντα τα φυσικά ονόματα των υφιστάμενων φύλλων αλλά αυτό δεν είναι ότι καλύτερο... Το σημαντικό όμως, σε τέτοια έργα, είναι να μην επιτρέψω στον χρήστη να πληκτρολογήσει περιοχές. Το «γράφω περιοχή μέσα στο textbox, με αυτή την μορφή κλπ και στα αγγλικά...» απλά δεν υπάρχει... Στο βιβλίο που ακολουθεί, υπάρχει ένα υπόδειγμα φόρμας, όπου ο χρήστης: 1. Δεν μπορεί, να πληκτρολογήσει περιοχή... 2. Δεν μπορεί, να τροποποιήσει περιοχή... Έχει την απλή και σωστή δυνατότητα, να επιλέξει περιοχή, να την σβήσει αν έκανε λάθος και να ξανά επιλέξει περιοχή, σε οποιοδήποτε φύλλο του βιβλίου... Περισσότερα στο βιβλίο. Σημειώσεις: 1 Η εμφάνιση της φόρμας, γίνεται με διπλό κλικ στο a1 κελί κάθε φύλλου... Αυτό είναι δική μου επιλογή. Ο καθ' ένας, μπορεί να εμφανίζει την φόρμα, με όποιο τρόπο θέλει. Σε ένα real έργο, θα το έβαζα στην κορδέλα, με xml. 2 Η φόρμα, «δείχνει» τρόπο εργασίας και δεν αποτελεί σε καμία περίπτωση τελικό project. |
#3
| |||
| |||
![]()
Ήθελα να παρουσιάσω μια γρήγορη και ευέλικτη μέθοδο, σύγκρισης περιοχών και επικεντρώθηκα βασικά στον κώδικα. Χαίρομαι που η διασύνδεση χρήστη (User Form) προκάλεσε τόσο "ντόρο". Πάντως βρίσκω εποικοδομητική την πρόταση του Σπύρου, για τη βελτίωση της φόρμας εισαγωγής στοιχείων (User Form) και ίσως τη χρησιμοποιήσω σε κάποια αναβάθμιση. |
#4
| |||
| |||
![]()
Στο συνημμένο αρχείο, εκτός από την παλιά φόρμα UserForm1, στην οποία η εισαγωγή των περιοχών των κελιών γίνεται με πληκτρολόγηση, πρόσθεσα και την UserForm2,που επιτρέπει την εισαγωγή των περιοχών με επιλογή. Σημείωση: Παρατήρησα στη φόρμα του Σπύρου, αν επιλέξουμε μια περιοχή και στη συνέχεια ενεργοποιήσουμε ένα άλλο φύλο (χωρίς να κάνουμε επιλογή), όταν μεταφέρουμε τα στοιχεία στη οριστική θέση θα καταχωρηθεί λάθος φύλλο. Τελευταία επεξεργασία από το χρήστη kapetang : 14-08-16 στις 15:16. |
#5
|
![]()
Είπα... «2 Η φόρμα, «δείχνει» τρόπο εργασίας και δεν αποτελεί σε καμία περίπτωση τελικό project.» Χαίρομαι που υιοθετήθηκε...η ιδέα μου! |
#6
| |||
| |||
![]()
Έχω τη γνώμη ότι όποιος παρουσιάζει κάποιο θέμα στο φόρουμ έχει τη δυνατότητα αναβάθμισής του. Συνεπώς, είναι αυτονόητο, οποιαδήποτε κριτική ή επισήμανση αφορά την τρέχουσα έκδοση του θέματος και όχι το άγνωστο τελικό προϊόν. |
#7
| |||
| |||
![]()
Όταν προτάθηκε η εισαγωγή των περιοχών με επιλογή, τη θεώρησα, χωρίς να το πολυσκεφθώ, καλή ιδέα. Τώρα, για τους παρακάτω λόγους, διατηρώ πολλές επιφυλάξεις: 1. Οι φόρμες που επιτρέπουν την εισαγωγή με επιλογή, υλοποιούνται ως μη αποκλειστικές (όχι Modal). Αυτό σημαίνει ότι, ενώ είναι ανοιχτή η φόρμα και είμαστε στο στάδιο εισαγωγής των περιοχών, ο χρήστης μπορεί να κάνει οποιαδήποτε ενέργεια. Θα μπορούσε για παράδειγμα να διαγράψει φύλλα εργασίας. Ένα πιθανό σενάριο: Ο χρήστης καταχωρεί όλες τις περιοχές στη φόρμα, στη συνέχεια διαγράφει ένα φύλλο από τα καταχωρημένα και ακολούθως κλείνει τη φόρμα, για να γίνει επεξεργασία των καταχωρήσεων. Ο κώδικας που θα επεξεργαστεί τις καταχωρημένες περιοχές, αν δεν υπάρχει σχετική πρόβλεψη, δε θα βρει το διαγραμμένο φύλλο και θα «χτυπήσει». 2. H Microsoft, παρέχει για την εισαγωγή περιοχών, τη μέθοδο Application.InputBox(Type:=8). Στη φόρμα εισαγωγής που εμφανίζεται, επιτρέπει εισαγωγή μόνο με πληκτρολόγηση στο σχετικό πλαίσιο κειμένου ή επιλογή με το ποντίκι. Έκρινε, μάλλον, ότι μια μεγαλύτερη ελευθερία ήταν επικίνδυνη. |
#8
|
![]()
Η Microsoft, δεν δημιούργησε τα InputBoxes, ως μια πιο ασφαλή μέθοδο εισαγωγής. Ο σκοπός είναι άλλος και φυσικά τα InputBoxes, έχουν πάρα πολλά «τρωτά» σημεία. Να σημειώσουμε, ότι με μία φόρμα, μπορούμε να κάνουμε κι άλλες ενέργειες, που δεν μπορεί σε καμία περίπτωση, να κάνει ένα InputBox. Οι μη αποκλειστικές φόρμες, παρ' όλο που επιτρέπουν στο χρήστη, να κάνει άλλες ενέργειες παραμένουν ορατές στο παράθυρο... Το σενάριο αυτό δεν υπάρχει... Γιατί; Έχω δεδομένα, σε τρία φύλλα για τους πελάτες μου, τους προμηθευτές και τα προϊόντα μου. Κάθε φύλλο, έχει δεδομένα που τα «έφτιαξα» με κόπο και έχουν από 500 έως 2000 γραμμές το καθένα και ανάλογες στήλες, πχ 10-20. Όσο κι αν λέμε, ότι πρέπει να προστατέψουμε τον χρήστη, από λάθη χειρισμού, με τον κώδικά μας, δεν υπάρχει στον πλανήτη, νοήμων χρήστης, που θα διαγράψει ένα φύλλο με δεδομένα, ενώ έχει ανοιχτή, φάτσα κάρτα μια φόρμα, στο ενεργό παράθυρο... Αν το θεωρεί κανείς πιθανό, ας το αποκλείσει, σε κάποιον έλεγχο του κώδικα... Το σίγουρο είναι, ότι θα αποφύγουμε τα πολλά και σοβαρά ελαττώματα, ενός InputBox, (και στις δύο μορφές του) ανεξάρτητα από τις ιδιότητες ή την χρήση του... |
#9
| |||
| |||
![]()
Δεν είμαι οπαδός του InputBox, για εισαγωγή περιοχών, λόγω των περιορισμών που επιβάλει. Ωστόσο, για μένα, το ερώτημα παραμένει. Γιατί η Microsoft επέβαλε τους αντιπαθείς περιορισμούς και δεν υλοποίησε το InputBox ως μη αποκλειστική φόρμα; Οι ενέργειες των χρηστών μπορεί να είναι και τυχαίες….. Οι προγραμματιστές, με κάποια χρόνια στη δουλειά, έχουν δει ενέργειες χρηστών που δεν τις φαντάζονταν. Τελείως παράλογες…. Γενικά, οι προγραμματιστές, θεωρούν τους χρήστες απρόβλεπτους και αναμένουν τα «χειρότερα». Εδώ έρχεται ο κώδικας για να κλείσει τις "τρύπες" της διασύνδεσης…. Τελευταία επεξεργασία από το χρήστη kapetang : 20-08-16 στις 14:33. Αιτία: αντί τις => της |
![]() |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
| ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
Δημιουργία περιοχών με «εμφάνιση» πίνακα. | Spirosgr | Excel - Tips & Tricks | 0 | 05-09-15 18:57 |
[Γενικά] Σύγκριση και μεταφορά | GG10482 | Excel - Ερωτήσεις / Απαντήσεις | 7 | 22-05-15 13:38 |
[Συναρτήσεις] Σύγκριση Δεδομένων | nvb | Excel - Ερωτήσεις / Απαντήσεις | 2 | 09-12-13 08:38 |
Σύγκριση πινάκων | sakis | Access - Ερωτήσεις / Απαντήσεις | 6 | 11-03-13 22:32 |
[Συναρτήσεις] Σύγκριση Τιμών | ΤΖΙΜΗΣ | Excel - Ερωτήσεις / Απαντήσεις | 3 | 16-09-12 20:34 |
Η ώρα είναι 16:21.