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

Histoire d'écarts

21 réponses
Avatar
Grandola
Bonjour à tous,

De nouveau dans la panade (oui, je sais, je suis pas fortiche ;-) ) je
me permets de vous soumettre une nouvelle problématique.

Cette fois c'est une histoire... d'écarts... mais pas "type". ;-)

Merci par avance à ceux qui y jetteront un oeil, et surtout, à ceux qui
y jetteront les neurones nécessaires à sa compréhension. (oui, je sais,
j'explique pas toujours bien ;-) )

Euuuuh, ça a l'air long mais pas tant que ça, et c'est par là :
http://www.cijoint.fr/cjlink.php?file=cj200904/cij4rQL8bb.xls

A+

10 réponses

1 2 3
Avatar
Grandola
Hmmm, j'ai pu faire une erreur mais en fait la règle est simple. Si, si,
j't'assure. Après avoir lu ce qui suit tu ne pourras qu'avoir compris.
Si, si, j't'assure ;-)

Ready ? Go ! ;-)

La fonction lit une "matrice" de 3 colonnes, ligne à ligne, du bas vers
le haut et s'intéresse EXCLUSIVEMENT aux lignes où la CONDITION 1 = [
colonne C = "5" ET colonne E = "citron" ] est remplie.

Ce n'est que dans un second temps que la fonction s'intéresse à la
CONDITION 2 = [ colonne D = "1"].

ELLE PROCEDE DE LA MANIERE SUIVANTE :

Elle ne trouve aucune ligne répondant à la condition 1
----> elle renvoie "J".

Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10"

Elle trouve 21 lignes répondant à la condition 1.
Parmi ces 21 lignes TOUTES répondent à la condition 2.
----> elle renvoie "C21"

Elle trouve des lignes répondant à la condition 1.
Parmi ces lignes, certaines répondent à la condition 2, d'autres pas.

Dans ce cas de figure, elle se place au niveau de la première ligne où
la condition 1 a été remplie. (Je rappelle ici qu'on lit les lignes du
bas vers le haut).

Exemple :


C D E

5 1 CITRON <------ 5eme ligne répondant à la condition 1
5 11 CITRON <------ 4eme ligne répondant à la condition 1
5 1 CITRON <------ 3eme ligne répondant à la condition 1
5 3 CITRON <------ 2eme ligne répondant à la condition 1
5 8 CITRON <------ 1ère ligne répondant à la condition 1


Je disais donc, elle se place au niveau de la 1ère ligne où la condition
1 est remplie et regarde si cette 1ère ligne remplie la condition 2.

Dans l'exemple ci-dessus, cette 1ère ligne ne répond pas à la condition
2 puisque la colonne D = 8. La fonction écrit alors "-1" dans un
compteur et poursuit sa route...

...vers la 2ème ligne répondant à la condition 1. Là aussi elle regarde
si cette 2ème ligne répond à la condition 2.

Dans l'exemple ci-dessus, cette 2ème ligne ne répond pas à la condition
2 puisque la colonne D = 3. La fonction incrémente le compteur. Ce
dernier passe de "-1" à "-2"... et la fonction poursuit sa route...

vers la 3ème ligne répondant à la condition 1. Là encore elle regarde si
cette 3ème ligne répond à la condition 2.

Dans l'exemple ci-dessus, cette 3ème ligne répond à la condition 2
puisque la colonne D = 1.
---> La fonction renvoie la valeur inscrite au compteur, à savoir, "-2"
et ne va pas plus loin. FIN DU TRAITEMENT.


Contrairement à l'exemple vu plus haut, la 1ère ligne répondant à la
condition 1 aurait pu répondre à la condition 2 comme dans l'exemple qui
suit :


C D E

5 45 CITRON <------ 7eme ligne répondant à la condition 1
5 1 CITRON <------ 6eme ligne répondant à la condition 1
5 23 CITRON <------ 5eme ligne répondant à la condition 1
5 1 CITRON <------ 4eme ligne répondant à la condition 1
5 1 CITRON <------ 3eme ligne répondant à la condition 1
5 1 CITRON <------ 2eme ligne répondant à la condition 1
5 1 CITRON <------ 1ere ligne répondant à la condition 1


Dans ce cas, même chose. Mais on incrémente le compteur positivement :

1ère ligne répondant à la condition 1 remplit aussi la condition 2.
On a alors compteur = 1

2ème ligne répondant à la condition 1 remplit aussi la condition 2.
Compteur = 2

3ème ligne répond à la condition 1 remplit aussi la condition 2.
Compteur = 3

