Rechercher valeur dans plusieurs feuilles sur plusieurs lignes

Bonjour le forum,

j'ai un fichier dans lequel j'aimerais faire un vlookup en VBA, mais...

chaque feuille peux contenir max 300 lignes et j'ai plusieurs feuilles (plus de 100).

J'aimerai que mon vlookup ressenble à ceci :

en cellule"Z3" =vlookup(V28;"touteslesfeuilles $X$3:$AW$300;x;False)

je n'ai aucune idée de comment le faire (ni même par quoi commencer...)

serais-t'il possible que cette macro sois automatique lors du remplissage?

Il s'agit de tableau intercroisé, donc j'ai dû supprimer la sécurité d'Excel pour les références circulaire (une valeur peux être entrée dans une feuille ou une autre), serais t'il donc possible que si une valeur est déjà introduite dans la cellule cible (ici "Z3") la macro n'efface pas cette valeur.

Si vous pouviez déjà me donner une piste pour le partie Vlookup sur plusieurs ligne dans plusieurs feuilles ce serais super.

Grand merci d'avance

Pour info, j'ai déjà quelque chose qui tourne en formule et qui combine 125Vlookup qui ressemble à ceci :

Formule pour les lignes 2-25 (mais aussi pour les 26-50, 51-75, 76-100 et 101-125)

=IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$2;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$3;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$4;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$5;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$6;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$7;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$8;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$9;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$10;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$11;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$12;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$13;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$14;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$15;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$16;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$17;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$18;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$19;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$20;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$21;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$22;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$23;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$24;TRUE);8;FALSE); IFERROR(VLOOKUP(Blanco_Reserve!$V28;INDIRECT(Legend!$H$25;TRUE);8;FALSE);""))))))))))))))))))))))))

Introduite dans le "name manager" et ensuite mise ensemble avec :

=IF(C_T_Look_002_025<>"";C_T_Look_002_025;IF(C_T_Look_026_050<>"-";C_T_Look_026_050;IF(C_T_Look_051_075<>"";C_T_Look_051_075;IF(C_T_Look_076_100<>"";C_T_Look_076_100;IF(C_T_Look_101_125<>"";C_T_Look_101_125;"-")))))

ce qui rend le fichier super lourd au moment de la copie de feuille.

Bonjour,

Sans VBA, essaie :

=RECHERCHEV(V28;ASSEMB.V(Feuil1:Feuil3!X3:AE300);8;0)

Feuil1 étant la première feuille et Feuil3 la dernière.

Daniel

Bonjour DanielC,

je ne connaissais pas cette fonction, je vais essayer (je dois juste encore trouver la traduction en anglais avant... ).

Mes feuiiles ne sont pas nommées "Feuill1,..." donc je vais regarder comment adapter le formule et reviens vers le forum ensuite.

Dejà merci pour cette piste.

Si ça peut t'avancer, l'équivalent anglais de RECHERCHEV, c'est VLOOKUP et ASSEMB.V, c'est VSTACK.

Daniel

Bonjour DanielC,

après avoir essayé cette fonction me facilite la vie, mais n'est pas ce que je recherche. Je vais la maintenir le temps de trouver mieux.

Merci pour m'avoir fait découvrir cette nouvelle fonction qui est très pratique.

Bonjour,

Il me semble que c'est ce que tu as demandé ?

