RechercheV sur deux critère dans un deuxieme classeur

Bonjour,

J'ai une petite difficulté pour faire une RechercheV sur deux critères en code VBA.

Je voudrais remplir le classeur "TABLEAU DE SUIVI 2018" par rapport au "N° BC" et "Lignes", en allant rechercher les valeurs contenues dans un autre classeur "BASE_ENGAGEMENT", en code VBA.

Je suppose qu'il faut que je passe par un "SI" et "AND" mais je n'arrive pas à formuler cette RechercheV en VBA.

Est-ce que quelqu'un pourrais m'aider, s'il vous plait ?

Je vous en remercie par avance et je vous souhaite une bonne fin de journée.

Kris.

Bonjour,

Déjà, tu ne peux pas utiliser la référence "A1" avec FormulaR1C1, tu dois utiliser la référence R1C1 ensuite, RechercheV n'admets pas de If, Or ou And, tu lui passes une valeur à rechercher dans la première colonne de la plage (colonne complètement à gauche)avec recherche approximative (vrai) ou exacte (faux). Tu peux voir avec Find() ou encore avec Like si la recherche est plus appriximative

Bonsoir,

Je ne connais pas find() mais je vais essayer de creuser le sujet.

Faut juste que j'arrive à écrire le bon code afin de retrouver mais données. Si vous avez des suggestions je suis preneur.

Car ce que je souhaite faire c'est une mise à jour du classeur "TABLEAU DE SUIVI 2018" lors que je clic sur le bouton "Mise à jour".

Le clic sur le bouton me permet de faire les actions suivante :

  • l'ouverture du classeur "BASE_ENGAGEMENTS" sans l'affiché à l'écran
  • rechercher les valeurs "N° BC" et "Ligne"dans le classeur "BASE_ENGAGEMENTS" qui sont saisies dans "TABLEAU DE SUIVI 2018"
  • prendre ou copier la valeur recherchée dans le classeur "BASE_ENGAGEMENTS" et la collée dans le classeur "TABLEAU DE SUIVI 2018"

Par exemple :

Je souhaite inscrire dans le classeur "TABLEAU DE SUIVI 2018" le "N° TIERS" du premier engagement "17ABC00001", ligne "1"

Lorsque je clic sur le bouton de mise à jour :

  • Le classeur "BASE_ENGAGEMENTS" s'ouvre sans être affiché
  • Comparaison des valeurs "N° BC" et "Ligne" dans les deux classeurs
  • La valeur trouvée serait "10001" dans le classeur "BASE_ENGAGEMENTS"
  • Je copie la valeur et je la colle dans "N° TIERS" du classeur "TABLEAU DE SUIVI 2018"
  • Le classeur "BASE_ENGAGEMENTS" se ferme

Comment en code VBA, je pourrais retranscrire ces actions ? Faut-il que je modifie par code les deux classeur afin de concaténer le "N° BC" et "Ligne" et ainsi pouvoir retrouver la valeur que je cherche ?

Bonne soirée.

Bonjour,

Dans ce cas, c'est Find() qu'il te faut utiliser.

Une piste de ce que j'ai compris et à adapter :

Sub Test()

    Dim ClsSuivi As Workbook
    Dim ClsBase As Workbook
    Dim PlgSuivi As Range
    Dim PlgBase As Range
    Dim Cel As Range
    Dim CelTrouve As Range

    Set ClsSuivi = ThisWorkbook
    Set ClsBase = Workbooks.Open("C:\BASE_ENGAGEMENTS_VILLE.xls") '<--- attention à inscrire le chemin complet pour éviter des surprises !

    'défini la plage des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne B à partir de B16
    'attention, rien ne doit se trouver sous la colonne B (aucune valeur autres que celles propre à la colonne B
    With ClsSuivi.Worksheets("FEUILLE EXEMPLE"): Set PlgSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'défini la plage de recherche sur la colonne E de la feuille "feuille1" à partir de la ligne 2
    With ClsBase.Worksheets("feuille1"): Set PlgBase = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With

    'tous les codes sont recherchés
    For Each Cel In PlgSuivi

        'effectue la recherche
        Set CelTrouve = PlgBase.Find(Cel.Value, , xlValues, xlWhole)

        'si trouvé, récupère la valeur située en colonne H pour la mettre en colonne D
        If Not CelTrouve Is Nothing Then Cel.Offset(, 2).Value = CelTrouve.Offset(, 3).Value

    Next Cel