4ème ligne répondant à la condition 1 remplit aussi la condition 2.
Compteur = 4

5ème ligne répondant à la condition 1 NE REMPLIT PAS la condition 2
puisque la colonne D = 23.
---> La fonction renvoie la valeur inscrite au compteur, à savoir, "4"
et ne va pas plus loin. FIN DU TRAITEMENT.


PRECISIONS :

- Les colonnes C, D, E ne sont pas nécessairement adjacentes et/ou sur
la même feuille/classeur.

- les valeurs à rechercher ne sont pas nécessairement "citron" et "1".


Voilà. En espérant, que c'est un brin plus clair maintenant.
Et encore merci de te creuser la tête sur ma problématique.


--------------------------------------







Daniel.C a écrit :
Bonjour.
Tu as écrit :
"Fonction renverra "J4" parce que TOUTES LES FOIS (4 fois au total dans
notre exemple) où elle a trouvé "5" en C ET "Citron" en E
il y avait une valeur différente de "1" en D".
Je compte personnelement 7 valeurs où C=5, E=CITTRON et D<>1.
Peux-tu expliciter ?
Cordialement.
Daniel


Bonjour à tous,

De nouveau dans la panade (oui, je sais, je suis pas fortiche ;-) ) je
me permets de vous soumettre une nouvelle problématique.

Cette fois c'est une histoire... d'écarts... mais pas "type". ;-)

