Σύνθετο Φίλτρο. Αντιγραφή σε άλλη θέση.

Όταν κάνετε χρήση του σύνθετου φίλτρου σε μία βάση δεδομένων, μέσα από το ίδιο φύλλο της βάσης, και ζητήσετε αντιγραφή (μεταφορά) των φιλτραρισμένων δεδομένων (ΦΔ) σε ένα άλλο φύλλο, θα πάρετε από το excel ένα μήνυμα λάθους. Η πρώτη εικόνα παρουσιάζει τα δεδομένα μιας βάσης στην περιοχή A10:F900 του φύλλου “Βάση” , και την περιοχή A1:F9 όπου γράφονται τα κριτήρια.
filter_01
Από το φύλλο “Βάση” όπου υπάρχει η βάση σας, καλέσατε το σύνθετο φίλτρο και ζητήσατε τα ΦΔ να αντιγραφούν (μεταφερθούν) στο κενό “Φύλλο2”.
filter_02
Το excel επέστρεψε το παρακάτω μήνυμα και δεν εκτέλεσε το φιλτράρισμα.
filter_03
Το μήνυμα αυτό (που είναι μάλλον όχι καλά μεταφρασμένο στα Ελληνικά), δίνει την εντύπωση ότι δεν είναι εφικτή η αντιγραφή των ΦΔ σε άλλο φύλλο. Αν το μήνυμα ήταν διατυπωμένο έτσι: “Μπορείτε να αντιγράψετε φιλτραρισμένα δεδομένα σε άλλο φύλλο, μόνο αν το φύλλο αυτό είναι το ενεργό”, ίσως βοηθούσε τον χρήστη να καταλάβει, ότι αυτό που ζητά, θα το επιτύχει αν ξεκινήσει την διαδικασία του φιλτραρίσματος από το φύλλο στο οποίο θέλει να μεταφερθούν τα ΦΔ.
Στο παράδειγμα μας, λοιπόν, θα πρέπει να πάτε στο κενό “Φύλλο2” ώστε αυτό να είναι το ενεργό, και από εκεί θα καλέσετε το σύνθετο φίλτρο. Δέστε την επόμενη εικόνα:
filter_04
Ποιό εύκολα θα δουλέψετε αν δώσετε ονόματα στη βάση και στην χρησιμοποιούμενη περιοχή κριτηρίων.Κάντε εισαγωγή των δύο παρακάτω ονομάτων (με εύρος όλο το βιβλίο εργασία):

Δεδομένα =Βάση!$A$10:$F$900
Κριτήρια =Βάση!$A$1:$F$3

και από το “Φύλλο2” συμπληρώστε τη φόρμα του σύνθετου φίλτρου όπως στη παρακάτω εικόνα:
filter_05
Αν μάλιστα η βάση σας δεν είναι στατική, αλλά συνεχώς νέες εγγραφές προστίθενται σε αυτή, τότε δώστε της ένα δυναμικό όνομα, ώστε να είστε σίγουροι κάθε φορά, ότι οι νέες εγγραφές έχουν λάβει μέρος στο φιλτράρισμα:

Δεδομένα =OFFSET(Βάση!$A$10;0;0;COUNTA(Βάση!$A$10:$A$60000);6)

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

Κριτήρια =OFFSET(Βάση!$A$1;0;0;MAX((Βάση!$A$1:$F$9<>"")*ROW(Βάση!$A$1:$F$9));6)

(Σημείωση: Στους 2 τελευταίους τύπους, ο αριθμός 6 εκφράζει το πλήθος των πεδίων–στηλών)
Αν εκτελείται την εργασία αυτή συχνά, καταγράψτε τη με τον καταγραφέα μακροεντολών. Η καταγραφή είναι πολύ αξιόπιστη, θα πάρετε περίπου αυτό:

Sub Μακροεντολή()
Range("Δεδομένα").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("Κριτήρια"), _
CopyToRange:=Range("A1"), _
Unique:=False
End Sub

Η παραπάνω ρουτίνα εκτελεί το σύνθετο φίλτρο μέσα από οπουδήποτε φύλλο την καλέσετε, και εναποθέτει τα φιλτραρισμένα δεδομένα (ΦΔ) στο φύλλο αυτό. Φροντίστε βέβαια το φύλλο να είναι κενό, διότι κάνει επικάλυψη στοιχείων χωρίς προειδοποίηση. Αν θέλετε τα ΦΔ να μεταφέρονται πάντα στο ίδιο φύλλο, ας πούμε το «Φύλλο2», τότε τροποποιήστε την 4η γραμμή έτσι:

CopyToRange:=Range("Φύλλο2!A1")

Και στην περίπτωση αυτή η μάκρο μπορεί να κληθεί από οπουδήποτε φύλλο, αλλά όπως είπαμε, εξασφαλίζεται η μεταφορά των ΦΔ στο «Φύλλο2». Αυτός, με μακροεντολή, είναι ο μοναδικός τρόπος να ενεργήσετε από ένα φύλλο και τα ΦΔ να μεταφερθούν σε ένα διαφορετικό φύλλο. Χειριστικά, από τα μενού, όπως είδαμε, αυτό δεν γίνεται. Αν ορίσετε την περιοχή αντιγραφής σε ένα διαφορετικό φύλλο από αυτό που βρίσκεστε, θα πάρετε μήνυμα ότι μπορείτε να αντιγράψετε ΦΔ μόνο στο ενεργό φύλλο.

This entry was posted in excel, Μακροεντολές, Φίλτρα, VBA and tagged , , , , . Bookmark the permalink.

