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 :

.Find de plusieurs variables et Loop Infini [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut .Find de plusieurs variables et Loop Infini
    Bonjour à tous,

    Je viens vers vous pour deux petites interrogations...
    J'ai un code vba simple qui cherche, par exemple, le mot "garage" dans les Colonnes A, B et C, et si il trouve me renvoie, sur la même ligne, "Garage" en colonne D. Rien de bien compliqué...
    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
    24
    25
    26
    27
    28
    29
    30
    Sub Test_Garage()
     
    Dim FL1 As Worksheet
    Dim c As Range, Donnee1 As String
     
     
       Set FL1 = Worksheets("Données") 
     
     
        For Nolig = 2 To FL1.Range("A65535").End(xlUp).Row
            Donnee1 = "Garage" 
            With FL1.Range("a1:c" & FL1.Range("A65535").End(xlUp).Row) 
               Set c = .Find(Donnee1, LookIn:=xlValues)
     
            If Not c Is Nothing Then
              FirstAddress = c.Address
                Do
                    FL1.Cells(c.Row, 4) = "Garage"
                     Set c = .FindNext(c)
               Loop While Not c Is Nothing And c.Address <> FirstAddress
     
                Else
                  ' FL1.Cells(Nolig, 4).Value = 0
                End If
     
                'Set c = Nothing
            End With
        Next
     
    End Sub
    Mon premier problème est devant mon nez, mais ne trouve pas de solutions.
    Quand je fais des tests, avec des données sur les 30 premières lignes et les colonnes A,B et C: tout marche .
    Mais quand je lance cette macro sur 8 000 lignes, j'ai l'impression qu'elle boucle à l'infini
    J'ai repris les aides sur Loop mais ne comprends pas l'erreur?
    Si cela marche pour 10, cela marche pour 100000 non?
    Est-ce du fait qu'il cherche sur plusieurs colonnes, et que celles-ci sont mal définis?


    Ma seconde question est: comment faire pour qu'il cherche "garage" et "essence" (par ex.) et renvoie dans les deux cas "Garage".
    J'ai cherché du côté de Array, And et par les Tableaux mais ne trouve pas.
    Auriez-vous une piste?


    En vous remerciant par avance

  2. #2
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Bonjour et bienvenu sur le forum,

    Normal.
    Tu boucles 2 fois.
    La méthode Do ... Loop suffit
    Il te suffit de renseigner la plage de recherche de la dernière ligne trouvée.

    Apparemment, tu as copié l'aide en ligne de la méthode Find.
    Ce qui peut se concevoir, certes, mais à la condition de comprendre un tant soit peu le code proposé.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Bonjour MarcelG,

    Merci pour votre réponse rapide!
    Quelque chose m'échappe alors.
    J'ai repris ce code, de travaux précédents, et pour lequel j'avais déjà sollicité l'aide de ce forum (https://www.developpez.net/forums/d1...mpte-doublons/).
    Ce qui veut donc dire que ce dernier a le même soucis...mais je n'ai pas constaté de problème avec ce dernier.
    J'ai, tout de même, le sentiment de comprendre, au moins dans la structure, la manière dont ce code fonctionne.

    Et dans ce cas, pourquoi le problème ne se pose pas lors de mes tests sur 30lignes?


    Merci d'avance.

  4. #4
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    Tiens compte de ma remarque précédente.
    Adapte ton code et procède à son exécution.
    Est-il effectif?
    Dans la négative, tu peux le retourner ici.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Je viens de comprendre mon erreur, grâce à vous, la boucle For ne servait à rien...
    Trop habitué à la voir, je n'y prêtais plus attention.

    J'avais essayé en déclarant Derlig, mais c'est bien la boucle For le problème!
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Sub Test_Garage()
     
     
    Dim FL1 As Worksheet
    Dim c As Range, Donnee1 As String
    'Dim Derlig As Long
     
     
       Set FL1 = Worksheets("Données") 
     ' Derlig = FL1.Range("A65535").End(xlUp).Row
     
     
            Donnee1 = "Garage" 'ajouté
            With FL1.Range("a1:c" & FL1.Range("C65535").End(xlUp).Row) 'tu désignes ta plage de recherche
               Set c = .Find(Donnee1, LookIn:=xlValues)
     
            If Not c Is Nothing Then
             FirstAddress = c.Address
                Do
                    FL1.Cells(c.Row, 4) = "Garage"
                    Set c = .FindNext(c)
              Loop While Not c Is Nothing And c.Address <> FirstAddress
     
               ' Else
                  ' FL1.Cells(Nolig, 4).Value = 0
                End If
     
                'Set c = Nothing
     
             End With
     
    End Sub
    Merci beaucoup pour vos indications!

    Désormais, auriez-vous une piste pour faire cette même recherche sur plusieurs variables "garage", "essence", "automobile", etc. ?
    Array, And, Tableau, Autres?

  6. #6
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Salut,

    Il te suffit de boucler sur un tableau à 1 dimension (Array)
    Il pourrait être opportun de libérer les variables affectées à des objets après utilisation (valeur : Nothing)

    En partant de ton code

    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
    24
    25
    26
    Option Explicit
     
    Sub Test_Garage()
     
    Dim FL1 As Worksheet
    Dim c As Range, Donnee1 As String
     
    Set FL1 = Worksheets("Données")
     
    For Each don In Array("Garage", "Essence")
            With FL1.Range("a1:c" & FL1.Range("C65535").End(xlUp).Row) '
                    Set c = .Find(don, LookIn:=xlValues)
                    If Not c Is Nothing Then
                            FirstAddress = c.Address
                            Do
                                    FL1.Cells(c.Row, 4) = "Garage"
                                    Set c = .FindNext(c)
                            Loop While Not c Is Nothing And c.Address <> FirstAddress
                    End If
                    Set c = Nothing
            End With
    Next don
     
    Set FL1 = Nothing
     
    End Sub

  7. #7
    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
    Salut
    Avec la remarque de MarcelG concernant l'aide, on peut y lire :
    Pour effectuer des recherches plus complexes, utilisez une instruction For Each...Next avec l'opérateur Like
    d'où le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
    Option Compare Text 'pour ne pas tenir compte de la casse
    Sub Test_Garage()
      Dim R As Range, T As String
      For Each R In Sheets("Données").Range([A2], [A65535].End(xlUp))
        If R Like "Garage" Then T = T & R.Address & vbLf
      Next
     If T = "" Then MsgBox "pas de trace !", , "Oups…" Else MsgBox T, , "garage" & " est présent ici :"
    End Sub
    Remarque : beaucoup de débutants ne se posent malheureusement pas la question de savoir où écrire la macro.

    Quand elle implique plusieurs onglets, on a intérêt à l'écrire dans un module standard en précisant la référence de la feuille cible (voir ci-dessus).

    Quand la macro ne concerne qu'une feuille, on peut l'écrire dans la fenêtre de codes de celle-ci (Alt F11).

    Ce qui donnerait ici, dans la fenêtre de codes de l'onglet nommé "Données" avec plusieurs mots en colonne A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Option Compare Text 'pour ne pas tenir compte de la casse
    Sub Test_Garage()
      Dim Mot, n As Byte, R As Range, T As String
      Mot = Array("garage", "essence", "automobile")
      For n = 0 To 2
      T = ""
      For Each R In Range([A2], [A65535].End(xlUp))
        If R Like Mot(n) Then T = T & R.Address & vbLf
      Next
     If T = "" Then MsgBox "pas de trace de " & Mot(n), , "Oups…" Else MsgBox T, , Mot(n) & " est présent ici :"
    Next
    End Sub
    Si les mots sont dispersés dans plusieurs colonnes, il faudra modifier la macro (le contexte indiquera les modifications les plus simples). MarcelG (toujours lui ) t'en donne un exemple.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Octobre 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Octobre 2018
    Messages : 22
    Par défaut
    Super, merci!
    Je n'en demandais pas tant, je vais me plonger dans le détail pour être plus indépendant pour la suite!

    Edit: Merci à vous deux, pour ces lignes et vos indications!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] LOOP FIND et SUM VARIABLES
    Par Mazorus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/05/2017, 18h45
  2. Plusieurs variables dans Dim et Case??
    Par samlepiratepaddy dans le forum Access
    Réponses: 2
    Dernier message: 02/10/2005, 18h04
  3. Envoyer plusieur variable a un programme
    Par scaleo dans le forum Langage
    Réponses: 9
    Dernier message: 06/09/2005, 11h09
  4. envoyer plusieurs variables dans l'url?
    Par brgui dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/08/2005, 14h18
  5. Réponses: 5
    Dernier message: 28/04/2004, 16h06

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