End(xlUp).Row ne s'arrête pas aux nombres obtenus par formule ?

Bonjour à tous,

J'ai très mal formulé ma question dans mon post précédent : je l'ai fermé pour en créer un nouveau.

Voici la nouvelle mouture : « End(xlUp).Row ne s'arrête pas aux nombres obtenus par formule ? ».

Je la pose encore en question, je mets mon fichier d'expérimentation dans ce post.

J'y ai mis une macro pour détecter la ligne la plus basse dans chaque colonne.

Ce qui me surprend, c'est que End(xlUp).Row s'arrête au sommet des colonnes D et E, même s'il y a des nombres : End(xlUp).Row ignore les nombres obtenus par formule.

En soi, c'est un peu gênant, car dans ce cas précis, je veux faire un test sur la dernière valeur du cumul (qui ne doit pas dépasser 2000) : ç'aurait été bien que End(xlUp).Row s'y arrête, car il y a un nombre ! Y a-t-il un moyen d'y remédier ?

En attendant, je vais contourner le problème en mettant une macro de détection de la ligne la plus basse pour ensuite prendre, sur la même ligne, la valeur du cumul et ainsi faire mon test de non-dépassement de la limite...

Mais la question du titre reste posée...

Bonsoir,

hé oui, une cellule avec une formule n'est pas vide par définition.
Soit tu boucles sur toutes les lignes et toutes les colonnes, soit tu considères que la dernière ligne pour toutes les colonnes est celle de E.
Pour E il suffit de compter celles > 0 et d'ajouter 2 :
derLigne5 = Application.CountIf(Range("E3:E38"), ">0") + 2

De toute façon partir de la ligne 38 pour remonter était une erreur. Si la cellule est remplie .End(xlUp).Row te dit 2 et non 38.
Pour tester c'est équivalent à Ctrl+fleche haut, tu vois où ça t’emmène selon les cas de figure.
Par ailleurs quand il s'agit de ligne prend l'habitude de typer As Long qui peut contenir la dernière ligne d'une feuille sans générer d'erreur.
eric

Bonsoir Eric,

Eh bien, la voilà la solution ! Je ne connaissais pas du tout cette façon de procéder...

Par ailleurs, surprenant conseil de dire que de commencer par la ligne 38 est une erreur, car c'est un peu remiser End(xlUp).Row au placard ! J'en prends bonne note, bien sûr, ainsi que le typage des lignes en As Long.

Merci de ton aide.

Bonsoir Eric,

Il y a un bémol tout de même, un gros même qui fausse tout... C'est quand on rentre des nombres négatifs et que le solde devient négatif ! La condition de Countif supérieure à 0 ne comptabilise pas ces lignes... Est-ce qu'il y aurait une autre idée de condition ?

Bonjour,

je me suis mis sur D finalement comme j'ai vu que tu avais nommé la plage :
=SOMMEPROD(--ESTNUM(Total_par_ligne))+2

c'est un peu remiser End(xlUp).Row au placard

pas du tout. Ca reste d'actualité si on l'utilise dans un cadre correct.
avec .End(xlUp).Row on remonte depuis une cellule vide pour avoir la 1ère occupée.
Si on part de la dernière de la feuille on a bien la dernière occupée.
Si tu le fais sur une plage depuis une cellule susceptible d'être occupée ça fausse tout, c'est un défaut de conception.
eric

Bonjour Eric,

Je viens de faire un petit tour sur Internet pour comprendre la signification et l'utilité de la fonction SOMMEPROD : où es-tu allé chercher une formule pareille ?!? Je l'ai placée dans la cellule E39 sous la plage des Cumul et j'ai rendu le nombre obtenu invisible... C'est bien comme cela qu'il fallait faire ? Il ne fallait pas la placer dans la procédure ?

J'ai pris la liberté de mettre "Cumul" à la place de "Total_par_ligne", car cette plage est directement concernée.

Peux-tu m'expliquer la formule ? J'ai bien compris les différentes situations de SOMMEPROD avec des utilisations conditionnelles, mais pourquoi ici ? Pourquoi les deux "--" avant ESTNUM ?

Est-ce que un simple « NB(Cumul) +2 » n'aurait pas suffi ?

Je ne peux pas t'envoyer le fichier maintenant, car le service est indisponible (?!?) J'essaierai tout à 'heure.

Merci encore de ton aide.

Voilà le fichier "Dépenses Postes.xlsm".

Est-ce que un simple « NB(Cumul) +2 » n'aurait pas suffi ?

mais si, bien sûr, je ne sais pas pourquoi je n'y ai pas pensé

Ceci dit je t'expliquerai quand même pour le sommeprod(), ça pourra te resservir. Mais plus tard...

Re,

explications de =SOMMEPROD(--ESTNUM(Total_par_ligne))+

ESTNUM(Total_par_ligne) te retourne une matrice de VRAI; FAUX selon si c'est un numérique ou pas :
{VRAI;VRAI;...;FAUX;FAUX;FAUX}
qu'il faut convertir en numérique pour pouvoir compter les VRAI, c'est le rôle de -- qui force cette conversion (tu pourrais aussi faire +0 ou *1) :
--{VRAI;VRAI;...;FAUX;FAUX;FAUX} => {1;1;...;0;0;0}
Sommeprod() permet de faire la somme de la matrice et obtenir 17.

Avec cette technique tu peux travailler sur plusieurs colonnes.
Par exemple compter les sommes >0 dont le nom="toto" =sommeprod(--test1;--test2).
eric

Merci pour ces explications que je vais prendre le temps d'étudier.

Evidemment, l'utilisation de la formule est soumise à une réadaptation selon les cas de figure : chez moi, ma zone "Cumuls" a des trous à cause de mouvements internes (la ligne de cumul concernée est égale à ""), et donc la formule ne peut pas donner de résultats exacts. A la place de "Cumul", j'ai mis "Zone_Dates", car c'est la seule qui est complète.

@+ Merci encore pour tes explications.

Rechercher des sujets similaires à "end xlup row arrete pas nombres obtenus formule"