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 :

Méthode find avec boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut Méthode find avec boucle
    bonsoir à tous

    j'ai développé une macro grace au phorum sur find et findnext
    mais cela ne me donne pas exactement ce que je souhaiterai
    en effet j'ai deux tableaux un fichier stock avec code et désignation
    et un second ou je n'ai que la désignation
    je cherche donc à récupérer le code pour mon second tableau
    jusqu'ici tout va bien par contre si j'ai plusieurs désignation identiques, il ne me mets que la première
    je me doute qu'il faut certainement ajouté un test ou boucle mais je ne vois pas trop ou
    voici 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    Sub test()
    LePath = ActiveWorkbook.Path & "\"
    ClasseurActif = ActiveWorkbook.Name
     
    Application.Workbooks.Open LePath & "\ETAT DE STOCKS_AUTOMATE.xls" '
     
        ligne = Cells(Rows.Count, 2).End(xlUp).Row
        Sheets("STOCK").Range("b2:e" & ligne).Copy
        Workbooks(ClasseurActif).Activate
     
        ActiveWorkbook.Worksheets.Add
        ActiveSheet.Name = "stock"
        Range("A1").PasteSpecial (xlPasteValues)
     
        Application.DisplayAlerts = False
        Workbooks("ETAT DE STOCKS_AUTOMATE.xls").Close
        Application.DisplayAlerts = True
     
        Set PlageRech = Sheets("VPC STANDARD").Range("A:A")
        With ThisWorkbook.Worksheets("STOCK")
            i = 2
            While .Cells(i, 2).Value <> ""
                Set c = PlageRech.Find(.Cells(i, 2), LookIn:=xlValues, lookat:=xlWhole)
                If Not c Is Nothing Then
                    FirstAddress = c.Address
                    Do
                        NUM_PARUTION = .Cells(i, 1)
                        POIDS_PARUTION = .Cells(i, 4)
                        'STOCK
                            Sheets("VPC STANDARD").Range(FirstAddress).Offset(0, 11) = NUM_PARUTION
                            Sheets("VPC STANDARD").Range(FirstAddress).Offset(0, 12) = POIDS_PARUTION
                        Set c = PlageRech.FindNext(c)
                    Loop While Not c Is Nothing And c.Address <> FirstAddress
                End If
                i = i + 1
            Wend
        End With
        Set PlageRech = Nothing
    End Sub
    merci pour vos pistes ou aides

    david

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    je ne vois pas trop le lien avec ton anomalie mais déjà il te manque une , devant LookIn:=
    LookIn est le 3ème paramètre, pas le 2nd.
    Bizarre que le compilateur ne t'ait rien dit.
    eric

    Edit : après une nuit de sommeil je vois que j'ai dit une bêtise :-)
    Comme tes arguments sont nommés, pas besoin de les placer.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    salut eriic

    ben je souhaite ajouter chaque code article a chaque fois que necessaire
    si designation = livre 1 se trouve sur 10 lignes (contigues ou non) alors recopie 10 fois du code article

    merci de ton conseil mais effectivement pas de problème particulier à priori
    j'ai réussi en modifiant le code je pense....
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    
    Sub test()
    LePath = ActiveWorkbook.Path & "\"
    ClasseurActif = ActiveWorkbook.Name
    
    Application.Workbooks.Open LePath & "\ETAT DE STOCKS_AUTOMATE.xls" '
    
    With Sheets("STOCK")
        ligne = .Cells(Rows.Count, 3).End(xlUp).Row
        .Range("b2:e" & ligne).Copy
    End With
        Workbooks(ClasseurActif).Activate
        
        ActiveWorkbook.Worksheets.Add
        ActiveSheet.Name = "STOCK"
        Range("A1").PasteSpecial (xlPasteValues)
            
        Application.DisplayAlerts = False
        Workbooks("ETAT DE STOCKS_AUTOMATE.xls").Close
        Application.DisplayAlerts = True
        
        Sheets("VPC STANDARD").Activate
        
            With Sheets("STOCK")
                For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
                    Set PlageRech = Sheets("VPC STANDARD").Range("A:A")
                    Set c = PlageRech.Find(.Cells(i, 2), lookat:=xlWhole)
                    If Not c Is Nothing Then
                        FirstAddress = c.Address
                        Do
                            NUM_PARUTION = .Cells(i, 1)
                            POIDS_PARUTION = .Cells(i, 4)
                            ligne = Sheets("VPC STANDARD").Range("A" & .Rows.Count).End(xlUp).Row
                                For x = 2 To ligne
                                   If Cells(x, 1) = c Then
                                            Sheets("VPC STANDARD").Cells(x, 12) = NUM_PARUTION
                                            Sheets("VPC STANDARD").Cells(x, 13) = POIDS_PARUTION
                                    End If
                                    
                                Next x
                            Set c = PlageRech.FindNext(c)
                        Loop While Not c Is Nothing And c.Address <> FirstAddress
                    End If
                Next i
            End With
            
        Set PlageRech = Nothing
        
    End Sub
    en rouge le code modifié qui me donne le résultat escompté

    si d'autres méthodes je suis preneur évidemment

    david

  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 166
    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 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai écrit une fonction basée sur la méthode Find qui renvoie dans une table toutes les cellules trouvées (objet Range) en fonction de deux paramètres.
    Voir cette réponse https://www.developpez.net/forums/d1...et-listobject/
    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 Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Citation Envoyé par munity Voir le message
    en effet j'ai deux tableaux un fichier stock avec code et désignation
    et un second ou je n'ai que la désignation
    je cherche donc à récupérer le code pour mon second tableau
    jusqu'ici tout va bien par contre si j'ai plusieurs désignation identiques, il ne me mets que la première
    Dans ton 1er tableau (code/désignation) , y a-t-il des doublons ?
    Dans ton 2è tableau les désignations sont elles écrites de manière identique partout ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    Bonjour ryu
    Pour repondre a tes questions
    Dans le tableau 1 ou je vais chercher mes codes en fonction de la designation il ny a aucun doublons et il ny en aura jamais car cest la liste unique de tous les articles
    Et oui les designations ont la meme orthographe

  7. #7
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    une autre façon de faire via une variable tableau et une collection
    PS : il se peut qu'il y est une erreur, je l'ai fait en aveugle sans avoir les données à tester voir légèrement modifier si il le faut
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub test()
    Dim w_Actif As Workbook, w_Donnees As Workboo, VA, Coll As New Collection, i As Long, Lig As Long
     
        Set w_Actif = ThisWorkbook
     
        Set w_Donnees = Workbooks.Open(w_Actif.Path & "\ETAT DE STOCKS_AUTOMATE.xls")
        With w_Donnees
            With .Sheets("STOCK")
                VA = .Range("B2:E" & .Cells(.Rows.Count, 3).End(xlUp).Row).Value
            End With
            .Close False
        End With
        Set w_Donnees = Nothing
     
    On Error Resume Next
        For i = LBound(VA) To UBound(VA)
            If VA(i, 2) > "" Then  'par précaution je ne connais pas les données - VA(i, 2) => désignation
                Coll.Add i, CStr(VA(i, 2)) ' enregistrement dans la collection de la ligne (i) dont l'index est le nom de la désignation -> CStr(VA(i, 2))
                If Err Then Err.Clear ' par précaution je ne connais pas les données
            End If
        Next
     
        With w_Actif
            '.Worksheets.Add:        .ActiveSheet.Name = "STOCK" ' <= Facultatif car utilsation d'une collection et d'un variable tableau
            With .Sheets("VPC STANDARD")
                Application.ScreenUpdating = False
     
                    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
                        Lig = Coll(CStr(.Cells(i, 1))) 'on vérifie que la "désignation" existe dans la collection
                        ' si y a pas d'erreur , on récupère la ligne  (LIig correspondante dans la variable tableau afin de récupérer les valeurs de NUM_PARUTION et POIDS_PARUTION
                        If Err Then
                            Err.Clear
                        Else
                            .Cells(i, 12) = VA(Lig, 1) ' NUM_PARUTION
                            .Cells(i, 13) = VA(Lig, 4) ' POIDS_PARUTION
                        End If
                    Next
     
                Application.ScreenUpdating = True
            End With
     
        End With
    On Error GoTo 0
        Set w_Actif = Nothing
    End Sub
    PS perso : Dédicace à Marc-L qui m'a beaucoup appris
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    Ok merci pour le code
    Je vais le tester
    En plus il doit etre plus rapide je pense
    Je te tiens au courant
    Merci encore

  9. #9
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Pour l'emplacement des données, je l'ai fait par supposition.
    En me précisant l'emplacement exact des données (classeurs et feuilles), on pourra ajuster si nécessaire.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

Discussions similaires

  1. [XL-2003] Méthode Find avec plusieurs mots
    Par magikmed dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 06/11/2018, 01h34
  2. VBA: Méthode Find avec des doubles
    Par wilfryjules dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/08/2018, 14h48
  3. [XL-2003] Soucis avec la méthode Find
    Par silvere123 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/07/2012, 17h08
  4. [XL-2007] Méthode Find avec une date
    Par Dragi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2012, 17h41
  5. Méthode find avec plusieurs mots à chercher
    Par domb_st dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2007, 17h33

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