Merci par avance à ceux qui y jetteront un oeil, et surtout, à ceux
qui y jetteront les neurones nécessaires à sa compréhension. (oui, je
sais, j'explique pas toujours bien ;-) )

Euuuuh, ça a l'air long mais pas tant que ça, et c'est par là :
http://www.cijoint.fr/cjlink.php?file=cj200904/cij4rQL8bb.xls

A+






Avatar
Grandola
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "
Avatar
isabelle
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car je
n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection a(chiffre
5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection b(chiffre 1
ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection c(citron)",
Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "


Avatar
Grandola
Merci à toi... mais le système d'InputBox ne me convient pas du tout
parce que j'aimerais faire référence à des adresses de cellules plutôt
que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière totalement
arbitraire, tout comme j'ai choisi la lettre "C" qu'on utilise aussi
concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------



isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car je
n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection a(chiffre
5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection b(chiffre 1
ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection c(citron)",
Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "




Avatar
isabelle
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As Double,
c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i, a.Column) =
5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du tout
parce que j'aimerais faire référence à des adresses de cellules plutôt
que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière totalement
arbitraire, tout comme j'ai choisi la lettre "C" qu'on utilise aussi
concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------



isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car je
n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection a(chiffre
5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection b(chiffre
1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "






Avatar
isabelle
ps/ le fichier est ici : http://cjoint.com/?eyiTHQVyud

isabelle

isabelle a écrit :
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une
fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As
Double, c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i, a.Column)
= 5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du tout
parce que j'aimerais faire référence à des adresses de cellules
plutôt que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière
totalement arbitraire, tout comme j'ai choisi la lettre "C" qu'on
utilise aussi concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------




isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car je
n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection
a(chiffre 5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection
b(chiffre 1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "








Avatar
Grandola
Après quelques tests, ta fonction marche très bien. Elle renvoie les
bonnes valeurs. :-)

Ce qui me gêne dans ton code c'est que les valeurs que la fonction doit
rechercher ("Citron", "5", "1" ou pas "1") soit écrites "en dur".
J'aimerais pouvoir faire référence à des cellules, plutôt que de "graver
des valeurs dans le marbre".

En espérant que tu as compris ce que je veux dire.

Sinon pour le système de lettres c'est simple :
- si la fonction ne trouve aucune ligne avec E="citron" ET D="5", elle
renvoie "J"

- si la fonction trouve des lignes avec E="citron" ET D="5" et qu'AUCUNE
d'entre elles n'a "1" en colonne D, elle renvoie la concaténation de "J"
et du nombre de lignes trouvées avec "citron" et "5". Exemple :"J11"

- si la fonction trouve des lignes avec E="citron" ET D="5" et TOUTES
ont "1" en colonne D, elle renvoie la concaténation de "C" et du nombre
de lignes trouvées avec "citron" et "5". Exemple :"C26"


----------------------------------------


isabelle a écrit :
ps/ le fichier est ici : http://cjoint.com/?eyiTHQVyud

isabelle

isabelle a écrit :
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une
fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As
Double, c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i, a.Column)
= 5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du tout
parce que j'aimerais faire référence à des adresses de cellules
plutôt que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière
totalement arbitraire, tout comme j'ai choisi la lettre "C" qu'on
utilise aussi concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------




isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car je
n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection
a(chiffre 5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection
b(chiffre 1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "










Avatar
isabelle
bonjour Grandola,

tu peut remplacer les valeurs de "Citron", "5", "1" par des cellules
renseigner de ces valeurs
dans l'exemple ci-joint : =écart(C2:C16;$G$2;D2:D16;$G$3;E2:E16;$G$4)

j'ai ajouté une dernière parti :

Select Case counter
Case Is = 0: counter = "J"
Case Is < 0: counter = "J" & (counter) * -1
Case Is > 0: counter = "C" & counter
End Select

en espérant que cela traduise bien les conditions pour les lettres

http://cjoint.com/?ezbSUChSpM

isabelle

Grandola a écrit :
Après quelques tests, ta fonction marche très bien. Elle renvoie les
bonnes valeurs. :-)

Ce qui me gêne dans ton code c'est que les valeurs que la fonction
doit rechercher ("Citron", "5", "1" ou pas "1") soit écrites "en dur".
J'aimerais pouvoir faire référence à des cellules, plutôt que de
"graver des valeurs dans le marbre".

En espérant que tu as compris ce que je veux dire.

Sinon pour le système de lettres c'est simple :
- si la fonction ne trouve aucune ligne avec E="citron" ET D="5", elle
renvoie "J"

- si la fonction trouve des lignes avec E="citron" ET D="5" et
qu'AUCUNE d'entre elles n'a "1" en colonne D, elle renvoie la
concaténation de "J" et du nombre de lignes trouvées avec "citron" et
"5". Exemple :"J11"

- si la fonction trouve des lignes avec E="citron" ET D="5" et TOUTES
ont "1" en colonne D, elle renvoie la concaténation de "C" et du
nombre de lignes trouvées avec "citron" et "5". Exemple :"C26"


----------------------------------------


isabelle a écrit :
ps/ le fichier est ici : http://cjoint.com/?eyiTHQVyud

isabelle

isabelle a écrit :
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une
fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As
Double, c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i,
a.Column) = 5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du
tout parce que j'aimerais faire référence à des adresses de
cellules plutôt que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière
totalement arbitraire, tout comme j'ai choisi la lettre "C" qu'on
utilise aussi concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------




isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car
je n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C,
D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection
a(chiffre 5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection
b(chiffre 1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "












Avatar
Grandola
Euuuh oui mais si dans les cellules renseignées c'est pas la valeur
"citron" qui est inscrite la fonction marche plus :-(. C'est ça que je
voulais dire.

Concernant, les lettres y'a un hic également. En fait, il n'y a pas de
lettres à tous les coups.

Si parmi les lignes trouvées avec E="citron" ET D="5", certaines ont
C="1", et d'autres ont C <> "1" alors il n'y aura pas de lettres.

Il y aura une lettre seulement :

Si AUCUNE ligne avec E="citron" ET D="5" n'a été trouvée -----> "J"

Si lignes trouvées avec E="citron" ET D="5", mais qu'AUCUNE de ces
lignes trouvées avec C="1" -----> CONCATENER ( "J" ; Nb de lignes avec
E="citron" ET D="5" )

Si lignes trouvées avec E="citron" ET D="5", et que TOUTES ces lignes
trouvées ont C="1" -----> CONCATENER ( "C" ; Nb de lignes avec
E="citron" ET D="5" )



-------------------------------------------------------------


isabelle a écrit :
bonjour Grandola,

tu peut remplacer les valeurs de "Citron", "5", "1" par des cellules
renseigner de ces valeurs
dans l'exemple ci-joint : =écart(C2:C16;$G$2;D2:D16;$G$3;E2:E16;$G$4)

j'ai ajouté une dernière parti :

Select Case counter
Case Is = 0: counter = "J"
Case Is < 0: counter = "J" & (counter) * -1
Case Is > 0: counter = "C" & counter
End Select

en espérant que cela traduise bien les conditions pour les lettres

http://cjoint.com/?ezbSUChSpM

isabelle

Grandola a écrit :
Après quelques tests, ta fonction marche très bien. Elle renvoie les
bonnes valeurs. :-)

Ce qui me gêne dans ton code c'est que les valeurs que la fonction
doit rechercher ("Citron", "5", "1" ou pas "1") soit écrites "en dur".
J'aimerais pouvoir faire référence à des cellules, plutôt que de
"graver des valeurs dans le marbre".

En espérant que tu as compris ce que je veux dire.

Sinon pour le système de lettres c'est simple :
- si la fonction ne trouve aucune ligne avec E="citron" ET D="5", elle
renvoie "J"

- si la fonction trouve des lignes avec E="citron" ET D="5" et
qu'AUCUNE d'entre elles n'a "1" en colonne D, elle renvoie la
concaténation de "J" et du nombre de lignes trouvées avec "citron" et
"5". Exemple :"J11"

- si la fonction trouve des lignes avec E="citron" ET D="5" et TOUTES
ont "1" en colonne D, elle renvoie la concaténation de "C" et du
nombre de lignes trouvées avec "citron" et "5". Exemple :"C26"


----------------------------------------


isabelle a écrit :
ps/ le fichier est ici : http://cjoint.com/?eyiTHQVyud

isabelle

isabelle a écrit :
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une
fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As
Double, c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i,
a.Column) = 5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du
tout parce que j'aimerais faire référence à des adresses de
cellules plutôt que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron" et
colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière
totalement arbitraire, tout comme j'ai choisi la lettre "C" qu'on
utilise aussi concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------




isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement car
je n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne C,
D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection
a(chiffre 5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection
b(chiffre 1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "














Avatar
isabelle
je n'avais pas remplacer les valeurs dans la fonction par la variables,
là c'est fait :
http://cjoint.com/?ezfRO0tWWe

Function écart(a As Range, val_a As Double, b As Range, val_b As Double,
c As Range, val_c As String) As String
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = val_c And Feuila.Cells(i, a.Column) =
val_a Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = val_b
counter = counter + 1
premiere = "pos"
Case Is <> val_b
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
abc1 = Evaluate("=SUMPRODUCT(('" & Feuila.Name & "'!" & a.Address & "="
& val_a & _
")*('" & Feuilb.Name & "'!" & b.Address & "=" & val_b & _
")*('" & Feuilc.Name & "'!" & c.Address & "=""" & val_c & """))")

abc2 = Evaluate("=SUMPRODUCT(('" & Feuila.Name & "'!" & a.Address & "="
& val_a & _
")*('" & Feuilb.Name & "'!" & b.Address & "<>" & val_b & _
")*('" & Feuilc.Name & "'!" & c.Address & "=""" & val_c & """))")

If counter = 0 Then counter = "J"
If abc1 = 0 And abc2 > 0 Then counter = "J" & (counter) * -1
If abc1 > 0 And abc2 = 0 Then counter = "C" & counter

écart = counter
End Function

isabelle

Grandola a écrit :
Euuuh oui mais si dans les cellules renseignées c'est pas la valeur
"citron" qui est inscrite la fonction marche plus :-(. C'est ça que je
voulais dire.

Concernant, les lettres y'a un hic également. En fait, il n'y a pas de
lettres à tous les coups.

Si parmi les lignes trouvées avec E="citron" ET D="5", certaines ont
C="1", et d'autres ont C <> "1" alors il n'y aura pas de lettres.

Il y aura une lettre seulement :

Si AUCUNE ligne avec E="citron" ET D="5" n'a été trouvée -----> "J"

Si lignes trouvées avec E="citron" ET D="5", mais qu'AUCUNE de ces
lignes trouvées avec C="1" -----> CONCATENER ( "J" ; Nb de lignes avec
E="citron" ET D="5" )

Si lignes trouvées avec E="citron" ET D="5", et que TOUTES ces lignes
trouvées ont C="1" -----> CONCATENER ( "C" ; Nb de lignes avec
E="citron" ET D="5" )



-------------------------------------------------------------


isabelle a écrit :
bonjour Grandola,

tu peut remplacer les valeurs de "Citron", "5", "1" par des cellules
renseigner de ces valeurs
dans l'exemple ci-joint : =écart(C2:C16;$G$2;D2:D16;$G$3;E2:E16;$G$4)

j'ai ajouté une dernière parti :

Select Case counter
Case Is = 0: counter = "J"
Case Is < 0: counter = "J" & (counter) * -1
Case Is > 0: counter = "C" & counter
End Select

en espérant que cela traduise bien les conditions pour les lettres

http://cjoint.com/?ezbSUChSpM

isabelle

Grandola a écrit :
Après quelques tests, ta fonction marche très bien. Elle renvoie les
bonnes valeurs. :-)

Ce qui me gêne dans ton code c'est que les valeurs que la fonction
doit rechercher ("Citron", "5", "1" ou pas "1") soit écrites "en
dur". J'aimerais pouvoir faire référence à des cellules, plutôt que
de "graver des valeurs dans le marbre".

En espérant que tu as compris ce que je veux dire.

Sinon pour le système de lettres c'est simple :
- si la fonction ne trouve aucune ligne avec E="citron" ET D="5",
elle renvoie "J"

- si la fonction trouve des lignes avec E="citron" ET D="5" et
qu'AUCUNE d'entre elles n'a "1" en colonne D, elle renvoie la
concaténation de "J" et du nombre de lignes trouvées avec "citron"
et "5". Exemple :"J11"

- si la fonction trouve des lignes avec E="citron" ET D="5" et
TOUTES ont "1" en colonne D, elle renvoie la concaténation de "C" et
du nombre de lignes trouvées avec "citron" et "5". Exemple :"C26"


----------------------------------------


isabelle a écrit :
ps/ le fichier est ici : http://cjoint.com/?eyiTHQVyud

isabelle

isabelle a écrit :
bonjour Grando,

si le resultat counter est exact on peut faire de cette macro une
fonction :
=écart(C2:C16;5;D2:D16;1;E2:E16;"CITRON")

Function écart(a As Range, val_a As Double, b As Range, val_b As
Double, c As Range, val_c As String) As Double
Set Feuila = Worksheets(a.Parent.Name)
Set Feuilb = Worksheets(b.Parent.Name)
Set Feuilc = Worksheets(c.Parent.Name)
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Feuilc.Cells(i, c.Column) = "CITRON" And Feuila.Cells(i,
a.Column) = 5 Then
If premiere = "" Then
Select Case Feuilb.Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Feuilb.Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Feuilb.Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
écart = 0 + counter
End Function

isabelle

Grandola a écrit :
Merci à toi... mais le système d'InputBox ne me convient pas du
tout parce que j'aimerais faire référence à des adresses de
cellules plutôt que d'indiquer une valeur "en dur" à la macro.

Sinon, le fonctionnement des lettres c'est pas compliqué.

Si la fonction ne trouve jamais de ligne où colonne E = "citron"
et colonne C = 5 elle renvoie "J" . J'ai choisi "J" de manière
totalement arbitraire, tout comme j'ai choisi la lettre "C" qu'on
utilise aussi concaténée avec un chiffre.

En fait la fonction renvoie "J" quand :
SOMMEPROD( (C:C=5) * (E:E="citron") ) = 0


La fonction renvoie par exemple "J4" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 4
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 0
)
= VRAI


La fonction renvoie par exemple "C7" quand :
ET
(
SOMMEPROD((C:C=5)*(E:E="citron") = 7
;
SOMMEPROD(( C:C=5) * (E:E="citron") * (D:D = "1" )) = 7
)
= VRAI


-------------------------------------------------------------------------




isabelle a écrit :
bonjour Grandola,

voici un premier test, la macro renvoie un chiffre uniquement
car je n'ai pas pigé le fonctionnement des lettres
il faut sélectionner dans l'ordres de l'exemple donnée colonne
C, D, E

Sub Macro1()
Set a = Application.InputBox(prompt:="Faite votre sélection
a(chiffre 5)" , Type:=8)
Set b = Application.InputBox(prompt:="Faite votre sélection
b(chiffre 1 ou autre -1)"", Type:=8)
Set c = Application.InputBox(prompt:="Faite votre sélection
c(citron)", Type:=8)
z1 = c.Item(1).Row
z2 = c.Item(a.Count).Row
For i = c.Item(c.Count).Row To c.Item(1).Row Step -1
If Cells(i, c.Column) = "CITRON" And Cells(i, a.Column) = 5 Then

If premiere = "" Then
Select Case Cells(i, b.Column)
Case Is = 1
counter = counter + 1
premiere = "pos"
Case Is <> 1
counter = counter - 1
premiere = "neg"
End Select
Else
Select Case premiere
Case "neg"
If Cells(i, b.Column) <> 1 Then
counter = counter - 1
Else: GoTo fin
End If
Case "pos"
If Cells(i, b.Column) = 1 Then
counter = counter + 1
Else: GoTo fin
End If
End Select
End If
End If
Next
fin:
MsgBox counter
End Sub

isabelle

Grandola a écrit :
Oupppps, une coquille......


"Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie ******"J15"******** "

ANNULE ET REMPLACE LE TEXTE ORIGINAL SUIVANT :

" Elle trouve 15 lignes répondant à la condition 1.
Parmi ces 15 lignes AUCUNE ne répond à la condition 2.
----> elle renvoie "J10" "
















1 2 3