Forum

Forum (https://www.ms-office.gr/forum/)
-   Excel - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/)
-   -   [VBA] Autofilter excel 2002 και διαφορές με 2007? (https://www.ms-office.gr/forum/excel-erotiseis-apantiseis/1217-autofilter-excel-2002-kai-diafores-me-2007-a.html)

nikosjc 20-06-11 09:06

Autofilter excel 2002 και διαφορές με 2007?
 
Καλημέρα παιδιά,

θα χρειαστώ για άλλη μια φορά τη βοήθεια σας.

Έχω φτιάξει κάποιες μακροεντολές σε excel 2002 SP3 και δουλεύουν μια χαρά. Όταν πήγα όμως να τις τρέξω σε 2007 αντιμετώπισα το εξής πρόβλημα.

Χρησιμοποιώ τον παρακάτω κώδικα για να σβήσω γραμμές, που σε μια στήλη τους έχουν το "ο" (=όχι")

Κώδικας:

    With Sheets(1)
    LastRow = .Range("C3").End(xlDown).Row 'Έυρεση τελευταίας γραμμής με περιεχόμενο
    .Range("C3:C" & LastRow).EntireRow.Select
    End With
    Selection.Sort Key1:=Range("F3"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
   
    Rows("2:2").Select 'Η τίτλοι των στηλών είναι στην γραμμή 2
    Selection.AutoFilter
    Selection.AutoFilter Field:=6, Criteria1:="o" 'Το κριτήριο μου είναι στην στήλη 6
    With Sheets(1)
    LastRow = .Range("a3").End(xlDown).Row 'Επιλογή των γραμμών προς διαγραφή
    .Range("a3:a" & LastRow).EntireRow.Select
    End With
    Selection.Delete Shift:=xlUp 'Διαγραφή γραμμών
   
    Selection.AutoFilter Field:=6 'Επαναφορά φίλτρου
    Selection.AutoFilter 'Αφαίρεση φίλτρου
    Range("A1").Select

Απ'οτι καταλαβαίνω το φίλτρο λειτουργεί διαφορετικά στις δύο εκδόσεις. Στο 2002 με την επιλογή των γραμμών μαζικά, επιλέγει μόνο όσες βλέπει στο φίλτρο και τις διαγράφει. Στο 2007 όμως αν και στο φίλτρο φαίνονται μόνο οι επιλογές με "ο", όταν γίνεται το μαρκάρισμα επιλέγει όλες τις γραμμές και τις διαγράφει!

Υπάρχει κάποιος τρόπος επιλογής μόνο όσων φαίνονται στο φίλτρο ή να τις σβήσω με άλλον τρόπο? (πχ με κάποια if ελέγχοντας όλες τις γραμμές μια μια)...

Ευχαριστώ!

nikosjc 20-06-11 10:04

Το βρήκα μάλλον παιδιά!

Κώδικας:

Rows("2:2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=6, Criteria1:="o"
    Application.DisplayAlerts = False
    ActiveSheet.UsedRange.Offset(2, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1, 1). _
            SpecialCells(xlCellTypeVisible).EntireRow.Delete
    Application.DisplayAlerts = True

Λογικά θέλει το SpecialCells για να επιλέξει κ να διαγράψει μόνο τις φιλτραρισμένες γραμμές... :thumbup1:

Tasos 20-06-11 10:50

Καλημέρα Νίκο!
Ο κώδικας που αναφέρεις είναι σωστός και προφανώς σε εξυπηρετεί.

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

Σε τέτοιες περιπτώσεις δεν εξυπηρετεί το "UsedRange".

Θα πρέπει να χρησιμοποιηθεί το "AutoFilter.Range"

Για παράδειγμα:

Κώδικας:

Sub test()
    Dim rng As Range

      Sheet1.Range("$A$2:$K$100").AutoFilter Field:=6, Criteria1:="o" ' Sheet1 = Το κωδικό όνομα του φύλλου

      Set rng = Sheet1.AutoFilter.Range
      Set rng = rng.Offset(1).Resize(rng.Rows.Count - 1, 1)
      'δημιουργεί μια περιοχή από την δεύτερη γραμμή του φίλτρου μέχρι την τελευταία.

      If rng.Count > 0 Then rng.SpecialCells(xlCellTypeVisible).EntireRow.Delete
      'Αν δεν υπάρχουν ορατά κελιά στη φιλτράρισμένη περιοχή "rng", η SpecialCells() θα επιστρέψει σφάλμα.
      Set rng = Nothing
End Sub

Φιλικά
Τάσος

nikosjc 20-06-11 11:39

Α, άψογο! Στην ουσία αυτό ήθελα, επιλογή μόνο των τιμών του AutoFilter και προφανώς το AutoFilter.Range είναι πιο ασφαλές!

Σ'ευχαριστώ πάρα πολύ Τάσο!


Η ώρα είναι 04:44.

Ms-Office.gr - ©2000 - 2024, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2