=vlookup(V28;"touteslesfeuilles $X$3:$AW$300;x;False)

Peux-tu dire où je me trompe ?

Daniel

Tu as bien visé et cette fonction simplifie fortement les Vlookup imbriqué, mais elle dois s'écrire dans les cellules et donc ne change rien aux références circulaires (vu que je ne veux pas doubler la taille de mon tableau qui peux contenir 300 lignes sur 20 collones de recherche sur plus de 100 sheets).

En résumé, toutes les feuilles sont intercroisées, si je place une valeur dans l'une, cette valeur est indiquée dans une autre, mais inversément aussi.

Si je ne trouve pas de solution VBA ce sera l'option que j'envisagerai sans hésiter.

La macro récupère la première valeur trouvée. Essaie :

Sub test()
  Dim Sh As Worksheet, C As Range
  If [Z3] <> "" Then Exit Sub
  For Each Sh In Sheets
    With Sh
      For Each C In .[X3:X300]
        If C = [V28] Then
          [Z3] = C.Offset(, 7)
          Exit Sub
        End If
      Next C
    End With
  Next Sh
End Sub

Daniel

Bonjour,

Désolé de la lenteur de la réponse.

J'ai légérement adapté la macro et elle fonctionne parfaitement pour 1 cellule.

Il faut créer maintenant une boucle pour les cellules Z3 à Z300.

mais aucune idée si je dois utiliser FOR Each ou FOR next, ni comment implémenter cette boucle pour la ligner de la cellule Z

Sub test()
  Dim Sh As Worksheet, C As Range

    If [Z12] <> "" Then Exit Sub
    For Each Sh In Sheets
      With Sh
        For Each C In .[X3:X300]
          If C = [V12] Then
            [Z12] = C.Offset(, 2)
            Exit Sub
          End If
        Next C
     End With
   Next Sh
End Sub

Bonjour,

Essaie :

Sub test()
  Dim Sh As Worksheet, C As Range, X As Range

  For Each X In [Z3:Z300]
    If X <> "" Then Exit Sub
    For Each Sh In Sheets
      With Sh
        For Each C In .[X3:X300]
          If C = X.Offset(, -4) Then
            X = C.Offset(, 2)
            Exit Sub
          End If
        Next C
     End With
   Next Sh
  Next X
End Sub

Daniel

Bonjour DanielC,

en enlevant le "exit sub" en dessous de X = C.Offset(, 2) ca fonctionne super, par contre il essaye les 300 lignes, même si je n'en ai pas toujours 300.

est-il possible de prendre comme range ligne 3 jusque dernière ligne trouvée en colonne V?

Bonjour,

Essaie :

Sub test2()
  Dim Sh As Worksheet, C As Range, X As Range

  For Each X In Range("V3", Cells(Rows.Count, "V").End(xlUp))
    If X.Row = 7 Then Stop
    If X <> "" Then Exit Sub
    For Each Sh In Sheets
      With Sh
        For Each C In .[X3:X300]
          If C = X.Offset(, -2) Then
            X = C.Offset(, 2)
          End If
        Next C
     End With
   Next Sh
  Next X
End Sub

Daniel

ca ne fonctionne pas du tout...

j'ai pensé à plus simple, vérifier avant de faire tourner la dernière macro "test" de ce post la valeur en V, et dès que la valeur est égale à rien mettre "stop" en Z, ou je place en V1 le nombre de loop qu'il dois faire via une simple formule de comptage...

Ce qui stopera la macro, car en fait la dernière macro "test" tourne en boucle sans s'arrêter.

Pourrais-tu me fournir un classeur de test parce que sans pouvoir tester, je ne peux que tâtonner...

Daniel

Pas de soucis, le sheet test est le "K25341 (122949)" il dois aller chercher les valeurs dans les autres sheets rouge

Je ne me rappelle plus pourquoi j'ai mis cette ligne :

If X <> "" Then Exit Sub

Ce qui fait que la macro ne s'exécute pas ?

C'est bon, c'est de ma faute.

Peux-tu me confirmer que la recherche se fait bien dans les colonnes X ?

Cette macro recherche dans les colonnes X et copie la valeur des colonnes Z correspondantes :

Sub test2()
  Dim Sh As Worksheet, C As Range, X As Range, L As Long

  deb = Timer
  With Sheets("K25341 (122949)")
    For Each X In Range("V3", Cells(Rows.Count, "V").End(xlUp)).Offset(, 4)
      If X <> "" Then Exit Sub
      For Each Sh In Sheets
        If Left(Sh.Name, 1) = "K" And Sh.Name <> "K25341 (122949)" Then
         With Sh
           L = .Range("A:A").Find("*", , , , xlByRows, xlPrevious).Row
           For Each C In .Range("X3:X" & L)
             If C = X.Offset(, -4) Then
               X = C.Offset(, 2)
             End If
           Next C
        End With
       End If
     Next Sh
    Next X
  End With
End Sub

Daniel

Bonjour Daniel,

Désolé de la lenteur de la réponse mais ca a été la folie au bureau et je n'ai plus eu le temps de me remettre sur mon fichier.

Cela fonctionne parfaitement, même si j'aurais voulus que la macro ne calcule pas les cellules "V" vide. Je reste sur ceci et j'adapte pour que cela fonctionne sur un activesheet et sur plusieurs colonnes (en changeant les offset je présume...).

Merci encore pour ton temps (et la macro )

Rechercher des sujets similaires à "rechercher valeur feuilles lignes"