Γρήγορο φιλτράρισμα μιας λίστας

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

ExpressFilter01

Μόλις καλέσετε τη μάκρο θα προστεθεί ένα νέο φύλλο στο βιβλίο σας, με όλες τις εγγραφές για το κατάστημα της Δάφνης:

ExpressFilter02

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

Η μακροεντολή από την επιλογή του κελιού που θα κάνετε, και μόνο από αυτή, υπολογίζει μόνη της τα όρια της βάσης. Όπως δηλαδή κάνει το ίδιο το excel όταν σε μία βάση κάνετε ταξινόμηση, απλό ή σύνθετο φίλτρο, εξάγετε συγκεντρωτικό πίνακα (pivot) κλπ. Απαραίτητη προϋπόθεση για αυτό, είναι ή να έχετε ορίσει τη βάση σαν πίνακα με το εργαλείο «Πίνακας» (μόνο για excel 2007 και άνω) ή ακόμα καλύτερα, η βάση να έχει συγκροτηθεί τηρώντας τους απλούς κανόνες που θέτει το excel για τις βάσης.

Τους θυμίζω, εν συντομία:

α) Κάθε πεδίο (στήλη) πρέπει να έχει ένα τίτλο. Δεν πρέπει να υπάρχουν ίδιοι τίτλοι.
β) Μεταξύ των τίτλων και της τελευταίας εγγραφής (γραμμής) της βάσης δεν πρέπει να υπάρχουν εντελώς κενές γραμμές, όπως και μεταξύ της πρώτης και τελευταίας στήλης δεν πρέπει να υπάρχουν κενές στήλες.
γ) Οι πρώτες γραμμές και στήλες, αμέσως έξω από τη βάση, πρέπει να είναι εντελώς κενές.
Με το τεστ Ctrl+* μπορείτε να δείτε αν τηρούνται οι παραπάνω κανόνες. Επιλέξτε ένα κελί μέσα στη βάση και πατήστε ταυτόχρονα στο πληκτρολόγιο Ctrl και * (ή Ctrl και Α). Αν έχουν τηρηθεί οι παραπάνω κανόνες θα επιλεγεί ολόκληρη η βάση και μόνο αυτή.

ExpressFilter03

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

Sub ExpressFilterToNewSheet()
'από το Excel Λύσεις
Dim keli As Range
Dim myBase As String
Dim shBase As String
Dim shNew As String
Set keli = ActiveCell
shBase = ActiveWorkbook.ActiveSheet.Name
myBase = keli.CurrentRegion.Address
Application.ScreenUpdating = False
ActiveWorkbook.Sheets.Add
shNew = ActiveSheet.Name
Worksheets(shBase).Cells(keli.CurrentRegion.Row, keli.Column).Copy _
    Destination:=Worksheets(shNew).Range("a1")
keli.Copy Destination:=Worksheets(shNew).Range("a2")
If keli.HasFormula Then Worksheets(shNew).Range("a2") = keli.Value
Sheets(shBase).Range(myBase).AdvancedFilter Action:=xlFilterCopy, _
   CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4")
Rows("1:3").Delete Shift:=xlUp
Cells.EntireColumn.AutoFit
Range("A1").Select
Application.ScreenUpdating = True
End Sub

.

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

2 Responses to Γρήγορο φιλτράρισμα μιας λίστας

  1. Ο/Η Labi λέει:

    σε αυτήν την εντολή πως πρέπει να την τροποποιήσουμε έτσι ωστε το φύλλο να παίρνει το ονομα του πεδίου που επιλέγουμε?

  2. Ο/Η vioannis λέει:

    Labi,
    Κανονικά πρέπει να ξαναγραφτεί ο κώδικας και να προστεθούν οι 3 συναρτήσεις που ελέγχουν και διαχειρίζονται τα ονόματα των νέων φύλλων που επιχειρεί να εισάγει ο χρήστης. Τις συναρτήσεις αυτές θα βρεις στο επόμενο σημείωμα του ιστολογίου ‘Φιλτράρισμα λίστας και δημιουργία φύλλων για όλες τις τιμές πεδίου‘ και είναι οι Function CheckSheetExist, Function CounterSheets, Function ClearIllegalCharacters. Αλλά υπάρχει και μια γρήγορη λύση. Τροποποίησε το παρακάτω κομμάτι του κώδικα έτσι:

    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
    Application.ScreenUpdating = False
    ActiveWorkbook.Sheets.Add
    On Error Resume Next
    ActiveSheet.Name = keli.Text
    shNew = ActiveSheet.Name
    On Error GoTo 0
    .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
    

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

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