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

la dernière vraie valeur

41 réponses
Avatar
Misange
Coucou,
j'ai une plage de données, D9:Z58. Chaque cellule contient une formule
qui renvoie soit une valeur soit "".
Je cherche *en VBA* l'adresse de la dernière cellule de la plage qui
contient une valeur (non vide). Je ne trouve que des trucs hyper
compliqués. Qu'est ce qui vous semble le plus simple ?
marchi
--
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

10 réponses

1 2 3 4 5
Avatar
Misange
Délateur AV, au rapport ! ;-)
pfft facile à dire. Avec dernière cellule non vide pas de pb (y en a
même un petit paquet sur excelabo) mais dernière cellule contenant une
formule ne renvoyant pas vide ?
T'as pas un evaluate de derrière les fagots ? Là je suis déçue mais
déçue ;-(

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

ici c'est férié aujourd'hui, je suppose qu'AV est absent. On verra aussi la
couleur de son grain de sel !


Voilà mon grain :
Pfff......et rePffff.....
Il y a des lustres que sont parues en ce lieu les solutions pour trouver la
dernière cellule renseignée (avec une fonction perso et la méthode "find" ou par
formule) ainsi que les inconvénients de SpecialCells(xlCellTypeLastCell) ou de
la propriété UsedRange
Faudrait voir à suivre un peu hein !
Je vais de ce pas faire mon rapport "à qui tu sais" !

AV





Avatar
MichDenis
| une plage de données, D9:Z58. Chaque cellule contient une formule
| qui renvoie soit une valeur soit "".

La méthode est un peu compliquée... j'ai commis un excellent article sur le sujet
sur http://xlwiki.free.fr/wiki

Comme la question mentionnait que chaque cellule contenait une formule,
la procédure n'avait pas à faire la différence entre une cellule renvoyant
une valeur que ce soit d'une formule ou pas. Dans le cas contraire,
c'est à dire une plage pouvant contenir des cellules renvoyant une donnée
émantant d'une formule ou d'une valeur dans une cellule, Il serait
"impossible" avec la méthode "Find" de trouver la dernière cellule
contenant une valeur émanant d'une cellule avec formule.

'-----------------------------------
Sub test()
With Worksheets("Feuil1")
MsgBox DerCell_NonVide(.Range("D9:Z58"))
End With
End Sub
'-----------------------------------
Function DerCell_NonVide(Plg As Range) As String
Dim DerLig As Long, DerCol As Integer
DerLig = Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
DerCol = Plg.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
DerCell_NonVide = Cells(DerLig, DerCol).Address
End Function

P.S- de mémoire, je crois même qu'avant la version Excel 2002, on
ne pouvait pas employé la méthode Find dans une fonction personnalisée
(à vérifier)


En passant, la formule utilisant "Evaluate" ne fait pas cette différence
à savoir si la dernière valeur trouvée émane d'une formule ou non.
'--------------------------.
Sub test()
Dim Adr As String, X As String
With Worksheets("Feuil1")
Adr = .Name & "!" & .Range("D9:Z58").Address
X = Evaluate("ADDRESS(MAX(IF(" & Adr & "<>"""",ROW(" & Adr & _
"))),MAX(IF(" & Adr & "<>"""",COLUMN(" & Adr & "))))")
End With
MsgBox X
End Sub
'--------------------------.


"Misange" a écrit dans le message de news:
O4paf$
Délateur AV, au rapport ! ;-)
pfft facile à dire. Avec dernière cellule non vide pas de pb (y en a
même un petit paquet sur excelabo) mais dernière cellule contenant une
formule ne renvoyant pas vide ?
T'as pas un evaluate de derrière les fagots ? Là je suis déçue mais
déçue ;-(

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

ici c'est férié aujourd'hui, je suppose qu'AV est absent. On verra aussi la
couleur de son grain de sel !


Voilà mon grain :
Pfff......et rePffff.....
Il y a des lustres que sont parues en ce lieu les solutions pour trouver la
dernière cellule renseignée (avec une fonction perso et la méthode "find" ou par
formule) ainsi que les inconvénients de SpecialCells(xlCellTypeLastCell) ou de
la propriété UsedRange
Faudrait voir à suivre un peu hein !
Je vais de ce pas faire mon rapport "à qui tu sais" !

AV





Avatar
MichDenis
| P.S- de mémoire, je crois même qu'avant la version Excel 2002, on
| ne pouvait pas employé la méthode Find dans une fonction personnalisée
| (à vérifier)

à propos de ceci : cela était vrai dans une fonction perso. appelée dans
la feuille de calcul seulement.
Avatar
AV
T'as pas un evaluate de derrière les fagots ? Là je suis déçue mais déçue ;-(


J'aaaarrive..à la bourre certes, mais faut dire qu'en cette saison, j'ai
d'autres priorités...;-)

A la lecture du fil, il me semble qu'aucune des solutions qui t'ont été
proposées n'est à l'abri d'une erreur....
La question étant :
Renvoyer l'adresse de la dernière cellule (derniere colonne de la dernière
ligne) AFFICHANT une valeur

