Extraire une valeur d'un tableau

Fermé
Walles - 18 juil. 2016 à 11:34
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 - 20 juil. 2016 à 14:43
Bonjour a tous,

Je possède un tableau sur la feuille 1 avec plusieurs lignes et plusieurs colones, en abscisses j'ai le nom des articles et en ordonnées le diametre pour avoir le prix a l'intersection des deux.

Je souhaiterai, sur la feuille 2, avoir en A1 le nom, en A2 le diametre et en A3 une formule qui me sortirai le prix. J'ai essaye avec recherchev et rechercheh mais cela ne fonctionne pas.
J'ai écris:
=recherchv(A2, Feuille1!A1:F50,rechercheh(A1,Feuille1!A1:F50,1,2)2)

Mais j'ai comme resultat "VALEUR"...

J'ai aussi essaye avec index et equiv mais rien non plus.

Merci d'avance pour vos réponses.
A voir également:

11 réponses

Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
Modifié par Mike-31 le 19/07/2016 à 19:15
Re,

regarde simplement comme cela, boucle sur 100 lignes à partir de la première, à adapter

On Error Resume Next
For i = 1 To 100
Cells(i, 5) = Application.WorksheetFunction.Index(Range("List"), Application.Match(Cells(i, 2), Range("Num"), 0), Application.Match(Cells(i, 1), Range("Art"), 0))
Next

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
2
Un seul mot, PARFAIT!

Merci beaucoup Mike
0
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
Modifié par Mike-31 le 18/07/2016 à 13:37
Bonjour,

peut être comme cela, Feuil1 entre A2 et A20 les noms et entreb B1 et L1 les diamètres
Feuil2 en A1le nom recherché et en A2 le diamètre
=RECHERCHEV(A1;Feuil1!A1:L20;EQUIV(A2;Feuil1!A1:L1))

et complétée avec une gestion d'erreur
=SIERREUR(RECHERCHEV(A1;Feuil1!A1:L20;EQUIV(A2;Feuil1!A1:L1));"")

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
1
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
18 juil. 2016 à 14:12
Re,

il suffisait d'adapter tes plages
=RECHERCHEV(B1;Sheet1!A1:F20;EQUIV(Sheet2!A1;Sheet1!A1:F1))
ou
=INDEX(Sheet1!A1:F20;EQUIV(B1;Sheet1!A1:A20;0);EQUIV(A1;Sheet1!A1:F1;0))

je te conseille d'ajouter une gestion d'erreur
=SIERREUR(RECHERCHEV(B1;Sheet1!A1:F20;EQUIV(Sheet2!A1;Sheet1!A1:F1));"")
ou avec cette formule
=SIERREUR(INDEX(Sheet1!A1:F20;EQUIV(B1;Sheet1!A1:A20;0);EQUIV(A1;Sheet1!A1:F1;0));"")
1
En effet, cela marche parfaitement maintenant, merci !

Et tu ne saurais pas comment faire la meme chose en VBA par hasard?
0
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
18 juil. 2016 à 16:59
Re,

oui bien sur, voila un code à placer dans un module et à associer à un bouton ou incorporer dans un code
Sub test()
On Error Resume Next
[B5] = WorksheetFunction.VLookup(Sheets("Sheet2").Range("B1"), Sheets("Sheet1").Range("A1:F20"), Application.Match(Sheets("Sheet2").Range("A1"), Sheets("Sheet1").Range("A1:F1")))
End Sub

ou pour automatiser l'action e fonction des deux saisies Sheets(2)
clic droit sur l'onglet de ta feuille 2 et coller ce code résultat en B5 à adapter
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Range([B1], [B5]) = ""
End If
If Target.Address = "$B$1" Then
[B5] = WorksheetFunction.VLookup(Sheets("Sheet2").[B1], Sheets("Sheet1").[A1:F20], Application.Match(Sheets("Sheet2").[A1], Sheets("Sheet1").[A1:F1]))
End If
End Sub
1
Merci, cela fonctionne sur mon petit fichier test mais lorsque je l'importe sur mon vrai fichier il m'envoi :
"run-time error '1004':
Unable to get the VLookUp property of the WorksheetFunction class"

