[RESOLU] Excel : position d'une valeur dans un tableau

  • Initiateur de la discussion Initiateur de la discussion Hieu
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Hieu

XLDnaute Impliqué
Bonjour,

Je cherche deux solutions pour résoudre mon problème :
1ere:
Je cherche une façon non macro pour trouver la position d'une valeur dans un tableau. Dans mon exemple, en cellule e18 et e19, j'obtiens successivement la ligne et la colonne. Mais je passe par un subterfuge que je souhaiterai éviter.

2eme:
En créant une function:
VB:
Function MaLigne(val, r As Range)    ' bien sûr, ça ne marche pas ^^
For j = 1 To UBound(r, 2)
For i = 1 To UBound(r, 1)
    If val = r(i, j) Then MaLigne = i
Next i
Next j
End Function

Merci d'avance,
 

Pièces jointes

Dernière édition:
Bonsoir Hieu,

Pour les formules, s'il n'y a pas de doublons, on peut utiliser en E18 et E19 :
Code:
=SOMMEPROD((D4:K11=E16)*LIGNE(D4:K11))-LIGNE(D4:K11)+1
=SOMMEPROD((D4:K11=E16)*COLONNE(D4:K11))-COLONNE(D4:K11)+1
Edit : en masquant par MFC les résultats <=0.

Mais cette fonction VBA matricielle fonctionne même s'il y a des doublons :
Code:
Function LigneColonne(val, r As Range)
Dim c As Range, a(1 To 2)
Set c = r.Find(val, , xlValues, xlWhole, xlByRows)
If c Is Nothing Then
  a(1) = "": a(2) = ""
Else
  a(1) = c.Row - r.Row + 1: a(2) = c.Column - r.Column + 1
End If
LigneColonne = a 'vecteur ligne
End Function
On peut l'utiliser en E18 et E19 sans validation matricielle :
Code:
=INDEX(LigneColonne(E16;D4:K11);1)
=INDEX(LigneColonne(E16;D4:K11);2)
ou avec validation matricielle en bloc sur E18:E19 :
Code:
=TRANSPOSE(LigneColonne(E16;D4:K11))
Bonne nuit.
 
Dernière édition:
Bonsoir @ tous,
en cas de doublons
pour les lignes, en E18 :
Code:
=SIERREUR(PETITE.VALEUR(SI($D$4:$K$11=$E$16;LIGNE(INDIRECT("1:"&LIGNES($D$4:$K$11))));COLONNES($E:E));"")
@ valider par Ctrl+Shift+Enter
@ tirer vers la droite

pour les colonnes, en E19 :
Code:
=SIERREUR(PETITE.VALEUR(SI($D$4:$K$11=$E$16;TRANSPOSE(LIGNE(INDIRECT("1:"&COLONNES($D$4:$K$11)))));COLONNES($E:E));"")
@ valider par Ctrl+Shift+Enter
@ tirer vers la droite


@ + +
 
Salut à tous,

Merci pour ces solutions; Je retiens la solution excel de job qui utilise des fonctions que je connais bien (enfin, je croyais ^^)
Un petit doute:

SOMMEPROD((D4:K11=E16)*LIGNE(D4:K11)) ' renvoie un scalaire
LIGNE(D4:K11) ' renvoie un vecteur

comment l'équation fait-elle pour additionner avec la bonne composante ?

Pour la function:
Je ne maitrise pas le r.Find(val, , xlValues, xlWhole, xlByRows).
C'est un ctrl+f ? Je ne comprends pas ce que tu mets comme paramètre ? Lorsque tu mets " ", c'est le paramètre par défaut ?

Merci,

ps : Il n'y a pas de doublons, dans les tableaux.
 
Re, salut djidi59430 (en effet vous n'avez pas compris), salut mon cher R@chid,

@ Hieu : j'ai mis -LIGNE(D4:K11)+1 pour n'avoir qu'une seule référence (au cas où l'on nommerait le tableau).
La formule en E18 renvoie une matrice mais seul son 1er élément est récupéré dans la cellule.

Je reviens sur la 1ère solution (par formule) s'il peut y avoir des doublons.

En E18, formule matricielle à valider par Ctrl+Maj+Entrée :
Code:
=MIN(SI(D4:K11=E16;LIGNE(D4:K11)))-LIGNE(D4:K11)+1
En E19, formule normale utilisant E18 :
Code:
=EQUIV(E16;INDEX(D4:K11;E18;);0)
Edit : si aucune valeur n'est trouvée, utiliser une MFC pour masquer la valeur <= 0 et la valeur d'erreur, ou compléter les 2 formules :
Code:
=SIERREUR(EXP(LN(MIN(SI(D4:K11=E16;LIGNE(D4:K11)))-LIGNE(D4:K11)+1));"")
=SIERREUR(EQUIV(E16;INDEX(D4:K11;E18;);0);"")
Aller au lit, re-bonne nuit.
 
Dernière édition:
Bonjour Hieu, le forum,

Pour ce qui est de la méthode Find de la fonction VBA voyez l'aide Excel ou le web pour la liste des arguments.

On n'est jamais obligé d'écrire les noms des arguments mais alors il faut les mettre dans l'ordre prévu.

Au post #1 vous vouliez utiliser un tableau VBA pour faire la recherche, c'est aussi une bonne solution :
Code:
Function LigneColonne(val, r As Range)
Dim a(1 To 2), t, ncol%, i&, j%
a(1) = "": a(2) = ""
If r(1) = val Then a(1) = 1: a(2) = 1
If r.Count > 1 Then 'au moins 2 éléments nécessaires
  t = r 'matrice, plus rapide
  ncol = UBound(t, 2)
  For i = 1 To UBound(t)
    For j = 1 To ncol
      If t(i, j) = val Then a(1) = i: a(2) = j: GoTo 1
  Next j, i
End If
1 LigneColonne = a 'vecteur ligne
End Function
Bonne journée.
 
B
Bonsour®
Bonjour,

pour résoudre mon problème :

En créant une function:
VB:
Function MaLigne(val, r As Range)    ' bien sûr, ça ne marche pas ^^
For j = 1 To UBound(r, 2)
For i = 1 To UBound(r, 1)
    If val = r(i, j) Then MaLigne = i
Next i
Next j
End Function
de même que JOB75 😉
autre exploitation de la fonction VBA Find :
upload_2016-9-24_21-52-18.png
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
626
Retour