End Sub

Bonjour Theze,

Merci pour cette avancé et surtout pour les explications que tu as mis dans le code. Je comprends facilement le code que tu m'as donné.

Par contre j'ai deux valeurs recherchées pour une ligne car en fait pour un bon de commande je peux avoir plusieurs lignes. C'est pour cela que je pensé à la concaténation de ces deux valeurs.

Bonne journée

Bonsoir,

J'ai travaillé un peu le code de Theze, mais je n'arrive pas à obtenir le résultat voulu, j'ai réussi à concaténer les valeurs afin de les comparer dans les deux tableaux. Mais, et oui il y a un mais, rien ne se passe.

Voici le code :

Private Sub Mise_a_jour_Click()

Dim ClassSuivi As Workbook
Dim ClassBase As Workbook
Dim PlageSuivi As Range
Dim PlageBase As Range
Dim Cel As Range
Dim CelTrouve As Range

Set ClassSuivi = ThisWorkbook
Set ClassBase = Workbooks.Open("F:\Travail\TABLEAU A FAIRE\2018\BASE_ENGAGEMENTS.xls")

'définition de la page des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne D à partir de la ligne 16 soit B16
'attention, ne rien mettre sous la colonne B soit aucune valeur
With ClassSuivi.Worksheets("FEUILLE EXEMPLE"):
    Set PlageSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)):
End With

'définition de la plage de recherche sur la colonne A suite concaténation de la feuille "feuille1" à partir de la ligne 2
With ClassBase.Worksheets("feuille1"):
    ClassBase.Worksheets("feuille1").Columns("A").Insert Shift:=xlToRight
    'Concaténation des valeurs colonne F et N
    ClassBase.Worksheets("feuille1").Range("A2").Value = ClassBase.Worksheets("feuille1").Range("F2").Value & "/" & ClassBase.Worksheets("feuille1").Range("N2").Value
    'Integrer la répition sur toutes les lignes de "feuille1" ?

    Set PlageBase = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)):
End With

'tous les codes seront recherchés
For Each Cel In PlageSuivi

    'affecte la recherche
    Set CelTrouve = PlageBase.Find(Cel.Value, , xlValues, xlWhole)

    'si trouvé, récupère la valeur située en colonne I pour la mettre en colonne E
    If Not CelTrouve Is Nothing Then Cel.Offset(, 1).Value = CelTrouve.Offset(, 8).Value

Next Cel

ClassBase.Close (SaveChanges = False)

End Sub

Je me demande où sont mes erreurs. Un petit coup de main serais la bienvenue.

Bonne soirée.

Bonjour,

Tu peux faire une recherche et si trouvé, un contrôle de la valeur située sur la même ligne dans la colonne que tu souhaites.

Mon code modifié. Si la valeur cherchée est trouvée en colonne E, compare les valeurs des colonnes C et M des classeurs correspondants :

Sub Test()

    Dim ClsSuivi As Workbook
    Dim ClsBase As Workbook
    Dim PlgSuivi As Range
    Dim PlgBase As Range
    Dim Cel As Range
    Dim CelTrouve As Range

    Set ClsSuivi = ThisWorkbook
    Set ClsBase = Workbooks.Open("F:\Travail\TABLEAU A FAIRE\2018\BASE_ENGAGEMENTS.xls")

    'défini la plage des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne B à partir de B16
    'attention, rien ne doit se trouver sous la colonne B (aucune valeur autres que celles propre à la colonne B
    With ClsSuivi.Worksheets("FEUILLE EXEMPLE"): Set PlgSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'défini la plage de recherche sur la colonne E de la feuille "feuille1" à partir de la ligne 2
    With ClsBase.Worksheets("feuille1"): Set PlgBase = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With

    'tous les codes sont recherchés
    For Each Cel In PlgSuivi

        'effectue la recherche
        Set CelTrouve = PlgBase.Find(Cel.Value, , xlValues, xlWhole)

        'si trouvé, compare si la valeur est identique entre la colonne C de la feuille "FEUILLE EXEMPLE"
        'et la colonne M de la feuille "feuille1" si c'est OK, récupère la valeur située en colonne H pour la mettre en colonne D
        If Not CelTrouve Is Nothing Then

            If CLng(CelTrouve.Offset(, 8).Value) = CLng(Cel.Offset(, 1).Value) Then Cel.Offset(, 2).Value = CelTrouve.Offset(, 3).Value

        End If

    Next Cel

