Recherche VBA entre plusieurs feuilles
Bonjour,
Je suis à la recherche d'un moyen pour centraliser dans une feuille toutes les références devant être commandé chez tel ou tel fournisseur se trouvant dans d'autre feuille du même fichier.
J'ai déjà essayé avec la fonction RECHERCHEV et INDEX mais je souhaite m'affranchir d'une colonne avec des Numéros.
En fouillant déjà sur ce forum j'ai trouvé une solution qui m'a l'air de bien fonctionner du moment que je ne sors pas de la feuille.
Sauriez vous, s'il vous plait, m'aider a comprendre comment je transposer cela a mon cas ?
Je vous remercie très sincèrement.
Cordialement,
Benoit
Bonjour Benoit & bienvenue,
peux-tu spécifier ta demande ?
ou est la référence à chercher (par exemple : Sheet1 A1) ?
dans quel feuille ou les feuilles doit-on rechercher cette référence ?
@+
Bonjour,
Isabelle
Voici ton classeur où j'ai modifié une feuille que j'ai nommé MATERIEL !
Clique sur le bouton situé sur la feuille TERRA pour voir le résultat :
Bonjour Benoit & bienvenue,
peux-tu spécifier ta demande ?
ou est la référence à chercher (par exemple : Sheet1 A1) ?
dans quel feuille ou les feuilles doit-on rechercher cette référence ?
@+
Merci beaucoup, c'est réellement un plaisir de trouver encore de vrai forum.
Je souhaites, si possible, pouvoir inscrire dans l'onglet "Samse" le nom d'un fournisseur en "D4"
et à partir de ce nom récupérer dans les onglets "TERRA" et "GROS OEUVRE" les informations tel que la référence du matériel, le nom et la quantité total.
Et de reporter ces informations sous forme de tableau dans mon onglet "Samse" (Je pense d'ailleurs que cet onglet devrait plutôt s'appeler "bon de commande"=BDC)
En espérant avoir pu être plus clair. C'est toujours clair dans ma tête, mais je n'arrive pas forcément à bien le transposer à l'écrit.
Encore merci pour l'acceuil.
Bonjour,
Isabelle
Voici ton classeur où j'ai modifié une feuille que j'ai nommé MATERIEL !
Clique sur le bouton situé sur la feuille TERRA pour voir le résultat :
Suivi de Projet test Version 2.xlsm
Bonjour Isabelle,
Merci beaucoup, pour ce beau travail.
M'en voudrez vous si je disais que je ne comprends pas tout dans le code ?
Je vais aller lire les sujets sur le fonctionnement des objets
En tout cas merci pour le temps que vous m'avez déjà consacré.
Voici le code adapté aux deux feuilles avec un peu plus d'explications. Il te faut renommer la feuille "MATERIEL" en "BDC" comme tu le demande puis faire le test. J'ai rajouté une méthode de tri sur les fournisseurs en fin de code. Le code ci-dessous remplace celui que je t'ai donné ce matin :
Sub Test()
Dim Plage As Range
Dim Cel As Range
Dim Dico As Object
Dim Cle As Variant
Dim Lig As Long
Dim Adr As String
Set Dico = CreateObject("Scripting.Dictionary")
'récupère les fournisseurs sur la feuille "TERRA"
With Worksheets("TERRA"): Set Plage = .Range(.Cells(5, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With
'le dictionnaire sert à dédoublonner afin de n'avoir qu'une fois le nom du fournisseur
For Each Cel In Plage
If Cel.Value <> "" And Cel.Value <> "Fournisseur" And Cel.Value <> "N/A" Then Dico(Cel.Value) = ""
Next Cel
'récupère les fournisseurs sur la feuille "GROS OEUVRE"
With Worksheets("GROS OEUVRE"): Set Plage = .Range(.Cells(5, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With
For Each Cel In Plage
If Cel.Value <> "" And Cel.Value <> "Fournisseur" And Cel.Value <> "N/A" Then Dico(Cel.Value) = ""
Next Cel
With Worksheets("BDC")
'vide la feuille...
.Cells.ClearContents
'...et inscrit les entêtes de colonnes puis mets les entêtes en gras afin de les distinguer des valeurs
With .Range(.Cells(1, 1), .Cells(1, 5))
.Value = Array("Fournisseur", "Produit", "Référence", "Quantité", "Ouvrage")
.Font.Bold = True
End With
'effectue la recherche "TERRA" et inscrit le nom du fournisseur, le nom du produit, sa référence, la quantité et l'ouvrage...
For Each Cle In Dico.Keys
With Worksheets("TERRA"): Set Plage = .Range(.Cells(5, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With
Set Cel = Plage.Find(Cle, , xlValues, xlWhole)
If Not Cel Is Nothing Then
Adr = Cel.Address
Do
Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(Lig, 1).Value = Cel.Value
.Cells(Lig, 2).Value = Cel.Offset(, -3).Value
.Cells(Lig, 3).Value = Cel.Offset(, -1).Value
.Cells(Lig, 4).Value = Cel.Offset(, 2).Value
.Cells(Lig, 5).Value = "TERRA"
Set Cel = Plage.FindNext(Cel)
Loop While Cel.Address <> Adr
End If
Next Cle
'...puis passe à la feuille "GROS OEUVRE"
For Each Cle In Dico.Keys
With Worksheets("GROS OEUVRE"): Set Plage = .Range(.Cells(5, 5), .Cells(.Rows.Count, 5).End(xlUp)): End With
Set Cel = Plage.Find(Cle, , xlValues, xlWhole)
If Not Cel Is Nothing Then
Adr = Cel.Address
Do
Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(Lig, 1).Value = Cel.Value
.Cells(Lig, 2).Value = Cel.Offset(, -3).Value
.Cells(Lig, 3).Value = Cel.Offset(, -1).Value
.Cells(Lig, 4).Value = Cel.Offset(, 2).Value
.Cells(Lig, 5).Value = "GROS OEUVRE"
Set Cel = Plage.FindNext(Cel)
Loop While Cel.Address <> Adr
End If
Next Cle
'Tri les données de la feuille "BDC" par fournisseur
Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 5).End(xlUp))
Plage.Sort Plage(1, 1), xlAscending
.Select
End With
End Sub
Voici le code adapté aux deux feuilles avec un peu plus d'explications. Il te faut renommer la feuille "MATERIEL" en "BDC" comme tu le demande puis faire le test. J'ai rajouté une méthode de tri sur les fournisseurs en fin de code. Le code ci-dessous remplace celui que je t'ai donné ce matin :
Merci beaucoup c'est plus que parfait.
Vraiment Merci Beaucoup !!!!!!!
Bonjour,
C'est avec grand plaisir