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

Le
michel.legeria
Bonjour,

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

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

Je voudrais, dans les cellules
A2:E2 construire la liste L2 constituée de la liste L1 ôtée (éventu=
ellement) de X.

Donc deux cas :
Si X appartient à L1, L2 sera constituée des 4 chiffres de L1 différe=
nts de X ), dans l'ordre de L1.

Si X n'appartient pas à L1 alors L2 sera égale à L1.

Exemple :

L1={2,14,7,10,11}(rangée dans A1:E1) et X={10} alors L2 vaudra {2,14,=
7,11} rangée dans A2:D2 (E2 vide).

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

J'ai voulu faire ça avec des formules excel mais c'est trop compliqué. =
Je sais le faire en VBA mais je ne sais pas comment passer comme argument u=
ne plage de cellule à 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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichD
Le #26065562
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
'------------------------------------------------
isabelle
Le #26065622
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 COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle
isabelle
Le #26065682
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
COLONNE()+1);PETITE.VALEUR(SI(($A$1:$E$1<>10);$A$1:$E$1);COLONNE()));"")

isabelle

isabelle
Le #26065982
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

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

isabelle

GL
Le #26066052
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


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

isabelle

isabelle
Le #26066072
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



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

isabelle








michel.legeria
Le #26066352
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
>>>>

>>>>

>>>>

>>>>

>>>> 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
isabelle
Le #26066592
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

michel.legeria
Le #26066682
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
***********
Publicité
Poster une réponse
Anonyme