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 :

Décrémenter une boucle For Each Cell in Range ?


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable marketing opérationnel
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Responsable marketing opérationnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Décrémenter une boucle For Each Cell in Range ?
    Bonjour à tous,

    Je suis confronté à un petit souci, et je me demandais s'il existait une solution simple en VBA:

    Prenons en exemple un tableau de 20 lignes et plusieurs colonnes, dont la première colonne est composé des valeurs "ok" ou "ko". Je souhaite mettre en place un code permettant de supprimer toutes les lignes dont la 1ère colonne a la valeur "ko".

    Pour cela, j'ai écrit le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i = 20
    Do While i <> 1
       If Range("A!" & i) = "no" Then
          Rows(i).Delete
       End If
        i = i - 1
    Loop
    En effet, je suis obligé de décrémenter car en incrémentant, cela sauterait des lignes. (si par exemple la ligne 3 comporte "ko" ; elle est effacée donc la ligne 4 devient 3 ; la macro passe à la ligne 4 et saute donc une valeur).
    Cela fonctionne parfaitement ; néanmoins, dans le but d'optimiser la macro et la rendre plus rapide (les fichiers que je travaille comportement des milliers de lignes), j'aurais souhaité utiliser la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each Cell in Range("A:A")
       If Cell.Value = "ko" Then
          Cell.Rows.Delete
       End If
    Next Cell
    Le souci est que dans ce cas précis, on incrémente et des lignes sont donc sautés. Y a-t-il un moyen de résoudre ce souci?

    Merci par avance,

  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
    12 889
    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 : 12 889
    Points : 28 850
    Points
    28 850
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux utiliser un filtre simple ou élaboré et ensuite supprimer les lignes visibles.
    Attention qu'en supprimant les cellules visibles tu supprimeras la ligne 1 contenant les étiquettes de colonnes. Donc il y aurait lieu d'utiliser la plage des cellules visibles en utilisant les propriétés Offset et Resize de l'objet Range.
    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
    Candidat au Club
    Homme Profil pro
    Responsable marketing opérationnel
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Responsable marketing opérationnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour Philippe,

    Je te remercie beaucoup pour cette réponse rapide.

    Je n'ai jamais utilisé de filtres dans mes macros. Quelle forme cela pourrait-il prendre? Pourrais-tu me donner un exemple de code?

  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
    12 889
    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 : 12 889
    Points : 28 850
    Points
    28 850
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple d'une procédure supprimant les lignes contenant en colonne I, le mot Appartement d'une liste de données dont la première cellule est en A1 et se trouve dans une feuille nommée [db] du classeur où se trouve le code VBA.
    La première ligne de cette liste contient les étiquettes de colonnes.
    La méthode utilisée pour filtrer les données est AdvancedFilter (Filtre avancés) et le filtre est un critère calculé et sa formule est
    Pour en savoir plus sur Les filtres avancés ou élaborés dans Excel
    Code de la procédure
    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
    17
    Sub RemoveFilteredRows()
     Dim rng As Range, rngVisible As Range, rngCriteria As Range
     Set rng = ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
     Set rngCriteria = rng.Offset(columnoffset:=rng.Columns.Count).Resize(2, 1) ' Zone des critères
     ' Insertion des critères
     With rngCriteria: .Item(1) = "fn": .Item(2) = "=I2=""Appartement""": End With
     ' Filtre avancé
     rng.AdvancedFilter xlFilterInPlace, rngCriteria
     ' Sélection des cellules visibles
     With rng
      Set rngVisible = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
     End With
     rngVisible.EntireRow.Delete ' Supprime les lignes entières visibles
     rng.Worksheet.ShowAllData ' Affiche les données
     rngCriteria.Clear ' Supprime les critères
     Set rng = Nothing: Set rngCriteria = Nothing
    End Sub
    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
    Candidat au Club
    Homme Profil pro
    Responsable marketing opérationnel
    Inscrit en
    Décembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Responsable marketing opérationnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup ! Je vais me plonger dans cette question demain, et reviendrai sur le forum pour confirmer que ca a marché et clôre le sujet

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 889
    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 : 12 889
    Points : 28 850
    Points
    28 850
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai corrigé la dernière ligne de la fonction qui posait un problème (il manquait l'instruction Set) et j'ai également allégé la ligne d'attribution de la plage de la variable objet rngVisible
    La correction est faite dans ma réponse précédente
    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

Discussions similaires

  1. trié des date avec une boucle for each
    Par alex santus dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 03/09/2009, 11h00
  2. test avant d'entrer dans une boucle For each cell in selection
    Par totoro02 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/01/2009, 09h27
  3. comment effacer un element dans un collection dans une boucle for each
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2008, 12h48
  4. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47
  5. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55

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