Une formule matricielle :
­RESSE(MAX(SI(Plage<>"";LIGNE(Plage)));MAX(SI(Plage<>"";SI(LIGNE(Plage)=MAX(SI(Plage<>"";LIGNE(Plage)));COLONNE(Plage)))))

La méthode Evaluate qui "va avec" :
MsgBox
[address(max(if(Plage<>"",row(plage))),max(if(Plage<>"",if(row(Plage)=max(if(Plage<>"",row(Plage))),column(Plage)))))]

Exemple là :
http://cjoint.com/?fxjW05dzFa

AV

Avatar
Misange
AHHH !
je me disais aussi, les envahisseurs arrivent mais AV est là ;-)
Je regarde ça cet aprèm
merci !

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

T'as pas un evaluate de derrière les fagots ? Là je suis déçue mais déçue ;-(


J'aaaarrive..à la bourre certes, mais faut dire qu'en cette saison, j'ai
d'autres priorités...;-)

A la lecture du fil, il me semble qu'aucune des solutions qui t'ont été
proposées n'est à l'abri d'une erreur....
La question étant :
Renvoyer l'adresse de la dernière cellule (derniere colonne de la dernière
ligne) AFFICHANT une valeur

Une formule matricielle :
­RESSE(MAX(SI(Plage<>"";LIGNE(Plage)));MAX(SI(Plage<>"";SI(LIGNE(Plage)=MAX(SI(Plage<>"";LIGNE(Plage)));COLONNE(Plage)))))

La méthode Evaluate qui "va avec" :
MsgBox
[address(max(if(Plage<>"",row(plage))),max(if(Plage<>"",if(row(Plage)=max(if(Plage<>"",row(Plage))),column(Plage)))))]

Exemple là :
http://cjoint.com/?fxjW05dzFa

AV





Avatar
Modeste
Bonsour® AV avec ferveur ;o))) vous nous disiez :

J'aaaarrive..à la bourre certes, mais faut dire qu'en cette saison, j'ai
d'autres priorités...;-)


Au Mont Dore y fore ...
l'important c'est de ne pas perdre pied ...(de vestale !!!)
Ouarfff...
--

--
--
@+
;o)))

Avatar
MichDenis
| La question étant :
| Renvoyer l'adresse de la dernière cellule (derniere colonne de la dernière
| ligne) AFFICHANT une valeur

Si on laisse le demandeur choisir l'interpretation de sa question,
il pourrait utiliser ceci et l'adapter assez facilement.

http://cjoint.com/?fxq72xe6Me
Avatar
AV
Ave,

Je suis en total accord sur le fait que, sur une plage importante, la solution
par find est plus rapide qu'une matricielle et que de toute façon, elle est plus
facile à mettre en oeuvre MAIS il y avait de la part de Misange une demande
ultérieure précise :
"...T'as pas un evaluate de derrière les fagots ?..."
C'est donc à cette demande (Evaluate) que j'ai répondu, d'où le passage par une
matricielle.

"4- Il me semble que cela fait longtemps que le demandeur a été largué ou n'a
pas donné signe de vie. "

Pfffff... c'est Misange qui a initié ! Elle est ni larguée ni enterrée !

AV
Avatar
Misange
ni larguée ni enterrée de fait !!
je suis de très très près et vraiment je suis ravie d'avoir posé cette
question. J'adore ce genre de ficelles avec des tas de soluces. Ca
montre d'abord qu'une question peut être interprétée de différentes
manières.
C'est vrai que j'ai adoptée celle de Denis avec Find (d'abord parce
qu'evaluate était allé vadrouiller ailleurs !) qui est très rapide.
C'est Isabelle qui la première a été surprise qu'il n'y ait pas un petit
evaluate tapi au coin de la cellule en embuscade... J'ai suivi mon ange
avec grand plaisir dans cette mise au défi, suivi de résultats :-)

Je vais mettre un peu en forme le classeur d'Alain modifié par Denis et
le proposer sur excelabo. Chacun choises ! les chirogourdistes pourront
ainsi faire de la gym s'ils le veulent, c'est bon pour l'arthrose. Les
réfractaires aux maticielles ou les pressés suivront find.

Parfois, mieux vaut prendre une formule moins rapide mais qu'on comprend
qu'une bête de course qu'on est incapable de reproduire alors de cette
façon il y en aura pour tout le monde.

En tous cas super merci à vous tous
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Ave,

Je suis en total accord sur le fait que, sur une plage importante, la solution
par find est plus rapide qu'une matricielle et que de toute façon, elle est plus
facile à mettre en oeuvre MAIS il y avait de la part de Misange une demande
ultérieure précise :
"...T'as pas un evaluate de derrière les fagots ?..."
C'est donc à cette demande (Evaluate) que j'ai répondu, d'où le passage par une
matricielle.

"4- Il me semble que cela fait longtemps que le demandeur a été largué ou n'a
pas donné signe de vie. "

Pfffff... c'est Misange qui a initié ! Elle est ni larguée ni enterrée !

AV




Avatar
MichDenis
| ni larguée ni enterrée de fait

Désole Misange... mais comme je ne regarde pas
souvent le nom du demandeur avant de répondre,
et comme la ficelle s'étirait, j"ai pense que le demandeur
avait arrêté de suivre le cours de la ficelle.

Toutes mes excuses !
1 2 3 4 5