J'ai essayer de modifier le code mais rien a faire. Tu as une idee d'ou cela pourrait venir?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fahora Messages postés 814 Date d'inscription jeudi 24 septembre 2015 Statut Membre Dernière intervention 2 janvier 2023 68
18 juil. 2016 à 11:41
Bonjour ,

As tu essayé :

=INDEX(A1:F6;EQUIV(A1;feuille1!A1:F1);EQUIV(A2;feuille1!A1;A6))

a adapter,

Cordialement,
0
J'ai essaye en adaptant maintenant j'ai "REF" comme resultat ...
0
Fahora Messages postés 814 Date d'inscription jeudi 24 septembre 2015 Statut Membre Dernière intervention 2 janvier 2023 68
Modifié par Fahora le 18/07/2016 à 13:33
Peux tu joindre ton fichier , via le site cjoint.com, que je puisse regarder ?
Peut etre pas le fichier original , un fichier test ... Ou un fichier avec que quelques lignes.
0
Mike-31, cela me renvoi aussi "REF", ou une case blanche avec la gestion de l'erreur...

Voici le lien de mon fichier simplifie
http://www.cjoint.com/c/FGsmceFWs5B

Merci de votre aide
0
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
18 juil. 2016 à 18:06
Re,

contrôle bien tes bornes et nom de feuille Sheets("Sheet2") ou Sheets("Sheet1") et pour tes bornes Range("A1:F20") ou [A1:F20]

si tu n'y arrives pas donne moi le nom de l'onglet ou se trouve ta base de données ainsi que les bornes du tableau

ainsi que le nom de l'onglet ou se trouve les deux critères avec l'adresse des deux cellules et l'adresse de la cellule ou tu souhaite le résultat
et quel code tu as retenu


tu peux également utiliser ce code
Sub Macro3()
[B10] = Application.WorksheetFunction.Index(Sheets("Sheet1").Range("A1:F20"), Application.Match([B1], Sheets("Sheet1").Range("A1:A20"), 0), Application.Match([A1], Sheets("Sheet1").Range("A1:F1"), 0))
End Sub
0
Ca fonctionne avec le code Macro ! Merci.

Mais je suis de nouveau bloque... J'aimerai creer une boucle pour faire cela sur plusieurs lignes, et ceux jusqu'a ce qu'il y ait une cellule vide.

J'ai fait un "Do While Not (IsEmpty(ActiveCell)" mais en vain.
0
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
19 juil. 2016 à 13:09
Re,

quel code as tu retenu !
0
J'ai retenu le dernier, avec la macro. J'ai rajouter un variable sur les onglet pour pouvoir choisir le prix en fonction du fournisseur (avec un onglet par fournisseur). Ca fait :

Dim Ws1 as Worksheet
For Each Ws1 In Worksheets
If Ws1.Name=Range("A1").Value Then
[E6]=Application.WorksheetFunction.Index(Sheets(Range("A1").Value.Range("A8:F51"),Application.Match([C6],Sheets(Range("A1").Value).Range("A8:A51"),0)Application.Match([B6],Sheets(Range("A1").Value).Range("A8:F8"),0)
Exit For
End If
Next Ws1


Sur le fichier final je note le nom du fournisseur en A1, le nom de l'article en B6, le diametre en C6. et j'obtient le resultat en E6.
0
Mike-31 Messages postés 18310 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 mars 2024 5 073
Modifié par Mike-31 le 20/07/2016 à 14:44
Re,

alors je passe le statut de la discussion en résolu, mais cela de t’empêchera pas de revenir dans la discussion pour un complément d'information

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0