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 :

VBA - Comment utiliser FIND avec une liste de critères et une plage de recherche ? [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut VBA - Comment utiliser FIND avec une liste de critères et une plage de recherche ?
    Bonjour,

    J’ai besoin de compléter une liste de produits (feuille « ListeProduits », contenant les NomProduits), avec le nom d’un composant, un antibiotique dont le libellé est contenu dans le NomProduit, et du code article de cet antibiotique.

    Je dispose pour cela, d’une table (feuille « ListeAntibio ») avec la liste des antibiotiques (NomAntibio) et leur code article (CodeAntibio).
    Les 2 feuilles « ListeProduits » et « ListeAntibio » sont dans le même classeur.

    Procédant par étapes je dispose d’une macro construite avec la fonction FIND (que je connais grâce à un champion de ce forum !), qui renvoie correctement le NomAntibio et le CodeAntibio de la feuille « ListeAntibio » à côté du NomProduit de la feuille « ListeProduits ».
    Cette « maquette » ne fonctionne que si les NomProduits ont exactement le même libellés que les NomAntibio.

    Selon mes recherches sur le net, il faut maintenant que je remplace la fonction FIND par la fonction LIKE pour trouver les NomProduits de la plage de recherche « ListeProduits » contenant une chaine de caractères parmi celles de la « ListeAntibio ».
    Je m’adresse donc au champions, pour m’aider à combiner FIND avec une liste de critères et une plage de recherche !

    Alors, qui veut bien relever le défi ? … s’en est un sacré pour moi, la débutante !
    D’avance un grand merci à mon sauveteur !

    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
    52
    53
    54
    55
    Sub Macro_3_Recherche_NomAntibio_dans_NomProduit()
    '
    Dim Origine As Worksheet, Dest As Worksheet
    Set Origine = Worksheets("ListeAntibio")
    Set Dest = Sheets("ListeProduits")
     
     
    Dim NomAntibio As Variant
    Dim NomProduit As Variant
    Dim LigneProduit As Variant
    Dim LigneAntibio As Variant
     
    Dim reponse
    Dim i As Long
    Dim R As Range
     
     
    'Dans Origine :
     
    For i = 2 To Rows.Count
     
      NomAntibio = Origine.Cells(i, 1).Value
      LigneAntibio = Origine.Cells(i, 1).Row
     
     
        If NomAntibio = "" Then
        Exit For ' pour sortir de cette routine FOR...NEXT
     
        Else
     
                    'Voilà la ligne q'il faut remplacer par Find...
                   Set R = Dest.Range("A1:A100").Find(What:=NomAntibio, LookIn:=xlFormulas, LookAt:=xlWhole)
     
             If R Is Nothing Then
     
                'reponse = MsgBox(NomAntibio & " non trouvé ", vbOKCancel, "Erreur")
                'If reponse = vbCancel Then Exit Sub
     
             Else
     
                LigneProduit = R.Row
     
                CodeAntibio = Origine.Cells(LigneAntibio, 2).Value
     
                Dest.Cells(LigneProduit, 1).Offset(0, 2).Value = NomAntibio
     
                Dest.Cells(LigneProduit, 1).Offset(0, 3).Value = CodeAntibio
     
              End If
     
        End If
     
    Next
     
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonsoir
    pourquoi changer de méthode tu a un argument avec find qui se comporte comme like"*toto*" c'est l'argument "XlPart" a la place de "XlWole"

    xlpart =une partie de "?"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut
    Bonjour Patrick,

    Merci beaucoup pour ta réponse, le remplacement de XlWhole par XlPart dans la formule FIND, a bien permis à la macro de retrouver le NomAntibo dans les chaines de caractères des NomProduits.

    Ayant testé la macro avec les vraies listes de produits et d’antibiotiques, je constate maintenant 1 anomalie :
    Pour chaque NomAntibio, une fois la première valeur de NomProduit contenant le libellé de NomAntibio trouvée, la macro passe à l’antibiotique suivant, sans terminer la recherche dans la plage des NomProduits.
    Il y a donc des produits sans résultat car plusieurs NomProduit différents contiennent le même NomAntibio.

    Pour l’instant je n’arrive pas à régler ce point (le « next » est il mal placé ? besoin d’une 2eme boucle « for » et comment l’imbriquer?) – mes tentatives échouent.
    Pourrais-tu me prêter main forte là-dessus aussi ?

    Tu as déjà toute ma gratitude,
    Cordialement, Marino
    PS ton message indique de ne pas oublier de voter : de quoi s'agit-il ?

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    pour trouver toutes les occurrence il faut utiliser find next dans un do/loop après find
    je regarderais ce soir en rentrant
    pour le vote c'est pas obligatoire mais ca fait toujours plaisir un geste de reconnaissance


    pour voter si la réponse te conviens c'est le pouce en l' air sinon c'est le pouce en bas si c'est une réponse non satisfaisantes

    Nom : Capture.JPG
Affichages : 679
Taille : 41,9 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut
    Super!
    Merci et à plus tard, donc! (je ne manquerai pas de voter "pouce en l'air" !)
    Voici la dernière version du 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Sub Macro4_Recherche_NomAntibio_dans_NomProduit_OFLOXACINE()
     
    Dim Origine As Worksheet, Dest As Worksheet
    Set Origine = Worksheets("ListeAntibio")
    Set Dest = Sheets("ListeProduits")
     
     
    Dim NomAntibio As Variant
    Dim NomProduit As Variant
    Dim LigneProduit As Variant
    Dim LigneAntibio As Variant
     
    Dim reponse
    Dim i As Long
    Dim R As Range
     
     
    'Dans Origine :
     
    For i = 2 To Rows.Count
     
      NomAntibio = Origine.Cells(i, 1).Value
      LigneAntibio = Origine.Cells(i, 1).Row
     
     
        If NomAntibio = "" Then
        Exit For ' pour sortir de cette routine FOR...NEXT
     
        Else
     
     
                Set R = Dest.Range("A1:A1000").Find(What:=NomAntibio, LookIn:=xlFormulas, LookAt:=xlPart)
                'XlPart à la place de WlWhole, pour rechercher NomAntibio dans les chaines de caractères de NomProduit
     
             If R Is Nothing Then
     
                'reponse = MsgBox(NomAntibio & " non trouvé ", vbOKCancel, "Erreur")
                'If reponse = vbCancel Then Exit Sub
     
             Else
     
                LigneProduit = R.Row
     
                If Dest.Cells(LigneProduit, 1).Offset(0, 2).Value = "" Then
                'pour que les resultats des NomAntibio dont la chaine de caractère est incluse dans d'autres NomAntibio n'écrasent pas les résultats de ces derniers.
     
     
                NomAntibio = Origine.Cells(LigneAntibio, 2).Value
                CodeAntibio = Origine.Cells(LigneAntibio, 3).Value
     
                Dest.Cells(LigneProduit, 1).Offset(0, 1).Value = NomAntibio
                Dest.Cells(LigneProduit, 1).Offset(0, 2).Value = CodeAntibio
     
              End If
            End If
        End If
     
    Next
     
    '
    End Sub

  6. #6
    Membre confirmé
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 66
    Par défaut VBA - FindNext pour trouver toutes les occurences d'une fonction Find
    Bonjour Patrick,

    J'ai bien investigué la piste que tu me conseilles pour traiter toutes les occurences de la recherche Find (FindNext dans un do/loop après Find).
    Il me semble que je ne suis plus très loin de la solution, mais je ne sais pas corriger une erreur de compil concernant la ligne surlignée en jaune "Set R= .FindNext (R)". Le correcteur indique "Ref Incorrecte ou Non Qualifiée".
    Pourrais-tu m'aider à sortir de l'impasse ?

    D'avance tous mes remerciements
    Marino

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Sub Macro5()
    ' =Macro4 avec do loop
     
    Dim Origine As Worksheet, Dest As Worksheet
    Set Origine = Worksheets("ListeAntibio")
    Set Dest = Sheets("ListeProduits")
     
     
    Dim NomAntibio As Variant
    Dim LigneProduit As Variant
    Dim LigneAntibio As Variant
    Dim FirstAddress As String
     
     
    Dim reponse
    Dim i As Long
    Dim R As Range
     
     
    'Dans Origine :
     
    For i = 2 To Rows.Count
     
      NomAntibio = Origine.Cells(i, 1).Value
      LigneAntibio = Origine.Cells(i, 1).Row
     
     
        If NomAntibio = "" Then
        Exit For ' pour sortir de cette routine FOR...NEXT
     
            Else
     
            Set R = Dest.Range("A1:A1000").Find(What:=NomAntibio, LookIn:=xlFormulas, LookAt:=xlPart)
            'XlPart à la place de WlWhole, pour rechercher NomAntibio dans les chaines de caractères de NomProduit
     
     
                If R Is Nothing Then
     
                'reponse = MsgBox(NomAntibio & " non trouvé ", vbOKCancel, "Erreur")
                'If reponse = vbCancel Then Exit Sub
     
                Else  'equivalent à : If Not R Is Nothing Then
     
                FirstAddress = R.Address 'repérage du 1er résultat trouvé
     
                Do
     
                LigneProduit = R.Row
     
                    If Dest.Cells(LigneProduit, 1).Offset(0, 2).Value = "" Then
                    'pour que les resultats des NomAntibio dont la chaine de caractère est incluse dans d'autres NomAntibio n'écrasent pas les résultats de ces derniers.
     
                    NomAntibio = Origine.Cells(LigneAntibio, 2).Value
                    CodeAntibio = Origine.Cells(LigneAntibio, 3).Value
     
                    Dest.Cells(LigneProduit, 1).Offset(0, 1).Value = NomAntibio
                    Dest.Cells(LigneProduit, 1).Offset(0, 2).Value = CodeAntibio
     
                    End If
     
                Set R = .FindNext(R)
     
                Loop While Not R Is Nothing And R.Address <> FirstAddress
     
                End If
     
        End If
     
    Next
    '
    '
    End Sub

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

Discussions similaires

  1. [AC-2010] Utiliser valeur d'une liste de choix dans une liste déroulante d'un autre formulaire
    Par Sébastien1609 dans le forum Macros Access
    Réponses: 1
    Dernier message: 11/06/2015, 15h31
  2. [LibreOffice][Base de données] Recuperer une liste de tables et une liste de champs d'une table sur LibreOffice & OpenOffice
    Par gerard.sauvage dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 08/04/2014, 12h35
  3. Réponses: 2
    Dernier message: 26/05/2007, 17h28
  4. [Debutant]Remplacer une liste de valeur par une liste de val
    Par Sebbo dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/03/2006, 12h15
  5. [VBA] Comment utiliser Access avec Excel
    Par MxPx_23 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/02/2006, 12h00

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