End Sub

Bonjour Theze,

Premièrement je te remercie grandement car du coup j'ai pu avance dans mon tableau car ton code fonctionne vraiment bien.

Par contre j'ai un petit soucis qu'il faut que je règle. En effet, le problème que je rencontre c'est le soucis que dans le "TABLEAU DE SUIVI" Je peux avoir dans la colonne "N°BC" je peux avoir plusieurs ligne avec le même numéro et la distinction de ces lignes c'est la colonne "Ligne" dans laquelle je met un numéro. Par conséquent la ligne 2 n'est pas trouvé.

Par exemple :

Je peux avoir deux ligne avec dans la colonne "N° BC" 17CDE00010. Sur la première ligne de ce numéro dans la colonne "Ligne" j'aurais le numéro 1 et sur la deuxième ligne j'aurais le numéro 2.

Lorsque j'exécute le code la première ligne 17CDE00010 et 1 est trouvée et se remplie mais la ligne 17CDE00010 et 2 ne se remplie pas et donc n'est pas trouvée.

Je pense qu'il faut que je passe par la concaténation ou une autre ligne de code pour résoudre ce problème.

Je te remercie encore pour l'aide que tu m'as fournie.

Bon dimanche.

Bonjour,

En bouclant une fois la valeur trouvée :

Sub Test()

    Dim Cls As Workbook
    Dim ClsSuivi As Workbook
    Dim ClsBase As Workbook
    Dim PlgSuivi As Range
    Dim PlgBase As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    Dim Existe As Boolean
    Dim Adr As String

    Set ClsSuivi = ThisWorkbook

    For Each Cls In Workbooks
        If Cls.Name = "BASE_ENGAGEMENTS.xls" Then Existe = True: Exit For
    Next Cls

    If Existe = False Then
        Set ClsBase = Workbooks.Open(ClsSuivi.Path & "\BASE_ENGAGEMENTS.xls")
    Else
        Set ClsBase = Workbooks("BASE_ENGAGEMENTS.xls")
    End If
    'défini la plage des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne B à partir de B16
    'attention, rien ne doit se trouver sous la colonne B (aucune valeur autres que celles propre à la colonne B
    With ClsSuivi.Worksheets("FEUILLE EXEMPLE"): Set PlgSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'défini la plage de recherche sur la colonne E de la feuille "feuille1" à partir de la ligne 2
    With ClsBase.Worksheets("feuille1"): Set PlgBase = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With

    'tous les codes sont recherchés
    For Each Cel In PlgSuivi

        'effectue la recherche
        Set CelTrouve = PlgBase.Find(Cel.Value, , xlValues, xlWhole)

        'si trouvé, compare si la valeur est identique entre la colonne C de la feuille "FEUILLE EXEMPLE"
        'et la colonne M de la feuille "feuille1" si c'est OK, récupère la valeur située en colonne H pour la mettre en colonne D
        If Not CelTrouve Is Nothing Then

            Adr = CelTrouve.Address

            Do

                If CLng(CelTrouve.Offset(, 8).Value) = CLng(Cel.Offset(, 1).Value) Then Cel.Offset(, 2).Value = CelTrouve.Offset(, 3).Value

                Set CelTrouve = PlgBase.FindNext(CelTrouve)

            Loop While CelTrouve.Address <> Adr

        End If

    Next Cel

End Sub

Bonjour,

Merci Theze pour ce code apparemment il fonctionne bien sauf que lorsque celui-ci est lancé, il ouvre deux fois le classeur BASE_ENGAGEMENTS, et Excel tourne en continue. Je n'arriva pas à cerner la ligne de code qui pourrait provoquer cela.

Je vous redit encore merci beaucoup pour cette aide qui m'est précieuse.

Bonne journée à vous.

Bonjour,

Tester en pas à pas (appuis successifs sur la touche F8) pour voir le comportement au niveau de ces lignes de code :

'cherche dans les noms des classeurs ouverts si il trouve "BASE_ENGAGEMENTS.xls"
For Each Cls In Workbooks
    If Cls.Name = "BASE_ENGAGEMENTS.xls" Then Existe = True: Exit For
