Rechercher une ligne en fonction de 2 critères sur 2 colonnes différentes
Bonjour, je suis actuellement bloqué sur cette question.
Je reçois un tableau non structuré qui se trouve dans un onglet vrac que je souhaite mettre dans un tableau structuré situé sur un autre onglet.
Pour cela je dois comparer les valeurs des colonnes A et B entre les tableaux des 2 onglets.
Je dois donc chercher la valeur de la première colonne de la première ligne du tableau structuré dans la première colonne de l'onglet en vrac.
Une fois la valeur trouvée je dois vérifier que la valeur de la seconde colonne de la ligne identifiée de l'onglet vrac est bien aussi égale à celle de la seconde colonne de la première ligne du tableau structuré.
Si c'est bien le cas je copie la valeur de la cellule de la 3e colonne de la ligne identifiée du fichier vrac dans la 3e colonne de la ligne identifiée du tableau structuré.
Si la valeur de la 2e colonne ne correspond pas, alors je cherche l'occurrence suivante de la première ligne du tableau structuré dans la 1e colonne de l'onglet vrac et ainsi de suite.
Une fois la ligne trouvée ou inexistante, je continue avec la seconde ligne du tableau structuré et ainsi de suite jusqu'à la fin du tableau structuré.
Il peut y avoir des lignes inexistantes dans l'un ou l'autre des tableaux par contre il ne peut y avoir qu'une seule combinaison colonne a et b correspondante.
j'ai testé un code mais il ne semble pas fonctionner je vous le mets malgré tout, au cas ou cela pourrait vous aider.
Sub test()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TSD As ListObject 'déclare la variable TSD (Tableau Structuré de destination)
Set CS = ThisWorkbook 'Ouvre l'URL du classeur source en ligne
Set OD = CS.Worksheets("Tableau") 'définit l'onglet destination OD
Set OS = CS.Worksheets("Vrac") 'définit l'onglet source OS
Set TSD = OD.ListObjects("FUP") 'définit le tableau structuré de destination
Dim NbRows As Long 'déclare la variable NbRows (nombre de ligne du fichier source)
Dim i As Integer 'déclare la variable i (ligne en cours de test)
Dim LE As Integer
Dim ZL As String 'déclare une variable de valeur de cellule
Dim c As Range
OS.Activate
NbRows = OS.Range("B" & Rows.Count).End(xlUp).Row
For i = 2 To NbRows 'Boucle qui parcours les lignes
Set c = TSD.ListColumns("Nom").DataBodyRange.Find(OS.Cells(i, 1).Value)
If Not c Is Nothing And TSD.ListColumns("Nom").DataBodyRange(LE) = OS.Cells(i, 2).Value Then
LE = c.Row
ZL = OS.Cells(i, 3).Value 'défini ZL (Valeur de la cellule "Date de transport prévue (SRDC)" de ligne i)
TSD.ListColumns("age").DataBodyRange(LE) = ZL 'donne la valeur à la cellule "Auto ETD" du TSD de la ligne correspondant au numéro de VOR de ligne en cours i
Else
Set c = TSD.ListColumns("Nom").DataBodyRange.FindNext(c)
End If 'fin de alcondition Then 'si aucune occurrence n'est trouvée ou si TSD ne contient pas encore de ligne
Next i 'passe à la ligne suivante de la boucle
End Sub 'fin de la macroLe fichier original est un fichier contenant des informations confidentielles. J'ai donc créé un fichier test qui a le même principe pour que vous puissiez l'utiliser si nécessaire. Je pense que je devrais pouvoir adapter votre code à mon cas.
Pour des raisons liées au vrai fichier sur lequel j'ai besoin de cette macro, je suis obligé de passer par du VBA.
Merci par avance pour votre aide.
Bonne journée
bonjour,
si on fait tout en mémoire, c'est presque immediatement.
Sub teste()
Dim aV, LO, Noms, aOut, i, r as variant
Set LO = Sheets("tableau").ListObjects("FUP") 'votre tableau structuré
Noms = [offset(fup,,,,1)&"|"&offset(fup,,1,,1)] 'matrice avec combinaison des noms+prénoms de FUP
ReDim aOut(1 To UBound(Noms), 1 To 1) 'préparer une matrice des résultat
aV = Sheets("vrac").Range("A1").CurrentRegion 'le tableau vrac --> matrice
For i = 2 To UBound(aV) 'boucle cette matrice
r = Application.Match(aV(i, 1) & "|" & aV(i, 2), Noms, 0) 'trouver la première ligne avec nom+prénom dans noms (donc dans le tableau structuré
If IsNumeric(r) Then aOut(r, 1) = aV(i, 3) 'si trouvé = copier age dans la matrice aOut
Next
LO.DataBodyRange.Columns(3).Value = aOut 'copier cette matrice vers le tableau structuré.
End SubBonjour , tout d'abord un grand merci pour votre aide. Cette solution semble tres interessante mais je ne comprend le fonctionnement des lignes
Noms = [offset(fup,,,,1)&"|"&offset(fup,,1,,1)] 'matrice avec combinaison des noms+prénoms de FUP
ReDim aOut(1 To UBound(Noms), 1 To 1) 'préparer une matrice des résultatje n'arrive pas à les adapter à mon tableau sans avoir une erreur de type 13.
pourriez vous svp me detailler le fonctionnement pour que je puisse les adapter ou si vous avez une idee de l origine de cette erreur?
merci par avance pour votre aide.
Bonne journée
bonjour,
vous avez un tableau nommé "FUP" dans votre fichier et les 2 premières colonnes de ce tableau sont le nom et le prénom. Le reste du tableau n'est pas intéressant pour le moment. On a aussi la fonction Excel "Decaler" https://support.microsoft.com/fr-fr/office/decaler-decaler-fonction-c8de19ae-dd79-4b9b-a14e-b4d906d1... qui est le même que "Offset" en anglais. Donc si je traduis la partie entre les "[ ]", on voit là :
anglais : offset(fup,,,,1)&"|"&offset(fup,,1,,1) ---> français : decaler(fup;;;;1) & "|" & decaler(fup;;1;;1), donc on joint les noms et prénoms avec le charactère "|" comme séparateur.
Les [ ] est un ancien command qui sert à "evaluer" le contenu de la partie dedans et le résultat sera une matrice (1D) avec autant d'éléments qu'il y a des lignes dans votre tableau "FUP".
Si cela cause des problèmes, c'est que votre tableau "FUP" n'existe pas ou il y a des lignes avec des noms ou prénoms avec des erreurs.
La ligne suivante ReDim aOut(1 To UBound(Noms), 1 To 1) : on boucle toutes les lignes du tableau "FUP" et le résultat, on l'écrit vers la 3ième colonne de FUP. Pour gagner du temps, au lieu de le faire ligne par ligne, on l'écrit une fois à la fin de la macro, donc on doit préparer une matrice temporaire (2D) avec le même nombre de lignes que le tableau "FUP", donc le nombre d'éléments de la matrice "Noms" qu'on a crée dans la ligne précédente et une colonne.
Donc : vous devez remplacer "FUP" par le nom de votre tableau structuré et eventuellement le 3ième argument de la fonction "Offset" dépendant de la colonne du nom ou prénom
Compris ? Cette méthode est exceptionnellement rapide parce qu'il n'y a qu'un "READ" des 2 plages (les 2 tableaux) et un "WRITE" (la 3ième colonne de FUP)