Extraire une valeur d'un tableau

Walles -  
Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   -
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.

11 réponses

  1. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    1. Walles
       
      Un seul mot, PARFAIT!

      Merci beaucoup Mike
      0
  2. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
  3. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    1. Walles
       
      En effet, cela marche parfaitement maintenant, merci !

      Et tu ne saurais pas comment faire la meme chose en VBA par hasard?
      0
  4. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    1. Walles
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fahora Messages postés 949 Statut Membre 68
     
    Bonjour ,

    As tu essayé :

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

    a adapter,

    Cordialement,
    0
    1. Walles
       
      J'ai essaye en adaptant maintenant j'ai "REF" comme resultat ...
      0
    2. Fahora Messages postés 949 Statut Membre 68
       
      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
  7. Walles
     
    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
  8. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
  9. Walles
     
    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
  10. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Re,

    quel code as tu retenu !
    0
  11. Walles
     
    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
  12. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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