Next Cls

'si non, il l'ouvre
If Existe = False Then
    Set ClsBase = Workbooks.Open(ClsSuivi.Path & "\BASE_ENGAGEMENTS.xls")
'sinon, il l'affecte à la variable
Else
    Set ClsBase = Workbooks("BASE_ENGAGEMENTS.xls")
End If

si il est ouvert, au niveau de cette ligne :

If Existe = False Then

Existe doit être à Vrai (True) si la variable est à Faux (False) et que le classeur est ouvert, contrôler l'orthographe des noms

Bonsoir Theze,

Je te remercie grandement pour l'ai de que tu m'as donné. Le code fonctionne très bien j'ai juste remarqué qu'il manqué un End if dans celui-ci.

Il me reste juste a compléter le code par rapport au nom de la feuille dans le classeur de suivi. En effet, je voudrais garder la "FEUILLE EXEMPLE" propre et juste copier cette feuille en la renommant autrement tout en gardant le code. Faut que je travail dessus pour y arriver.

En tout cas encore merci pour cette aide qui m'est précieuse.

Bonne soirée à vous.

Bonjour,

Je n'ai pas encore trouver de solution pour copier la feuille exemple du classeur suivi. Je vais essayé de mettre le nom de la feuille active en variable mais je suis pas sur d'y arriver.

Bonne journée.

Bonjour,

Les explications dans le code :

Sub Test()

    Dim Cls As Workbook
    Dim ClsSuivi As Workbook
    Dim ClsBase As Workbook
    Dim Fe As Worksheet
    Dim PlgSuivi As Range
    Dim PlgBase As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    Dim Existe As Boolean
    Dim Adr As String

    Set ClsSuivi = ThisWorkbook

    'parcours les classeurs ouverts pour savoir si "BASE_ENGAGEMENTS.xls" est ouvert...
    For Each Cls In Workbooks
        If Cls.Name = "BASE_ENGAGEMENTS.xls" Then Existe = True: Exit For
    Next Cls

    'si non, l'ouvre sinon, l'affecte à la variable
    If Existe = False Then
        Set ClsBase = Workbooks.Open(ClsSuivi.Path & "\BASE_ENGAGEMENTS.xls")
    Else
        Set ClsBase = Workbooks("BASE_ENGAGEMENTS.xls")
    End If

    'parcours les feuilles pour savoir si la feuille portant le nom "Nouvelle feuille" a déjà été créée
    'si oui, message et fin. Dans ce cas, il faut renommer manuellement (ou par code) la feuille portant
    'le nom "Nouvelle feuille"
    For Each Fe In ClsSuivi.Worksheets
        If Fe.Name = "Nouvelle feuille" Then MsgBox "La feuille 'Nouvelle feuille' existe déjà !": Exit Sub
    Next Fe

    'copie la feuille en fin de collection
    'si rien n'est précisé après "Copy", comme par exemple ci-dessous :
    'ClsSuivi.Worksheets("FEUILLE EXEMPLE").Copy
    'la feuille sera copiée dans un nouveau classeur
    ClsSuivi.Worksheets("FEUILLE EXEMPLE").Copy , Worksheets(Worksheets.Count)

    'la feuille nouvellement créée devenant la feuille active, l'affecte à la variable objet et la renomme
    Set Fe = ActiveSheet
    Fe.Name = "Nouvelle feuille"

    'défini la plage des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne B à partir de B16
    'attention, rien ne doit se trouver sous la colonne B (aucune valeur autres que celles propre à la colonne B
    With Fe: Set PlgSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'défini la plage de recherche sur la colonne E de la feuille "feuille1" à partir de la ligne 2
    With ClsBase.Worksheets("feuille1"): Set PlgBase = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With

    'tous les codes sont recherchés
    For Each Cel In PlgSuivi

        'effectue la recherche
        Set CelTrouve = PlgBase.Find(Cel.Value, , xlValues, xlWhole)

        'si trouvé, compare si la valeur est identique entre la colonne C de la feuille "FEUILLE EXEMPLE"
        'et la colonne M de la feuille "feuille1" si c'est OK, récupère la valeur située en colonne H pour la mettre en colonne D
        If Not CelTrouve Is Nothing Then

            Adr = CelTrouve.Address

            Do

                If CLng(CelTrouve.Offset(, 8).Value) = CLng(Cel.Offset(, 1).Value) Then Cel.Offset(, 2).Value = CelTrouve.Offset(, 3).Value

                Set CelTrouve = PlgBase.FindNext(CelTrouve)

            Loop While CelTrouve.Address <> Adr

        End If

    Next Cel

