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 celluleMerci 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
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 Submerci.
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).value2Ca 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