Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Index / Equiv + Une condition en VBA

11 réponses
Avatar
géjoun
Bonjour,

Je cherche à créer cette formule en VBA

=INDEX($U$30:$U$38;EQUIV(C9;$S$30:$S$38;0))

pour pouvoir l'incrémenter sur d'autres lignes en dessous, et de façon à ce
que je puisse quand même rentrer une autre valeur dans la cellule si la
valeur de C9 ne renvoie rien dans la plage $S$30:$S$38.

Ex : la formule en VBA recherche si elle trouve la valeur à renvoyer par
rapport à C9; et si la valeur rentrée en C9 ne renvoie rien, rien ne se
passe, mais je peux quand même rentrer dans la cellule une autre valeur.

J'ai essayé de voir ce que donnait cette formule avec l'enregistreur de
macro, je croyais me retrouver avec un code du style
INDEX(range("$U$30:$U$38");MATCH(C9;range("$S$30:$S$38");0)) ; mais ce que
j'obtiens n'a rien à voir, et je suis un peu perdu.

Quelqu'un peut-il m'aider?

Merci!

--
géjoun
dam-mail2006@ifrance.com
/Enlever l''année pour m''écrire.../

10 réponses

1 2
Avatar
Thierry
Bonjour,

une solution consiste à utiliser les fct excel dans VBA.
Avec :
Application.worksheetfunction.match (pour équiv) et .index , le tout
affecter à une variable pour un usage pratique.




Bonjour,

Je cherche à créer cette formule en VBA

=INDEX($U$30:$U$38;EQUIV(C9;$S$30:$S$38;0))

pour pouvoir l'incrémenter sur d'autres lignes en dessous, et de façon à ce
que je puisse quand même rentrer une autre valeur dans la cellule si la
valeur de C9 ne renvoie rien dans la plage $S$30:$S$38.

Ex : la formule en VBA recherche si elle trouve la valeur à renvoyer par
rapport à C9; et si la valeur rentrée en C9 ne renvoie rien, rien ne se
passe, mais je peux quand même rentrer dans la cellule une autre valeur.

J'ai essayé de voir ce que donnait cette formule avec l'enregistreur de
macro, je croyais me retrouver avec un code du style
INDEX(range("$U$30:$U$38");MATCH(C9;range("$S$30:$S$38");0)) ; mais ce que
j'obtiens n'a rien à voir, et je suis un peu perdu.

Quelqu'un peut-il m'aider?

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../


Avatar
géjoun

une solution consiste à utiliser les fct excel dans VBA.
Avec :
Application.worksheetfunction.match (pour équiv) et .index , le tout
affecter à une variable pour un usage pratique.



Bonjour,

Qu'appelles-tu "affecter à une variable"; peux-tu détaillé un peu plus,
parce que là ça ressemble à de l'hébreux pour moi...
Et si tu pouvais me mettre un exemple de ce que donne le code avec
Application.worksheetfunction, ce serait encore mieux :-) .

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../

Avatar
JB
Bonjour,

ActiveCell.Formula = "=INDEX($u$30:$U$38,MATCH(C9,$S$30:$S$38,0))"

Cordialement JB
Avatar
géjoun

ActiveCell.Formula = "=INDEX($u$30:$U$38,MATCH(C9,$S$30:$S$38,0))"

Cordialement JB


BonjourJB,

J'ai du mal expliquer ce que je veux.

Ton code fonctionne, mais il me recréé la fonction dans la cellule active à
l'ouverture du classeur (avec un Private Sub Workbook_Open() ); hors moi, ce
que je cherche à faire, c'est d'avoir une macro qui tourne en fond et qui me
fait l'équivalent de cette formule dans les cellules comprises de N9 à N150;
mais si je me positionne sur une des cellules dans laquelle la macro "opère",
il n'y a rien dans la cellule, et je peux quand même rentrer une autre valeur.

Par exemple, je rentre en C9 une valeur qui ne renvoie rien par rapport à la
plage de cellules à laquelle elle se réfère ($u$30:$U$38); alors la macro ne
m'affiche rien dans la cellule, et si je veux rentrer une valeur
manuellement, c'est possible.
Et inversement, si je rentre en C9 une valeur qui correspond à uen donnée
dans la plage de cellules ($u$30:$U$38); alors la macro m'affiche la valeur
correspondante.

Donc, au vue de ta réponse, je suppose que c'est pas aussi simple que je le
pensais... :-(

--
géjoun

/Enlever l''année pour m''écrire.../

Avatar
JB
Je ne comprends pas!

Renvoie la valeur dans une variable:x= Application.Index([U30:U38],
Application.Match([C9], [S30:S38], 0))

JB
Avatar
géjoun
Bonjour,

Désolé pour la réponse un peu tardive, long week end oblige... :-)

Je reprends mon explication en essayant d'être le plus clair possible.

