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

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

  • position_v0.xlsx
    10.1 KB · Affichages: 107
Dernière édition:

job75

XLDnaute Barbatruc
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:

R@chid

XLDnaute Barbatruc
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


@ + +
 

Hieu

XLDnaute Impliqué
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.
 

job75

XLDnaute Barbatruc
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:

job75

XLDnaute Barbatruc
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.
 

Modeste geedee

XLDnaute Barbatruc
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
 

Discussions similaires

Statistiques des forums

Discussions
312 106
Messages
2 085 352
Membres
102 871
dernier inscrit
Maïmanko