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

Petit problème ... A votre bon coeur ...

9 réponses
Avatar
michel.legeria
Bonjour,

Dans une feuille il y a 5 nombre entiers appartenant =E0 [1..20] sans doubl=
ons, rang=E9s dans les cellules A1:E1, j'appelle cette liste L1 et elle est=
ordonn=E9e.

Soit X (rang=E9 dans H1) un nombre appartenant aussi =E0 [1..20] pouvant fa=
ire doublon avec les chiffres constituant L1.

Je voudrais, dans les cellules=20
A2:E2 construire la liste L2 constitu=E9e de la liste L1 =F4t=E9e (=E9ventu=
ellement) de X.

Donc deux cas :
Si X appartient =E0 L1, L2 sera constitu=E9e des 4 chiffres de L1 diff=E9re=
nts de X ), dans l'ordre de L1.

Si X n'appartient pas =E0 L1 alors L2 sera =E9gale =E0 L1.

Exemple :

L1=3D{2,14,7,10,11}(rang=E9e dans A1:E1) et X=3D{10} alors L2 vaudra {2,14,=
7,11} rang=E9e dans A2:D2 (E2 vide).
=20
Autre exemple:
L1=3D{2,14,7,10,11}(rang=E9e dans A1:E1) et X=3D{20} alors L2 vaudra {2,14,=
7,10,11} rang=E9e dans A2:E2.

J'ai voulu faire =E7a avec des formules excel mais c'est trop compliqu=E9. =
Je sais le faire en VBA mais je ne sais pas comment passer comme argument u=
ne plage de cellule =E0 la fonction, lire cette plage de cellule dans le co=
de VBA, et faire une fonction qui retourne un tableau qui contruirait L2 da=
ns la feuille (en mode matrice, CTRL/SHIFT/ENTER).

Si quelqu'un veut m'aider se serait gentil.

Michel

9 réponses

Avatar
MichD
Bonjour,

Tu as essayé ceci :

Tu adaptes le nom de la feuille où l'action se déroule dans la procédure.
'------------------------------------------------
Sub test()
Dim X As Variant, T As Variant
Dim C As Range, B As Long

X = Application.InputBox("valeur de X", Type:=1)

If X = False Then Exit Sub
Application.ScreenUpdating = False

With Worksheets("Feuil1") 'Adapte le nom de la feuille
T = Application.Match(X, .Range("A1:E1"), 0)
If IsError(T) Then
Err.Clear
.Range("A2:E2").Value = .Range("A1:E1").Value
Else
.Range("A2:E2").ClearContents
For Each C In .Range("A1:E1")
If C <> X Then
B = B + 1
.Cells(2, B) = C.Value
End If
Next
End If
End With
Application.ScreenUpdating = True
End Sub
'------------------------------------------------
Avatar
isabelle
bonjour Michel,

une formule matriciel, valider avec ctrl + shift + enter
en cellule A2 et tirer vers la droite

=SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);
COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle
Avatar
isabelle
Michel, je me suis compliquer la formule pour rien,

sélectionne A2:E2
copie la formule dans la barre de formule et valide en matriciel.
=SIERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE());"")

isabelle

Le 2014-04-02 08:02, isabelle a écrit :
bonjour Michel,

une formule matriciel, valider avec ctrl + shift + enter
en cellule A2 et tirer vers la droite

=SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);

COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle

Avatar
isabelle
pour obtenir les valeurs dans le même ordre de la ligne 1
j'ai fait un essaie avec la fonction INDEX
=SIERREUR(INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE());INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE()+1))

mais il se passe une bizzarie avec la fonction SIERREUR que je ne comprend pas

http://cjoint.com/?DDcqQC8pWlc

isabelle

Le 2014-04-02 08:11, isabelle a écrit :
Michel, je me suis compliquer la formule pour rien,

sélectionne A2:E2
copie la formule dans la barre de formule et valide en matriciel.
=SIERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE());"")

isabelle

Le 2014-04-02 08:02, isabelle a écrit :
bonjour Michel,

une formule matriciel, valider avec ctrl + shift + enter
en cellule A2 et tirer vers la droite

=SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);


COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle

Avatar
GL
Le 02/04/2014 16:45, isabelle a écrit :
pour obtenir les valeurs dans le même ordre de la ligne 1



A priori selon les données de L1 sont triées...
Donc petite.valeur devrait suffire.



j'ai fait un essaie avec la fonction INDEX
=SIERREUR(INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE());INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE()+1))


mais il se passe une bizzarie avec la fonction SIERREUR que je ne
comprend pas

http://cjoint.com/?DDcqQC8pWlc

isabelle

Le 2014-04-02 08:11, isabelle a écrit :
Michel, je me suis compliquer la formule pour rien,

sélectionne A2:E2
copie la formule dans la barre de formule et valide en matriciel.
=SIERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE());"")

isabelle

Le 2014-04-02 08:02, isabelle a écrit :
bonjour Michel,

une formule matriciel, valider avec ctrl + shift + enter
en cellule A2 et tirer vers la droite

=SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);



COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle

Avatar
isabelle
oui selon ce que Michel a dit à la première ligne " j'appelle cette liste L1 et
elle est ordonnée."
mais par la suite les exemples montrés ne le sont pas -(
Michel devra clarifier...
isabelle

Le 2014-04-02 11:32, GL a écrit :
Le 02/04/2014 16:45, isabelle a écrit :
pour obtenir les valeurs dans le même ordre de la ligne 1



A priori selon les données de L1 sont triées...
Donc petite.valeur devrait suffire.



j'ai fait un essaie avec la fonction INDEX
=SIERREUR(INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE());INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE()+1))



