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 :

boucle VBA recherche de valeur


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut boucle VBA recherche de valeur
    Bonjour,
    Je fais appel à vos connaissances pour réaliser un projet professionnel.

    J'ai un fichier, qui calcul tout seul a partir de petites données. (je vous joint un exemple condensé)

    selon les données les résultats peuvent bouger dans une seconde feuil.
    J'ai donc en colonne A mis 1 ou 0 si je veux garder la ligne ou non.

    Le VBA devra donc chercher tout les 0 de cette colonne et sélectionner la ligne puis la supprimer, puis passer à la suite.

    Exemple 1 :

    Feuil 1 :
    A=oui
    B=oui
    C=oui

    Feuil2 :
    A
    B
    C

    Exemple 2 :

    Feuil 1 :
    A=oui
    B=non
    C=oui

    Feuil2 :
    A
    C

    Je ne suis pas habitué aux forum et ma demande peut être incomplète, dites moi si vous souhaitez plus de données

    rechercher les ligne a supprimer.xlsm

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je n'ai pas ouvert ton fichier joint mais une erreur classique dans ce type de procédure est de faire une boucle procédant du haut vers le bas (suivant l'ordre des numéro de ligne).

    Il faut faire l'inverse : aller du bas vers le haut.
    Par exemple, si ta boucle est "For To", il faut mettre un Step -1 pour signifier qu'on va "à rebours".
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Je n'ai pas ouvert ton fichier joint mais une erreur classique dans ce type de procédure est de faire une boucle procédant du haut vers le bas (suivant l'ordre des numéro de ligne).

    Il faut faire l'inverse : aller du bas vers le haut.
    Par exemple, si ta boucle est "For To", il faut mettre un Step -1 pour signifier qu'on va "à rebours".
    Merci pour la réponse rapide. Honnêtement je ne comprend pas bien le Step-1

    Pour infos je suis parti de cette base :
    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
    18
    19
    20
    21
    22
    23
    Sub Purge()
     
    Dim numéro As Integer
    Dim celluletrouvee As Range
    Dim ligne As Integer
    Dim col As Integer
     
    numéro = "0"
     
    Set celluletrouvee = Range("A1:A10000").Find(numéro, lookat:=xlPart)
     
    If celluletrouvee Is Nothing Then
    MsgBox ("Pas trouvé")
    Else
    ligne = celluletrouvee.Row
    col = celluletrouvee.Column
    MsgBox ("Cellules trouvé")
    celluletrouvee.Select
    Rows(ActiveCell.Row).Select
        Selection.Delete Shift:=xlUp
    End If
     
    End Sub
    1) Cela marche mais il n'y a pas de boucle et donc il s'arrete sur chaque ligne. si j'ai 100 lignes avec un 0 je devrais cliquer 100 fois sur le bouton
    2) Le 0 et 1 est obtenu si la ligne contient quelque chose.
    Mais apparemment le VBA ne veux pas savoir si la cellule à 0 ou 1.
    J'ai une cellule qui contient 1 (obtenue grâce a une formule), mais il me la sélectionne quand même.

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Masta945 Voir le message
    numéro = "0"
    Les guillemets sont la marque d'une chaine de caractère (le type String).
    Ta variable étant un Integer, ils ne sont pas utiles.

    1) Cela marche mais il n'y a pas de boucle et donc il s'arrete sur chaque ligne. si j'ai 100 lignes avec un 0 je devrais cliquer 100 fois sur le bouton
    Pour en savoir plus sur les boucles, lire ça : https://silkyroad.developpez.com/vba/boucles/
    et ça : https://bidou.developpez.com/article/VBA/ (en particulier les pages 46 à 50).

    Ne pas oublier aussi que la recherche doit se faire du bas vers le haut.
    Il faut donc ajouter un paramètre SearchDirection:=xlPrevious.
    Lire ça : https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Voir l'aide en ligne sur la méthode FindNext :
    https://docs.microsoft.com/fr-fr/off...range.findnext

    Ou, encore, la Fonction FindAll de Chip Pearson : http://www.cpearson.com/excel/findall.aspx
    Cordialement,
    Franck

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour vos réponse.
    D'après vous il vaut mieux que je me concentre sur les boucles For Next ou Do Loop?

  7. #7
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Il vaut mieux que tu te concentres sur la lecture et la compréhension des liens que je t'ai communiqué.
    Cordialement,
    Franck

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Il vaut mieux que tu te concentres sur la lecture et la compréhension des liens que je t'ai communiqué.
    C'est ce que j'ai commencer à faire, déjà il faut savoir quelle boucle m’intéresse, je ne vais pas toutes les étudier. Je ne suis pas informaticien

  9. #9
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    La procédure que tu cherches est l'exemple n°1 dans le 1er lien que je t'ai donné :

    Exemple
    Cet exemple montre comment rechercher toutes les cellules de la plage a1:A500 qui contiennent la valeur 2 et comment remplacer leur valeur par 5.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    With Worksheets(1).Range("A1:A500")   'dans la plage A1:A500
         Set c = .Find(2, lookin:=xlValues)   'RECHERCHE 2 
         If Not c Is Nothing Then                 's'il trouve 2
            firstAddress = c.Address             'stocke l'adresse de la cellule ou il a trouvé 2
            Do                                            'Boucle
                c.Value = 5                              'on remplace par 5 le 2 trouvé
                Set c = .FindNext(c)                 'on cherche le suivant
            If c is Nothing Then                      'si pas de suivant va à la fin ===>
                GoTo DoneFinding
            End If
            Loop While c.Address <> firstAddress 'boucle tant que la recherche ne ramène pas la première cellule
          End If
          DoneFinding:                                ' ===>
    End With
    Cordialement,
    Franck

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Alors merci Franck pour la réponse mais je l'avais vu et testé, je la re-teste en ce moment mais la boucle ne trouve pas le 2 et du coup ne change absolument rien.
    J'ai pourtant fais une liste jusqu'à 23

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Masta945 Voir le message
    Alors merci Franck pour la réponse mais je l'avais vu et testé, je la re-teste en ce moment mais la boucle ne trouve pas le 2 et du coup ne change absolument rien.
    J'ai pourtant fais une liste jusqu'à 23
    autant pour moi j'vais oublié de changer la feuille

    Je re-teste en essayant de selectionner la lignes...

  12. #12
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Essaye cette procédure qui devrait supprimer tes lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub VAZY()
    Dim c As Range, firstaddress As String
        With Worksheets(1).Range("A1:A500")   'dans la plage A1:A500
             Set c = .Find(2, LookIn:=xlValues)   'RECHERCHE 2
             If Not c Is Nothing Then                 's'il trouve 2
                    Do                                   'Boucle
                        c.EntireRow.Delete
                        Set c = .Find(2, LookIn:=xlValues)                 'on cherche le suivant
                    Loop While Not c Is Nothing 'boucle tant que la recherche ne ramène pas la première cellule
              End If
        End With
    End Sub
    Cordialement,
    Franck

  13. #13
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Salut pijaku, ravi de te retrouver.

    Ton processus évite un balayage intégral. Il est donc plus perfiormant

    Juste pour information.

    Si aucune des cellules n'est vide.
    Pour ma part, je remplace la valeur à tester (ici 2) par une valeur string à 0 caractère
    2==>""
    Dans un 2ème temps, j'utilise la méthode SpecialCells pour supprimer en une seule fois les lignes entières des cellules ainsi mises à blanc.
    Les 2 méthodes s'affectent en une seule fois chacune (One Shot).

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  14. #14
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Masta945 Voir le message
    D'après vous il vaut mieux que je me concentre sur les boucles For Next ou Do Loop?
    Etant donné que tu ne connais pas d'avance le nombre de lignes à traiter et que la condition de fin de boucle sera le résultat d'une méthode Find, Do Loop semble plus indiqué.

    Quoi que, dans ton cas, l'utilisation de While/Wend à la structure plus basique, me semble plus simple.
    Lire ça : https://docs.microsoft.com/fr-fr/off...wend-statement
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2019
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Alors la j'y suis presque mais forcément, quelque chose ne va pas.
    Il m'efface bien la ligne mais juste après il me fait une erreur 400

    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
    Sub rechsupptest()
    With Worksheets(2).Range("A1:A50")                  'dans la plage A1:A50
         Set c = .Find(3, LookIn:=xlValues)             'RECHERCHE 3
         If Not c Is Nothing Then                       's'il trouve 3
            firstAddress = c.Address                    'stocke l'adresse de la cellule ou il a trouvé 3
            Do                                          'Boucle
                Rows(c).Delete                             'on selectionne la ligne complète et la supprime
                Set c = .FindNext(c)                    'on cherche le suivant
            If c Is Nothing Then                        'si pas de suivant va à la fin ===>
                GoTo DoneFinding
            End If
            Loop While c.Address <> firstAddress        'boucle tant que la recherche ne ramène pas la première cellule
          End If
    DoneFinding:                                        ' ===>
    End With
    End Sub

  16. #16
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Si tu lisais toutes les réponses en détail, tu verrais que mon dernier code n'utilise pas FindNext, mais juste Find.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rows(c).Delete 'Qu'elle horreur!
    Ce code supprime le Range c. Donc, ton FindNext(c) plante, c n'existant plus...

    Préférer l'écriture :


    @Marcel : ta méthode ne fonctionnera pas avec un paramètre Lookat réglé sur xlPart.
    121 ==> 11 ==> pas de suppression
    Cordialement,
    Franck

  17. #17
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Pijaku,

    Avec le joker "*"

    Exemple

    de A1 à A8

    12
    121
    5
    6
    121
    12
    8
    4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
     
    Public Sub essai_suppr()
     
    With Worksheets(1).Range("A1:A8")
            .Replace What:="*2*", Replacement:="", Lookat:=xlPart
            .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End With
     
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


Discussions similaires

  1. [Toutes versions] VBA - Rechercher une valeur dans un PDF
    Par pak987 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 16/09/2022, 14h20
  2. Réponses: 3
    Dernier message: 02/02/2018, 22h20
  3. Réponses: 6
    Dernier message: 10/03/2017, 06h38
  4. [XL-2010] Excel VBA recherche de valeur de formule dates
    Par sharivary dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/11/2014, 23h56
  5. [2013] boucle VBA (recherche à partir d'un nom et copier coller)
    Par billy255 dans le forum Microsoft Office
    Réponses: 2
    Dernier message: 21/05/2014, 10h43

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