Extraire des données avec des entrées a critères variables

Je crois que je me suis embarqué dans quelque chose que je ne maitrise pas.
Je n'arrive pas à adapter. Le resultat donne "non trouvé".

Merci.

8nomenclature.xlsm (277.67 Ko)

Non, non vous avez très bien compris et bien adapté le code à votre problème.

Les 2 erreurs sont :

  1. Dans votre fichier ci-joint la macro lit la ligne 28 de la feuille "jeu de barres" alors que les valeurs à rechercher sont en ligne 2. Mais j'imagine que vous avez simplement supprimé des lignes et oublié de mettre à jour. Si jamais, dans le commandbutton pour correspondre il faut TrouverRef(.Range("H2"), .Range("P2"), .Range("Z2"))
  2. Le second, qui je pense est le vrai noeud de votre problème : dans la cellule "nombre de poles" de votre jeu de barres, vous avez "3P" ou "3P+N". Mais dans le tableau de recherche (JdB / Tableau1) ces valeurs n'apparaissent pas dans la colonne correspondante !! On a 3 ou 4. Donc forcément aucune équivalence n'est trouvée.

Il faut que la cellule dans Jeu de Barres et la colonne de Tableau1 contiennent les mêmes valeurs.

Vous y êtes presque.

Bonjour,

Fichier corrigé, cela fonctionne ! Merci.
Dernière question avant de clôturer le sujet. Je souhaite récupérer la colonne d'a coté référence qui s'appelle Désignation.
J'ai crée une deuxième fonction de recherche. Il y a plus simple ?

Merci.

Bonjour,

Félicitations !

Pour garder les choses simples, le plus facile c'est de copier/coller la fonction TrouverRef (en dessous dans son module), de la renommer en TrouverDesi puis de changer simplement la colonne renvoyée (2 au lieu de 1).

Cela donne (module1 complet) :

Option Explicit

' nom du tableau de recherche
Public Const TBL_NAME As String = "Tableau1"

Public Function TrouverRef(c1 As String, c2 As String, c3 As String)
  Dim tblData
  tblData = Range(TBL_NAME).ListObject.DataBodyRange.Value

  ' on suppose c1 dans colonne3, c2 colonne4, c3 colonne5 et ref dans colonne1
  Dim i As Long
  For i = LBound(tblData, 1) To UBound(tblData, 1)
    If _
       (Abs(StrComp(CStr(tblData(i, 3)), c1, vbTextCompare)) + _
        Abs(StrComp(CStr(tblData(i, 4)), c2, vbTextCompare)) + _
        Abs(StrComp(CStr(tblData(i, 5)), c3, vbTextCompare))) = 0 Then
      ' on change la colonne a renvoyer dans la ligne ci-après
      ' (1 pour la Reference, 2 pour la designation)
      TrouverRef = CStr(tblData(i, 1))
      Exit Function
    End If
  Next i

  TrouverRef = "non trouvé"
End Function

Public Function TrouverDesi(c1 As String, c2 As String, c3 As String)
  ' recuperation des valeurs de "Tableau1" dans la variable tblData
  Dim tblData
  tblData = Range(TBL_NAME).ListObject.DataBodyRange.Value

  ' parcours des lignes (indice i) et recherche des equivalences dans les 3 colonnes
  '   strcomp renvoie 1 ou -1 si textes differents, et 0 si egaux
  '   donc somme des absolues = 0 si les 3 sont egaux
  '   CStr sert à convertir une valeur "Variant" en texte, pour utiliser StrComp
  Dim i As Long
  For i = LBound(tblData, 1) To UBound(tblData, 1)
    If (Abs(StrComp(CStr(tblData(i, 3)), c1, vbTextCompare)) + _
        Abs(StrComp(CStr(tblData(i, 4)), c2, vbTextCompare)) + _
        Abs(StrComp(CStr(tblData(i, 5)), c3, vbTextCompare))) = 0 Then

      ' on change la colonne a renvoyer dans la ligne ci-après
      ' (1 pour la Reference, 2 pour la designation)
      TrouverDesi = CStr(tblData(i, 2))

      ' on quitte la fonction en avance si la ligne a ete trouvée
      Exit Function

    End If
  Next i

  ' si on arrive ici, c'est qu'on a lu tout le tableau1 et que l'on n'a détécté aucune équivalence
  ' => donc non touvé
  TrouverDesi = "non trouvé"
End Function

Je vous ai commenté la fonction TrouverDesi si cela peut aider/confirmer votre compréhension. De manière générale dans l'éditeur VBA, si vous avez une interrogation sur un mot-clé, vous pouvez cliquer (gauche) dessus pour y placer le curseur puis appuyer sur F1. Cela vous ouvrira la page d'aide correspondante. Sinon Google tout naturellement est extrêmement bien fourni en formation VBA. Et enfin le forum bien évidemment

Maintenant, il ne vous reste plus qu'à appeler cette nouvelle fonction dans votre CommandButton_Click, comme ceci :

Private Sub CommandButton2_Click()
  With ThisWorkbook.Worksheets("Jeu de barres")  ' with pour récupérer les valeurs depuis l'autre feuille (avec .Range)
    ' ecriture reference
    Me.Range("b3").Value = TrouverRef(.Range("H2"), .Range("P2"), .Range("Z2"))
    ' ecriture designation
    Me.Range("c3").Value = TrouverDesi(.Range("H2"), .Range("P2"), .Range("Z2"))
  End With
End Sub

Oui c'est bien ce que j'ai fait et ça fonctionne.
Merci pour votre aide.

Merci pour votre retour, n'oubliez pas de clôturer.

Bonne journée

Rechercher des sujets similaires à "extraire donnees entrees criteres variables"