En premier, j'ai une plage de cellules qui va de N9 jusqu'à N150 dans
lesquelles je cherche à mettre l'équivalent de la formule
=INDEX($U$30:$U$38;EQUIV(C9;$S$30:$S$38;0)) en vba de façon à ce que, lorsque
je me positionne dans n'importe lesquelles de ces cellules, aucune formule
n'apparaisse à l'écran dans la cellule (cellule vide); mais qu'il y ait quand
même la formule VBA qui fonctionne en arrière plan; et me recherche quand
même les correspondances de C9, C10, C11...etc... par rapport à la matrice
définie dans la formule ($U$30:$U$38).

Mais en plus, en second, je voudrais que, lorsqu'en C9, C10, C11 il y a une
valeur de rentrée qui ne correspond à aucune valeur de la matrice
$U$30:$U$38, que la formule ne renvoie pas d'erreur de façon à pouvoir
rentrer moi même une valeur non contenue dans la matrice $U$30:$U$38.

Par exemple dans la matrice, il y a de S30 à S38 les valeurs de 1 à 9 qui
correspondent respectivement en U30 à U38 de 10 à 90; par rapport à la
formule, actuellementsi je rentre en C9 la valeur "1", ça me renvoie 10 en
N9; si je rentre "3", ça me renvoie 30...etc...; mais je veux pouvoir rentrer
en C9 d'autres valeurs que celles de 1 à 10 sans que ça me renvoie d'erreur
dans la cellule, et sans pour autant avoir à écraser la formule (d'où ma
demande par rapport à une formule en VBA qui vérifie quand même si la valeur
rentrée en C9 renvoie une des valeurs de la matrice de base, ou sinon, ne
fait rien).

J'espère avoir été plus précis.

Je joins ici un exemple de fichier avec ce que je souhaite obtenir:

http://cjoint.com/?fdkNbJKHZi

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../





Je ne comprends pas!

Renvoie la valeur dans une variable:x= Application.Index([U30:U38],
Application.Match([C9], [S30:S38], 0))

JB


Avatar
JB
Bonjour,


=SI(ESTNA(EQUIV(C9;$S$30:$S$38;0));"";INDEX($U$30:$U$38;EQUIV(C9;$S$30:$S$38;0)))

JB
Avatar
géjoun
Bonjour JB,

C'est effectivement cette formule que je cherche à reproduire, mais en vba.
J'étais bien arrivé à ce résultat en intégrant un SI et un ESTERREUR, mais
je n'arrive pas à l'adapter en vba de sorte à ce qu'elle laisse la cellule
vide lorsqu'elle s'exécute (qu'elle n'affiche pas la formule dans la barre
des formules lorsqu'on clique à l'intérieur de la cellule), et qu'elle
n'affiche pas d'erreur si on rentre une valeur cherchée non comprise dans la
matrice.

Le but étant que dans mon tableau, je puisse revenir sur une valeur cherchée
déja saisie (et qui est non présente dans la matrice, et que la formule ne
renvoie pas d'erreur / ne tient pas compte); pour la remplacer par une
nouvelle présente dans la matrice, et que la formule la redétecte et
fonctionne encore en renvoyant alors la bon résultat par rapport au tableau
de recherche.

Mais est-ce possible d'avoir cette formule qui fonctionne en vba en arrière
plan de façon invisible?

Merci!

--
géjoun

/Enlever l''année pour m''écrire.../




Bonjour,


=SI(ESTNA(EQUIV(C9;$S$30:$S$38;0));"";INDEX($U$30:$U$38;EQUIV(C9;$S$30:$S$38;0)))

JB




Avatar
géjoun
Salut,

Ce n'est pas possible d'obtenir ce que je souhaite en vba? La fonction qui
fonctionne de façon "invisible"?

Merci!

--
géjoun

/Enlever l'année pour répondre.../



géjoun nous expliquait:


Bonjour JB,

C'est effectivement cette formule que je cherche à reproduire, mais
en vba. J'étais bien arrivé à ce résultat en intégrant un SI et un
ESTERREUR, mais je n'arrive pas à l'adapter en vba de sorte à ce
qu'elle laisse la cellule vide lorsqu'elle s'exécute (qu'elle
n'affiche pas la formule dans la barre des formules lorsqu'on clique
à l'intérieur de la cellule), et qu'elle n'affiche pas d'erreur si on
rentre une valeur cherchée non comprise dans la matrice.

Le but étant que dans mon tableau, je puisse revenir sur une valeur
cherchée déja saisie (et qui est non présente dans la matrice, et que
la formule ne renvoie pas d'erreur / ne tient pas compte); pour la
remplacer par une nouvelle présente dans la matrice, et que la
formule la redétecte et fonctionne encore en renvoyant alors la bon
résultat par rapport au tableau de recherche.

Mais est-ce possible d'avoir cette formule qui fonctionne en vba en
arrière plan de façon invisible?


Avatar
JB
http://cjoint.com/?fhn1pl4ia7

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 And Target.Count = 1 Then
Application.EnableEvents = False
x = Application.Index([U30:U38], Application.Match(Target, [S30:S38],
0))
Cells(Target.Row, 14) = IIf(IsError(x), Empty, x)
Application.EnableEvents = True
End If
End Sub

JB
1 2