End Sub

Bonjour Theze,

Merci beaucoup pour ton code.

J'ai du mal m'exprimer sur mon précédant message. Le code que tu m'as fourni fonctionne très bien sauf qu'il me créer une nouvelle feuille.

En faite, je voudrais pouvoir copier la FEUILLE EXEMPLE sans avoir à corriger le nom de la feuille dans le code. Pour être plus précis :

  • Je fais une copie de la FEUILLE EXEMPLE, je le fais moi même sans code
  • Je renomme la FEUILLE EXEMPLE, je le fais moi même sans code, par exemple FEUILLE X

Ce qui fait que j'ai une feuille X qui comporte le code avec le nom de FEUILLE EXEMPLE. Je voudrais éviter d'avoir à aller dans le code pour modifier FEUILLE EXEMPLE en FEUILLE X. Donc soit j'exécute le code seulement sur la feuille active, soit j'exécute le code sur l'ensemble des feuilles du classeur.

J'hésite encore mais je pense qu'il serait plus pratique d'exécuter le code sur l'ensemble des feuilles du classeur de suivi.

Et c'est là que je bloque.

Encore merci pour l'aide.

Bonne journée.

Bonjour,

Donc, il suffit juste que la feuille que tu viens de copier et renommer soit la feuille active et dans ce cas, le code est :

Sub Test()

    Dim Cls As Workbook
    Dim ClsSuivi As Workbook
    Dim ClsBase As Workbook
    Dim Fe As Worksheet
    Dim PlgSuivi As Range
    Dim PlgBase As Range
    Dim Cel As Range
    Dim CelTrouve As Range
    Dim Existe As Boolean
    Dim Adr As String

    Set ClsSuivi = ThisWorkbook

    'parcours les classeurs ouverts pour savoir si "BASE_ENGAGEMENTS.xls" est ouvert...
    For Each Cls In Workbooks
        If Cls.Name = "BASE_ENGAGEMENTS.xls" Then Existe = True: Exit For
    Next Cls

    'si non, l'ouvre sinon, l'affecte à la variable
    If Existe = False Then
        Set ClsBase = Workbooks.Open(ClsSuivi.Path & "\BASE_ENGAGEMENTS.xls")
    Else
        Set ClsBase = Workbooks("BASE_ENGAGEMENTS.xls")
    End If

    'la feuille active de CE classeur !
    Set Fe = ClsSuivi.ActiveSheet

    'défini la plage des codes à rechercher sur la feuille "FEUILLE EXEMPLE" sur la colonne B à partir de B16
    'attention, rien ne doit se trouver sous la colonne B (aucune valeur autres que celles propre à la colonne B
    With Fe: Set PlgSuivi = .Range(.Cells(16, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

    'défini la plage de recherche sur la colonne E de la feuille "feuille1" à partir de la ligne 2
    With ClsBase.Worksheets("feuille1"): Set PlgBase = .Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With

    'tous les codes sont recherchés
    For Each Cel In PlgSuivi

        'effectue la recherche
        Set CelTrouve = PlgBase.Find(Cel.Value, , xlValues, xlWhole)

        'si trouvé, compare si la valeur est identique entre la colonne C de la feuille "FEUILLE EXEMPLE"
        'et la colonne M de la feuille "feuille1" si c'est OK, récupère la valeur située en colonne H pour la mettre en colonne D
        If Not CelTrouve Is Nothing Then

            Adr = CelTrouve.Address

            Do

                If CLng(CelTrouve.Offset(, 8).Value) = CLng(Cel.Offset(, 1).Value) Then Cel.Offset(, 2).Value = CelTrouve.Offset(, 3).Value

                Set CelTrouve = PlgBase.FindNext(CelTrouve)

            Loop While CelTrouve.Address <> Adr

        End If

    Next Cel

End Sub

Merci énormément Theze.

Je l'avais presque ce midi j'ai juste oublié de préciser le classeur de suivi. Je peux marquer le sujet résolu.

Encore merci.

Rechercher des sujets similaires à "recherchev deux critere deuxieme classeur"