mais il se passe une bizzarie avec la fonction SIERREUR que je ne
comprend pas

http://cjoint.com/?DDcqQC8pWlc

isabelle

Le 2014-04-02 08:11, isabelle a écrit :
Michel, je me suis compliquer la formule pour rien,

sélectionne A2:E2
copie la formule dans la barre de formule et valide en matriciel.
=SIERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE());"")

isabelle

Le 2014-04-02 08:02, isabelle a écrit :
bonjour Michel,

une formule matriciel, valider avec ctrl + shift + enter
en cellule A2 et tirer vers la droite

=SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);




COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle








Avatar
michel.legeria
Le mercredi 2 avril 2014 17:42:36 UTC+2, isabelle a écrit :
oui selon ce que Michel a dit à la première ligne " j'appelle cette l iste L1 et

elle est ordonnée."

mais par la suite les exemples montrés ne le sont pas -(

Michel devra clarifier...

isabelle



Le 2014-04-02 11:32, GL a écrit :

> Le 02/04/2014 16:45, isabelle a écrit :

>> pour obtenir les valeurs dans le même ordre de la ligne 1

>

> A priori selon les données de L1 sont triée s...

> Donc petite.valeur devrait suffire.

>

>

>

>> j'ai fait un essaie avec la fonction INDEX

>> =SIERREUR(INDEX(SI($A$1:$F$1<>10;$A$1:$F$1);COLONNE());INDEX(SI($A$1 :$F$1<>10;$A$1:$F$1);COLONNE()+1))

>>

>>

>>

>> mais il se passe une bizzarie avec la fonction SIERREUR que je ne

>> comprend pas

>>

>> http://cjoint.com/?DDcqQC8pWlc

>>

>> isabelle

>>

>> Le 2014-04-02 08:11, isabelle a écrit :

>>> Michel, je me suis compliquer la formule pour rien,

>>>

>>> sélectionne A2:E2

>>> copie la formule dans la barre de formule et valide en matriciel.

>>> =SIERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE());"" )

>>>

>>> isabelle

>>>

>>> Le 2014-04-02 08:02, isabelle a écrit :

>>>> bonjour Michel,

>>>>

>>>> une formule matriciel, valider avec ctrl + shift + enter

>>>> en cellule A2 et tirer vers la droite

>>>>

>>>> =SIERREUR(SI(ESTERREUR(PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1) ;COLONNE()));PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);

>>>>

>>>>

>>>>

>>>>

>>>> COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE())) ;"")

>>>>

>>>> isabelle

>>>>

>



PArdon Isabelle, je n'ai pas été clair. Je veux dire que l'ordre de la liste L1 compte ! Elle n'est pas ordonnée (les chiffres qu'elle contient ne sont pas ordonnés), mais l'ordre dans lequel ses chiffres apparaissent compte dans la construction de L2. Dit autrement, la liste L2 doit prése nter les chiffres de L1 dans le même ordre que celui de L1 !

Exemple :

L1={14,2,1,8,9} et X={8} donne L2={14,2,1,9}
et pas L2={2,14,1,9} ou L2={9,2,1,14}

Michel
Avatar
isabelle
Merci Michel d'avoir clarifier,
je travaille sur le probleme avec la fonction INDEX
je reviens dès que je trouve la solution.

isabelle

Le 2014-04-02 14:44, a écrit :

PArdon Isabelle, je n'ai pas été clair. Je veux dire que l'ordre de la liste L1 compte !


Elle n'est pas ordonnée (les chiffres qu'elle contient ne sont pas ordonnés),
mais l'ordre dans lequel ses chiffres apparaissent compte dans la construction
de L2.
Dit autrement, la liste L2 doit présenter les chiffres de L1 dans le même ordre
que celui de L1 !

Exemple :

L1={14,2,1,8,9} et X={8} donne L2={14,2,1,9}
et pas L2={2,14,1,9} ou L2={9,2,1,14}

Michel

Avatar
michel.legeria
Le mercredi 2 avril 2014 22:14:55 UTC+2, isabelle a écrit :
Merci Michel d'avoir clarifier,

je travaille sur le probleme avec la fonction INDEX

je reviens dès que je trouve la solution.



isabelle



Le 2014-04-02 14:44, a écrit :



> PArdon Isabelle, je n'ai pas été clair. Je veux dire que l'ordre de la liste L1 compte !

Elle n'est pas ordonnée (les chiffres qu'elle contient ne sont pas ordo nnés),

mais l'ordre dans lequel ses chiffres apparaissent compte dans la constru ction

de L2.

Dit autrement, la liste L2 doit présenter les chiffres de L1 dans le m ême ordre

que celui de L1 !

>

> Exemple :

>

> L1={14,2,1,8,9} et X={8} donne L2={14,2,1,9}

> et pas L2={2,14,1,9} ou L2={9,2,1,14}

>

> Michel

> :




Ok j'ai résolu le problème avec une fonction VB
Mais je suis tout de même preneur d'une formule qui fait aussi le travail
pour voir comment le faire.

***********
Function L2(L1 As Range; X as integer) As Variant

Dim L2Temp () As Variant
ReDim L2Temp(5)


Index = 1
For i = 1 To 5
L2Temp(i) = 0
If (L1.Cells(i) <> X) Then
L2Temp(Index) = L1.Cells(i)
Index = Index + 1
End If
Next

L2=L2Temp
***********