OVH Cloud OVH Cloud

Calculer le nombre de "X" entre deux plages

33 réponses
Avatar
Guido
Bonsoir,

Qui pourrait me fournir une formule me donnant le total du plus grand
nombre de "X" se trouvant sans interruption, dans chaque colonne.

J'ai donc dans une colonne A1 : A35, des "X" par intermittence dans
les cellules. Je voudrais une formule me d=E9nombrant la plus grande
plage de "X" sans discontinuit=E9.

Merci de votre aide.

Guido

3 réponses

1 2 3 4
Avatar
Guido
Bonjour Charabeuh

j'ai également pris la version Formule Matricielle (qui sera je pense
ma préférée) vu que ce fichier est pensé pour être partagé avec
d'autres personnes.

Après avoir essayé de comprendre la formule (et pas forcément réuss i)
je voudrai savoir ce qui ne te convenait pas avec ?

Merci d'avance

Guido


On 18 avr, 16:43, Charabeuh wrote:
Bonjour et merci du retour.

Guido a écrit :







> Bonjour Charabeuh,

> Je te remercie pour ton aide et tes solutions. C'est parfait pour mon
> fichier.

> milles merci et salutations

> Guido

> On 16 avr, 08:37, Charabeuh wrote:
Avatar
Charabeuh
Bonsoir Guido,

Ce qui me gêne dans cette formule matricielle est sa compréhension.

Quand on est plongé dans le problème à la recherche d'une solution, une
formule complexe se construit petit à petit et son expression finale
semble logique.
Y revenir quelques temps après, quand on a oublié le cheminement de
construction de la formule, prend beaucoup de temps et d'efforts. Alors
qu'une fonction personnalisée bien documentée se lit (presque) sans
effort.

==> Je viens d'ailleurs, tout en te répondant, de trouver une erreur
dans la formule matricielle
==> ce qui illustre ma réticence vis à vis des formules trop complexes.

Tu remarqueras que la précédente formule fournie donne une erreur quand
un mois est entièrement rempli de X.

Si on reconstruit la formule pour janvier/février:
La formule utilise la fonction decaler pour repérer des cellules.
DECALER(B$4;NBVAL(A$4:A$34)-1;0) repère la dernière cellule de la
colonne des X de janvier. NBVAL(A$4:A$34) étant le nombre de jour du
mois de janvier.
ET(DECALER(B$4;NBVAL(A$4:A$34)-1;0)=E$4;E$4="x") vérifie que la
dernière cellule de mois de janvier est égale à la première cellule de
février et que toutes les deux valent "x". Si c'est le cas, on calcule
le nombre de "x" à cheval sur deux mois, sinon on renvoie "".

Nombre de x en fin janvier:
On recherche le numéro de la ligne de la première cellule vide (="") en
remontant à partir de la fin du mois:
MAX((ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))
Il faut que le jour existe : (ESTNUM(A$4:A$34)
Il faut que la cellule soit vide : (B$4:B$34="")
et dans ce cas on retourne le numéro de ligne : (LIGNE(B$4:B$34)
Il y a un hic quand le mois est totalement rempli de "x" car dans ce
cas c'est 0 qui est retourné alors qu'il faudrait que ce soit la ligne
3.
On peut tenir compte de cela en prenant
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))
Le nombre de x est donc la différence entre le dernier N° de ligne du
mois de janvier (3+NBVAL(A$4:A$34)) et le plus grand N° de ligne de
janvier qui contient "":
(3+NBVAL(A$4:A$34))-
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))

Nombre de x en début février:
On recherche le numéro de la ligne de la première cellule vide en
descendant à partir du mois de février:
MIN(ESTNUM(D$4:D$34) * (E$4:E$34="")* LIGNE(E$4:E$34))
Il faut que le jour existe : (ESTNUM(D$4:D$34)
Il faut que la cellule soit vide : (E$4:E$34="")
et dans ce cas on retourne le numéro de ligne : (LIGNE(E$4:E$34)

Il y a un Pb. Si la condition SI(ESTNUM(cellule D) * (cellule E="")*
LIGNE(E) est fausse, elle retourne 0.
Donc le minimum des lignes égales à "" ou sans date sera toujours 0 dès
qu'il y a un x dans la colonne ou bien que le mois compte moins de 31
jours.
on peut résoudre cela en affectant 999 aux celulles contenant un X ou
sans date.
MIN(si(ESTNUM(D$4:D$34) * (E$4:E$34=""); LIGNE(E$4:E$34);999))

Il y a un autre PB. si le mois est entièrement rempli de "x", alors la
formule retourne 999 alors qu'il faudrait que ce soit la ligne suivant
le dernier jour du mois soit 4+NBVAL(D$4:D$34). On peut faire:
MIN(si(ESTNUM(D$4:D$34) * (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))
Le nombre de x est donc la différence entre la première ligne de
février qui contient "" et la première ligne du mois de février (=4).
(MIN(si(ESTNUM(D$4:D$34) * (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))-4)

La formule matricielle complète à mettre en D39 puis à recopier est
donc:

=SI(ET(DECALER(B$4;NBVAL(A$4:A$34)-1;0)=E$4;E$4="x");(3+NBVAL(A$4:A$34))-
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))+
(MIN(SI(ESTNUM(D$4:D$34) * (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))-4);"")

Ces explications laborieuses montrent pourquoi je préfère une fonction
personnalisée documentée!




Guido a couché sur son écran :
Bonjour Charabeuh

j'ai également pris la version Formule Matricielle (qui sera je pense
ma préférée) vu que ce fichier est pensé pour être partagé avec
d'autres personnes.

Après avoir essayé de comprendre la formule (et pas forcément réussi)
je voudrai savoir ce qui ne te convenait pas avec ?

Merci d'avance

Guido
Avatar
Guido
Bonjour Charabeuh

Je comprends maintenant 2 choses, pour quelle raison je n'ai pas
réussi à faire ces formules (que je croyais ultra simple à la base) e t
je vois également mieux le pourquoi, il est préférable de se créer une
fonction personnalisée.

Ce que je devrais dès lors me mettre à apprendre.

Merci pour ton explicatif (qui à également mis un doigt sur mes
lacunes) ;-))

A bientôt et passe de bonnes fêtes.

Guido



On 19 avr, 01:37, Charabeuh wrote:
Bonsoir Guido,

Ce qui me g ne dans cette formule matricielle est sa compr hension.

Quand on est plong dans le probl me la recherche d'une solution, une
formule complexe se construit petit petit et son expression finale
semble logique.
Y revenir quelques temps apr s, quand on a oubli le cheminement de
construction de la formule, prend beaucoup de temps et d'efforts. Alors
qu'une fonction personnalis e bien document e se lit (presque) sans
effort.

==> Je viens d'ailleurs, tout en te r pondant, de trouver une erreur
dans la formule matricielle
==> ce qui illustre ma r ticence vis vis des formules trop complexes.

Tu remarqueras que la pr c dente formule fournie donne une erreur quand
un mois est enti rement rempli de X.

Si on reconstruit la formule pour janvier/f vrier:
La formule utilise la fonction decaler pour rep rer des cellules.
DECALER(B$4;NBVAL(A$4:A$34)-1;0) rep re la derni re cellule de la
colonne des X de janvier. NBVAL(A$4:A$34) tant le nombre de jour du
mois de janvier.
ET(DECALER(B$4;NBVAL(A$4:A$34)-1;0)=E$4;E$4="x") v rifie que la
derni re cellule de mois de janvier est gale la premi re cellule de
f vrier et que toutes les deux valent "x". Si c'est le cas, on calcule
le nombre de "x" cheval sur deux mois, sinon on renvoie "".

Nombre de x en fin janvier:
On recherche le num ro de la ligne de la premi re cellule vide (="") en
remontant partir de la fin du mois:
MAX((ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))
Il faut que le jour existe : (ESTNUM(A$4:A$34)
Il faut que la cellule soit vide : (B$4:B$34="")
et dans ce cas on retourne le num ro de ligne : (LIGNE(B$4:B$34)
Il y a un hic quand le mois est totalement rempli de "x" car dans ce
cas c'est 0 qui est retourn alors qu'il faudrait que ce soit la ligne
3.
On peut tenir compte de cela en prenant
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))
Le nombre de x est donc la diff rence entre le dernier N de ligne du
mois de janvier (3+NBVAL(A$4:A$34)) et le plus grand N de ligne de
janvier qui contient "":
(3+NBVAL(A$4:A$34))-
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))

Nombre de x en d but f vrier:
On recherche le num ro de la ligne de la premi re cellule vide en
descendant partir du mois de f vrier:
MIN(ESTNUM(D$4:D$34)  *  (E$4:E$34="")* LIGNE(E$4:E$34))
Il faut que le jour existe : (ESTNUM(D$4:D$34)
Il faut que la cellule soit vide : (E$4:E$34="")
et dans ce cas on retourne le num ro de ligne : (LIGNE(E$4:E$34)

Il y a un Pb. Si la condition SI(ESTNUM(cellule D) * (cellule E="")*
LIGNE(E) est fausse, elle retourne 0.
Donc le minimum des lignes gales "" ou sans date sera toujours 0 d s
qu'il y a un x dans la colonne ou bien que le mois compte moins de 31
jours.
on peut r soudre cela en affectant 999 aux celulles contenant un X ou
sans date.
MIN(si(ESTNUM(D$4:D$34)  *  (E$4:E$34=""); LIGNE(E$4:E$34);999))

Il y a un autre PB. si le mois est enti rement rempli de "x", alors la
formule retourne 999 alors qu'il faudrait que ce soit la ligne suivant
le dernier jour du mois soit 4+NBVAL(D$4:D$34). On peut faire:
MIN(si(ESTNUM(D$4:D$34)  *  (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))
Le nombre de x est donc la diff rence entre la premi re ligne de
f vrier qui contient "" et la premi re ligne du mois de f vrier (=4).
(MIN(si(ESTNUM(D$4:D$34)  *  (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))-4)

La formule matricielle compl te   mettre en D39 puis recopier est
donc:

=SI(ET(DECALER(B$4;NBVAL(A$4:A$34)-1;0)=E$4;E$4="x");(3+NBVAL(A$4:A $34))-
MAX(3;(ESTNUM(A$4:A$34)*(B$4:B$34="")*(LIGNE(B$4:B$34))))+
(MIN(SI(ESTNUM(D$4:D$34)  *  (E$4:E$34="");
LIGNE(E$4:E$34);4+NBVAL(D$4:D$34)))-4);"")

Ces explications laborieuses montrent pourquoi je pr f re une fonction
personnalis e document e!

Guido a couch sur son cran :







> Bonjour Charabeuh

> j'ai galement pris la version Formule Matricielle (qui sera je pense
> ma pr f r e) vu que ce fichier est pens pour tre partag avec
> d'autres personnes.

> Apr s avoir essay de comprendre la formule (et pas forc ment r ussi)
> je voudrai savoir ce qui ne te convenait pas avec ?

> Merci d'avance

> Guido
1 2 3 4