Boucle VBA - base de donnée - table de correspondance 2 critères résultat

J'essaie de créer une boucle qui ne fonctionne pas.

Il s'agit d'une boucle VBA qui parcourt une base de données dans une feuille Excel ("53") et recherche des correspondances en fonction d'une table située dans une autre feuille ("CLE2"). Si des correspondances sont trouvées, les résultats sont affichés dans une colonne spécifiée (colonne AR), située à la fin de la base de donnée.

merci de votre aide :

Dim ws As Worksheet
Dim plageDonnees As Range, plageCorrespondance As Range
Dim cellule As Range
Dim valeurCorrespondante1 As Variant
Dim valeurCorrespondante2 As Variant
Dim resultatColonne As Integer

' Spécifiez la feuille de calcul
Set ws = ThisWorkbook.Sheets("53")

' Spécifiez la plage de données à classer
Set plageDonnees = ws.Range("A2:S10")

' Spécifiez la table de correspondance (peut être dans une autre feuille)
Set plageCorrespondance = ThisWorkbook.Sheets("CLE2").Range("A2:C300")

' Spécifiez la colonne où afficher les résultats à droite
resultatColonne = 44 ' Colonne AR

' Boucle à travers chaque ligne dans la plage de données
For Each cellule In plageDonnees.Rows
' Réinitialise les valeurs correspondantes à chaque itération
valeurCorrespondante1 = Empty
valeurCorrespondante2 = Empty

If IsNumeric(cellule.Cells(1, 1).Value) Then
' Recherchez la correspondance pour la première variable dans la table
On Error Resume Next
valeurCorrespondante1 = Application.VLookup(CLng(cellule.Cells(1, 1).Value), plageCorrespondance, 1, False)
On Error GoTo 0

' Vérifiez si la première variable a été trouvée
If Not IsError(valeurCorrespondante1) And Not IsEmpty(valeurCorrespondante1) Then
' Recherchez la correspondance pour la deuxième variable
On Error Resume Next
valeurCorrespondante2 = Application.VLookup(CLng(cellule.Cells(1, 2).Value), plageCorrespondance, 2, False)
On Error GoTo 0

' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
If Not IsError(valeurCorrespondante2) And Not IsEmpty(valeurCorrespondante2) Then
cellule.Cells(1, resultatColonne).Value = valeurCorrespondante2
End If
End If
End If
Next cellule

Hello,

Si j'ai bien compris :

Dim ws As Worksheet
Dim plageDonnees As Range, plageCorrespondance As Range
Dim cellule As Range
Dim valeurCorrespondante1 As Variant
Dim valeurCorrespondante2 As Variant
Dim resultatColonne As Integer

' Spécifiez la feuille de calcul
Set ws = ThisWorkbook.Sheets("53")

' Spécifiez la plage de données à classer
Set plageDonnees = ws.Range("A2:S10")

' Spécifiez la table de correspondance (peut être dans une autre feuille)
Set plageCorrespondance = ThisWorkbook.Sheets("CLE2").Range("A2:A300")
Set plageCorrespondance2 = ThisWorkbook.Sheets("CLE2").Range("B2:B300")

' Spécifiez la colonne où afficher les résultats à droite
resultatColonne = 44 ' Colonne AR

' Boucle à travers chaque ligne dans la plage de données
For Each cellule In plageDonnees.Rows
' Réinitialise les valeurs correspondantes à chaque itération
valeurCorrespondante1 = Empty
valeurCorrespondante2 = Empty

If IsNumeric(cellule.Cells(1, 1).Value) Then
' Recherchez la correspondance pour la première variable dans la table
On Error Resume Next
valeurCorrespondante1 = Application.VLookup(CLng(cellule.Cells(1, 1).Value), plageCorrespondance, 1, False)
On Error GoTo 0

' Vérifiez si la première variable a été trouvée
If Not IsError(valeurCorrespondante1) And Not IsEmpty(valeurCorrespondante1) Then
' Recherchez la correspondance pour la deuxième variable
On Error Resume Next
valeurCorrespondante2 = Application.VLookup(CLng(cellule.Cells(1, 2).Value), plageCorrespondance2, 1, False)
On Error GoTo 0

' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
If Not IsError(valeurCorrespondante2) And Not IsError(valeurCorrespondante2) Then
cellule.Cells(1, resultatColonne).Value = valeurCorrespondante2
End If
End If
End If
Next cellule

