IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Suppression des cellules "vides" d'un filtre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 32
    Par défaut Suppression des cellules "vides" d'un filtre
    Bonjour,

    Je souhaite pouvoir supprimer les cellules "vides" d'une feuille qui apparaissent dans mes filtres.
    Mon code actuel permet déjà de supprimer le contenu à l'ouverture du classeur mais quand j'importe des données, je me retrouve avec x lignes de cellules "vides".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_Open()
    Worksheets("Feuil1").Range("A2:Z6000").ClearContents
    End Sub
    Dans ma macro d'export sur mon autre classeur j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub FichierTest()
     
    With ThisWorkbook.Sheets("Feuil2")
        .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="OK"
        .Range("A:B,E:E,I:J,Z:AA").SpecialCells(xlCellTypeVisible).Copy
        Workbooks("Test.xlsm").Sheets("Feuil1").Range("A1").PasteSpecial Paste:=xlPasteValues 
        Application.CutCopyMode = False
    End With
     
    Exit Sub
     
    End Sub
    Je me dis que SpecialCells(xlCellTypeVisible) doit avoir un rôle à jour là dedans.
    Une idée?

    Merci beaucoup.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je me dis que SpecialCells(xlCellTypeVisible) doit avoir un rôle à jour là dedans.
    La propriété SpecialCells(xlCellTypeVisible) ne fait que renvoyer un objet Range. C'est la méthode EntireRow.Delete qui se charge de la suppression
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With ThisWorkbook.Worksheets("Feuil1")
     .Range("A2:B15").SpecialCells(xlCellTypeVisible).EntireRow.Delete
     End With
    Par contre, ta demande n'est pas très claire. Tu parles à la fois de suppression de données visibles et d'exportation de données. Quel est exactement le problème ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,
    Citation Envoyé par La_Taupe Voir le message
    Je me dis que SpecialCells(xlCellTypeVisible) doit avoir un rôle à jour là dedans.
    a priori, je pense que 'xlCellTypeConstants' serait plus judicieux mais pas testé.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    a priori, je pense que 'xlCellTypeConstants' serait plus judicieux mais pas testé.
    Sauf si je n'ai rien compris au message initial
    Je souhaite pouvoir supprimer les cellules "vides" d'une feuille qui apparaissent dans mes filtres.
    la demande concerne bien les cellules vides donc c'est bien la constante xlCellTypeVisible que l'on doit utiliser

    xlCellTypeConstants, c'est pour sélectionner les cellules contenant une constante (Valeur).

    Je crois que le nom des constantes typées xlCellType est suffisamment explicite

    [EDIT]
    J'ai relu la procédure publiée qui finalement ne correspond absolument pas au titre de da discussion qui évoque la "suppression des cellules vides d'un filtre" alors que le code publié copie des cellules filtrée

    Pour obtenir une réponse pertinente, la demande devrait être reformulée
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir …

    "vides" ou "cachées" ?
    Quand des lignes de la colonne 1 contiennent OK, le filtre sur ce critère va cacher toutes les autres (vides ou pas). Ta seconde procédure permet de ne copier que les lignes visibles (.SpecialCells(xlCellTypeVisible) ou (.SpecialCells(12) mais cela peut prendre un certain temps notamment si le nombre de lignes est très important.
    On peut alors décomposer le traitement des colonnes, comme ceci, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit
    'filtre et copie
    Private Sub Worksheet_Activate()
        With Feuil1.[Plage]
            .AutoFilter 1, "OK"
            .Columns("A:B").Copy [A1]    '.SpecialCells(12)
            .Columns("E:E").Copy [C1]
            .Columns("I:J").Copy [D1]
            .Columns("Z:AA").Copy [F1]
            .AutoFilter
        End With
    End Sub
    'fait le ménage ici, le classeur s’en rouve allégée
    Private Sub Worksheet_Deactivate()
       [A1].CurrentRegion.Delete
    End Sub
    remarque : avec certaines versions d’Excel, la plage à copier directement après un filtre est la plage filtrée (sans les lignes vides du critère).
    Si ta version n’en tient pas compte, il suffit d’ajouter .SpecialCells(12) juste avant .Copy.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 32
    Par défaut
    Merci pour vos réponses à tous les trois.

    Je vais essayer d'être plus explicite pour que mon "problème" soit plus compréhensible Philippe.

    J'ai deux classeurs.

    Un qui est un référentiel très général et un autre qui (via un bouton de commande dans le premier) réceptionne les données filtrées du premier.
    La macro d'exportation dans le premier classeur référentiel correspond à mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub FichierTest()
     
    With ThisWorkbook.Sheets("Feuil2")
        .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="OK"
        .Range("A:B,E:E,I:J,Z:AA").SpecialCells(xlCellTypeVisible).Copy
        Workbooks("Test.xlsm").Sheets("Feuil1").Range("A1").PasteSpecial Paste:=xlPasteValues 
        Application.CutCopyMode = False
    End With
     
    Exit Sub
     
    End Sub
    Quand la macro de mon classeur référentiel s'exécute j'ai donc mes lignes contenant les données filtrées avec le critère OK qui viennent s'importer dans mon classeur Test.xlsm.

    Maintenant, ce qui me gêne, c'est d'avoir dans mes colonnes du second classeur Test la valeur "vides" qui est proposée quand je veux apposer un filtre dans une colonne. Alors que je ne devrais obtenir que les valeurs extraites du premier classeur via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="OK"
    .

    L'autre code publié sur mon message initiale était une tentative de partir sur une base saine à chaque ouverture du classeur Test.

    Mais j'ai bien compris que ce copier coller de valeurs "vides" vient de ma macro d'exportation et que le code ci-après n'y changera rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
    Worksheets("Feuil1").Range("A2:Z6000").ClearContents
    End Sub
    .

    J'ai donc bien essayé anasecu de modifier avec xlCellTypeConstants de manière à n'exporter que les cellules contenant une valeur mais cela ne semble pas fonctionner car il m'indique que mon classeur de réception n'est pas ouvert (pourquoi? Je n'en sais rien).

    OrDonc, pareil, j'ai essayé mais j'ai toujours dans les filtres de mon second classeur, la valeur "Vides" qui apparaît.

    Je souhaite donc pouvoir ne copier strictement que les lignes de mon premier classeur avec les valeurs issues du filtre OK.

    En espérant avoir réussi à me faire comprendre

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 32
    Par défaut
    Question sûrement très bête mais qui peut peut être répondre à mon interrogation: le fait que certaines colonnes aient des critères de validation via des listes déroulantes ou des formules sur plus de 10 000 lignes même si elles n'ont pas été remplies par les utilisateurs participerait-il à mon problème?

Discussions similaires

  1. [OpenOffice][Tableur] Comment compter des cellules non vides
    Par BizutAccess dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 14/02/2012, 09h18
  2. [XL-2002] Concatener des cellules non vides pour faire liste d'envoi mail
    Par tchoutchou69 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 25/11/2011, 10h38
  3. [XL-2003] action sur des cellules non vides
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/05/2009, 15h33
  4. Suppression des statistiques tables vides
    Par tomk_41 dans le forum Administration
    Réponses: 7
    Dernier message: 05/02/2009, 10h47
  5. Somme des cellules non vides en VBA
    Par baldg dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/03/2008, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo