Εμφάνιση ενός μόνο μηνύματος
  #5  
Παλιά 11-03-12, 12:03
Το avatar του χρήστη Tasos
Tasos Ο χρήστης Tasos δεν είναι συνδεδεμένος
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.249
Προεπιλογή

Καλημέρα σε όλους!

Φίλε Μάνο Συγχαρητήρια! Αν και αρχάριος, τα πας πολύ καλά με την VBA!

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

1. Ο Α/Α (που παίζει το ρόλο του μοναδικού αριθμού για κάθε εγγραφή) Θα πρέπει να είναι σταθερός αριθμός.
Δεν έχει νόημα ο Α/Α να προκύπτει από τύπο αφού σε μια ταξινόμηση του πίνακα δεν ακολουθεί τα δεδομένα όπως θα έπρεπε.
Εκτός αυτού, μετά από κενή γραμμή ξεκινά την αρίθμηση από το 1.

2. Η λύση με την ημερομηνία που χρησιμοποίησες είναι καλή. Συνιστάται για αρχεία που δεν περιέχουν VBA όμως.
Αφού εσύ ήδη χρησιμοποιείς VBA, θα ήταν πιο πρακτικό πιο αξιόπιστο και πιο αποδοτικό για την εφαρμογή
αν η ημερομηνία και o A/A καταχωρούνταν προγραμματιστικά και όχι με τύπους + ρυθμίσεις επαναληπτικού υπολογισμού.

3. Τα ονόματα Πίνακας1, Πίνακας2, Πίνακας3 κτλ. δε σε διευκολύνουν στον προγραμματισμό.
Είναι πιο απλό αντί για Πίνακας6 να χρησιμοποιείς GreenTable (ο πράσινος πίνακας που αναφέρεις στο συνημμένο σου).
Θα κερδίσεις πολλά αν αφιερώσεις 5 λεπτά για να τροποποιήσεις τα ονόματα του βιβλίου και να τους δώσεις νόημα για να τα βρίσκεις ευκολότερα.

4. Σε περιπτώσεις όπως τη δική σου όπου μεταφέρονται μόνο οι τιμές μιας περιοχής σε μια άλλη, η μέθοδος αντιγραφής – επικόλλησης με VBA δεν χρειάζεται.
Για παράδειγμα, η γραμμή Range(B1).Value = Range(A1).Value αρκεί (είναι και γρηγορότερη) για να μεταφερθούν τα δεδομένα του κελιού Α1 στο κελί Β1.

5. Το συνημμένο παράδειγμα του μηνύματος μου έχει μέγεθος κάτω από 50 KB
παρόλο που περιέχει περισσότερα στοιχεία από το αρχικό σου.

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

6. Αν η ημερομηνία και o A/A καταχωρηθεί προγραμματιστικά θα χρειαστεί να μεταφέρεις μόνο τις γραμμές του πίνακα που περιέχουν δεδομένα

Αγαπητέ Θανάση (Thanosp), βρίσκω σωστή τη μέθοδο ListObject.ListRows.Add… που χρησιμοποιείς με τη διαφορά ότι είναι χαρακτηριστικά αργή αφού σε κάθε της
εκτέλεση ωθεί ολόκληρο το φύλλο (από τον πίνακα και κάτω) προς τα κάτω (κάνει Insert).

Αν χρησιμοποιήσεις ListObject.Resize (μια φορά για όλες τις νέες γραμμές που θα εισαχθούν) αντί για ListObject.ListRows.Add αυξάνεις κατά πολύ την
ταχύτητα εκτέλεσης.

Επίσης το αντικείμενο Select δεν ενδείκνυται επειδή σχετίζεται άμεσα με την απόδοση γραφικών του συστήματος και συνεπώς καθυστερεί την εκτέλεση του
κώδικα.
Εκτός αυτού προκαλεί αναταραχές στην οθόνη.

Γενικά η χρήση του αντικειμένου Select στο 99,9% των περιπτώσεων μπορεί και πρέπει να αποφεύγεται.
Μπορείς να αναφερθείς σε ένα αντικείμενο ListObject γνωρίζοντας μόνο το όνομα του

Για παράδειγμα:
Η έκφραση Range("Πινακας3"). ListObject μας επιστρέφει το αντικείμενο ListObject με το όνομα Πινακας3.
Ούτε χρειάζεται να επιλέξεις το φύλλο που περιέχει έναν πίνακα για να κάνεις κάποια εργασία πάνω σ αυτόν προγραμματιστικά.

Επισυνάπτω ένα παράδειγμα που υλοποιεί τα αναγραφόμενα.

Στο παράδειγμα αυτό έχω αλλάξει τα ονόματα ορισμένων πινάκων για να είναι ο κώδικας πιο κατανοητός.

Ελπίζω να μην σας κούρασα!

Φιλικά

Τάσος
Συνημμένα Αρχεία
Τύπος Αρχείου: xlsm Manos.xlsm (42,1 KB, 133 εμφανίσεις)
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών

Τελευταία επεξεργασία από το χρήστη Tasos : 13-03-12 στις 08:58. Αιτία: Τροποποίηση στον κώδικα VBA (αντιγραφή φιλτραρισμένου πίνακα)
Απάντηση με παράθεση