Merci du retour ! pardon voici précision essentielle :

La table de correspondance ("CLE2") comprends 3 colonnes : 2 qui corresponds à 2 critères à contrôler et si présents rapporter un résultat en colonne 44 sur la base de donnée ("53"). Ce résultat est celui de la 3ème colonne de la table de correspondance ("CLE2").

Merci

Pour information, cela marche avec ce code pour 1 critère (sur table de correspondance). Mais impossible d'y arriver avec 2 critères.

' 1 critere
Dim ws As Worksheet
Dim plageDonnees As Range, plageCorrespondance As Range
Dim cellule As Range
Dim valeurCorrespondante As Variant
Dim resultatColonne As Integer

' Spécifiez la feuille de calcul
Set ws = ThisWorkbook.Sheets("INF BUD 53 chorus 2024")

' Spécifiez la plage de données à classer
Set plageDonnees = ws.Range("A2:S10000")

' Spécifiez la table de correspondance (peut être dans une autre feuille)
Set plageCorrespondance = ThisWorkbook.Sheets("CLE").Range("A2:B300")

' Spécifiez la colonne où afficher les résultats à droite
resultatColonne = 44 ' Colonne AR

' Boucle à travers chaque cellule dans la plage de données
For Each cellule In plageDonnees
' Réinitialise la valeur correspondante à chaque itération
valeurCorrespondante = Empty

' Recherchez la correspondance dans la table
On Error Resume Next
valeurCorrespondante = Application.VLookup(cellule.Value, plageCorrespondance, 2, False)
On Error GoTo 0

' Vérifiez si une correspondance a été trouvée
If Not IsError(valeurCorrespondante) Then
' Trouvé, affichez le résultat à droite de la cellule de données
ThisWorkbook.Sheets("INF BUD 53 chorus 2024").Cells(cellule.Row, resultatColonne).Value = valeurCorrespondante

'cellule.Offset(0, resultatColonne).Value = valeurCorrespondante

End If
Next cellule

5f-tests-v2.zip (686.50 Ko)

Hello,

Sub Coorespondance_V2()

    Dim ws As Worksheet
    Dim plageDonnees As Range, plageCorrespondance As Range
    Dim cellule As Range
    Dim valeurCorrespondante1 As Variant
    Dim valeurCorrespondante2 As Variant
    Dim resultatColonne As Integer

    ' Spécifiez la feuille de calcul
    Set ws = ThisWorkbook.Sheets("53")

    ' Spécifiez la plage de données à classer
    Set plageDonnees = ws.Range("F2:H5")

    ' Spécifiez la table de correspondance (peut être dans une autre feuille)
    Set plageCorrespondance = ThisWorkbook.Sheets("CLE2").Range("A2:A300")
    Set plageCorrespondance2 = ThisWorkbook.Sheets("CLE2").Range("B2:C300")

    ' Spécifiez la colonne où afficher les résultats à droite
    resultatColonne = 44 ' Colonne AR

    ' Boucle à travers chaque ligne dans la plage de données
    For Each cellule In plageDonnees.Rows
    ' Réinitialise les valeurs correspondantes à chaque itération
    valeurCorrespondante1 = Empty
    valeurCorrespondante2 = Empty

    ' Recherchez la correspondance pour la première variable dans la table
    On Error Resume Next
    valeurCorrespondante1 = Application.VLookup(cellule.Cells(1, 1).Value, plageCorrespondance, 1, False)
    On Error GoTo 0

    ' Vérifiez si la première variable a été trouvée
    If Not IsError(valeurCorrespondante1) And Not IsEmpty(valeurCorrespondante1) Then
    ' Recherchez la correspondance pour la deuxième variable
    On Error Resume Next
    valeurCorrespondante2 = Application.VLookup(cellule.Cells(1, 3).Value, plageCorrespondance2, 1, False)
    On Error GoTo 0
    ' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
    If Not IsError(valeurCorrespondante2) And Not IsError(valeurCorrespondante2) Then
    cellule.Cells(1, resultatColonne).Value = Application.VLookup(cellule.Cells(1, 3).Value, plageCorrespondance2, 2, False)

    End If
    End If
    Next cellule

End Sub

merci.

Petite dernière question : Parfois, seul le 1er critère sera suffisant pour afficher le résultat de la table de correspondance. Parfois les 2 critères seront nécessaire (comme dans le code ci-dessous). Si je veux enchainer les 2 codes, quelle est l'instruction ?

Bonjour,

En fait, ça ne fonctionne pas.

L'application Vlookup impose que la valeur de recherche de correspondance doit correspondre à des critères situés en 1ère colonne de la base de donnée. Est il possible d'utiliser une autre application pour faire matcher les correspondances (critère 1 puis critère 2) avec base de sonnée A2: X5 ? et donc sans que le critère 1 soit en colonne 1.

Merci

ou ajouter comme critère1 (colonne 1 - A2 de la base de donnée "53"), puis 2 puis3 pour un résultat en correspondance ?

pour prendre en compte les 3 colonnes dans la table de correspondance, utiliser la fonction INDEX et MATCH en combinaison ?

valeurCorrespondante = Application.WorksheetFunction.Index(plageCorrespondance.Columns(3), _
Application.WorksheetFunction.Match(cellule.Value, plageCorrespondance.Columns(1), 0))

ca ne fonctionne pas

Hello,

tu peux faire comme ceci :

 Spécifiez la table de correspondance (peut être dans une autre feuille)
    Set plageCorrespondance = ThisWorkbook.Sheets("CLE2").Range("A2:A300")
    Set plageCorrespondance2 = ThisWorkbook.Sheets("CLE2").Range("B2:B300")
' Recherchez la correspondance pour la première variable dans la table
    On Error Resume Next
    valeurCorrespondante1 = Application.Match(cellule.Cells(1, 1).Value, plageCorrespondance, 0)
    On Error GoTo 0
   On Error Resume Next
    valeurCorrespondante2 = Application.Match(cellule.Cells(1, 3).Value, plageCorrespondance2, 0)
    On Error GoTo 0
' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
    If Not IsError(valeurCorrespondante2) And Not IsError(valeurCorrespondante2) Then
numcol = 15 ' A adapter
    cellule.Cells(1, resultatColonne).Value = cells(valeurCorrespondante2,numcol).value2

Ca ne marche pas : 'erreur 2042'

Dim ws As Worksheet
Dim plageDonnees As Range, plageCorrespondance As Range, plageCorrespondance2 As Range
Dim cellule As Range
Dim valeurCorrespondante1 As Variant
Dim valeurCorrespondante2 As Variant
Dim resultatColonne As Integer

' Spécifiez la feuille de calcul
Set ws = ThisWorkbook.Sheets("53")

' Spécifiez la plage de données à classer
Set plageDonnees = ws.Range("A2:S300")

' Spécifiez la table de correspondance (peut être dans une autre feuille)
Set plageCorrespondance = ThisWorkbook.Sheets("CLE2").Range("A2:A300")
Set plageCorrespondance2 = ThisWorkbook.Sheets("CLE2").Range("B2:B300")

' Spécifiez la colonne où afficher les résultats à droite
resultatColonne = 44 ' Colonne AR

' Boucle à travers chaque ligne dans la plage de données
For Each cellule In plageDonnees.Rows
' Réinitialise les valeurs correspondantes à chaque itération
valeurCorrespondante1 = Empty
valeurCorrespondante2 = Empty

' Recherchez la correspondance pour la première variable dans la table
On Error Resume Next
valeurCorrespondante1 = Application.Match(cellule.Cells(1, 1).Value, plageCorrespondance, 0)
On Error GoTo 0

' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
If Not IsError(valeurCorrespondante1) And Not IsError(valeurCorrespondante1) Then

' Recherchez la correspondance pour la seconde variable dans la table
On Error Resume Next
valeurCorrespondante2 = Application.Match(cellule.Cells(1, 1).Value, plageCorrespondance2, 0)
On Error GoTo 0

' Si les deux variables sont trouvées, affichez le résultat en colonne spécifiée
If Not IsError(valeurCorrespondante2) And Not IsError(valeurCorrespondante2) Then

numcol = 3 'colonne C résultat de la feuille table de correspondance "CLE2"

cellule.Cells(1, resultatColonne).Value = Cells(valeurCorrespondante2, numcol).Value2

End If
End If
Next cellule

avec le fichier de test

6tests-v2.zip (687.97 Ko)
Rechercher des sujets similaires à "boucle vba base donnee table correspondance criteres resultat"