5 Responses to Σύνθετο Φίλτρο. Αντιγραφή σε άλλη θέση.

  1. Ο/Η Γιώργος λέει:

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

  2. Ο/Η vioannis λέει:

    Τι πταίει; Γενικά μπορώ να πω για το σύνθετο-άμεσο φιλτράρισμα: α) Στην περιοχή των φίλτρων να έχει συμπεριληφθεί άδεια (χωρίς κανένα κριτήριο) γραμμή β) Το κριτήριο ή ένα από τα κριτήρια είναι ανέφικτο γ) Έχεις επιχειρήσει ένα φιλτράρισμα και πριν το επόμενο δεν έχεις πατήσει το πλήκτρο της απαλοιφής δ) ;
    Για το σύνθετο-σε άλλη θέση τα (α) & (β) της προηγούμενης πρότασης, γ) να επιχειρείς αντιγραφή σε άλλη θέση και η θέση να περιέχει δεδομένα από προηγούμενο φιλτράρισμα. Στην αντιγραφή σε άλλη θέση το πλήκτρο της απαλοιφής δεν ενεργοποιείται, πρέπει να καθαρίσεις την περιοχή εξόδου χειριστικά ή αν δουλεύεις επαναλαμβανόμενα με μακροεντολή να συμπεριλάβεις κώδικα για καθαρισμό της περιοχής δ);

  3. Ο/Η Giorgos λέει:

    Πραγματικά, χωρίς κενά δούλεψε. Και τόσο καιρό δεν μπορούσα να το φανταστώ. Ευχαριστώ πολύ.

  4. Ο/Η ERMIS RAPPAS λέει:

    KALHSPERA PO MENA KANW TN PRAKTIKI MOU KAI EXW ENA ARXEIO ME 95000 EGGRAFES MOU EXOUN DWSI NA XEXORISO KAPOIOES KATIGORIES KAI EXW FTASI TWRA STIS DIPLOEGGRAFES TA OPOIOA EINAI 16 000 KAI EINAI PERASMENES APO DUO KAI 3 FORES I KATHE MIA AYTO POY PREPEI NA PARADOSO EINAI ENA ARXEIO TO OPOIO DEN THA EXEI DIPLOEGGRAFES KAI ENA ARXEIO POU EINAI I DIPLOEGGRAFES EPIDI DEN GINETE NA TA KANW ENA ENA ME TO XEREI MIPOS IPARXEIO KAPOIOS ALLOS TROPOS NA GLITOSO TI KINISI AYTI KAI NA PROLABW ME TO XRONO POU ME STENEBEI KATHE MERA KAI PERISOTERO

    TH.N.X

  5. Ο/Η vioannis λέει:

    Φίλε Ερμή, αυτό που ζητάς γίνεται ως εξής:
    Βήμα 1ο
    Αν τα στοιχεία σου είναι στη στήλη Α1:Α95000 τότε σε μία διπλανή κενή στήλη, ας πούμε την Β, και στο κελί Β1 γράψε τον τύπο

    =COUNTIF($A$1:A1;A1)
    

    Αν τα δεδομένα σου δεν αρχίζουν από το κελί Α1, αλλά ας πούμε ότι αρχίζουν από το κελί Α2, ο τύπος θα γραφτεί στο κελί Β2 και θα είναι:

    =COUNTIF($A$2:A2;A2)
    

    Τον τύπο αυτό αντιγράφεις κάτω -κάτω στη στήλη Β, έως το κελί Β95000
    Ο τύπος αυτός όταν βρίσκει για πρώτη φορά μια τιμή στη στήλη Α, γράφει 1, όταν τη βρίσκει για δεύτερη φορά γράφει 2, για τρίτη γράφει 3 κλπ
    Βήμα 2ο
    Επιλέγεις όλη τη στήλη Β (κάνε δεξί κλικ πάνω στο γράμμα Β) και στο πτυσσόμενο μενού που εμφανίζεται, επιλέγεις “αντιγραφή”. Ξανά δεξί κλικ πάνω στο γράμμα Β, και στο πτυσσόμενο μενού επιλέγεις τώρα “ειδική επικόλληση”, στη συνέχεια επιλέγεις “Τιμές” και “OK”. Μετά πάτα Esc.
    Με τον τρόπο αυτό, οι τύποι που είχες γράψει στη στήλη Β έχουν αντικατασταθεί με καθαρούς αριθμούς (τιμές, αξίες)
    Βήμα 3ο
    Επιλέγεις τις στήλες Α και Β (και μαζί όλες τις άλλες στήλες που ενδεχομένως περιέχει ο πίνακας των δεδομένων σου) και κάνεις αύξουσα ταξινόμηση (από το μικρότερο στο μεγαλύτερο) κατά τη στήλη Β. Όλες οι εγγραφές της στήλης Α που έχουν αντίστοιχο αριθμό στη στήλη Β τον αριθμό 1, θα έρθουν πάνω-πάνω. Αυτές είναι οι μοναδικές εγγραφές της στήλης Α . Αντιγράφεις λοιπόν αυτές τις μοναδικές εγγραφές και τις μεταφέρεις όπου θέλεις. Οι επόμενες εγγραφές που έχουν στη στήλη Β αριθμό 2, είναι τα διπλότυπα και μάλιστα από μία φορά το καθένα. Οι υπόλοιπες εγγραφές που αντιστοιχούν σε 3,4,5 κλπ είναι τα πολλαπλά διπλότυπα.
    Καλή επιτυχία με τη πρακτική σου!

Τα σχόλια είναι απενεργοποιημένα.