Recherche & référence ValLastCelNotEmpty

Magic_Doctor

XLDnaute Barbatruc
VB:
Function ValLastCelNotEmpty(Plage As Range)
'Renvoie le contenu de la dernière cellule pleine d'une colonne
'- Plage : une plage de cellules sur une même colonne (ex : A1:A20)
'Si, par exemple, la cellule A5 est vide --> la fonction renverra la valeur de la cellule A4, même si les autres cellules de la plage sont pleines
'Si, par exemple, les cellules A1:A3 sont vides, la fonction réagira comme s'il s'agissait de la plage A4:A20

  If Plage.Columns.Count > 1 Or Application.CountA(Plage) = 0 Then ValLastCelNotEmpty = CVErr(xlErrRef): Exit Function
  If IsEmpty(Plage(1)) Then Set Plage = Plage.End(xlDown)(1)
  If Plage.Row = 65536 Then Set ValLastCelNotEmpty = Plage(1) Else If IsEmpty(Plage(2)) Then Set ValLastCelNotEmpty = Plage(1) Else Set ValLastCelNotEmpty = Plage.End(xlDown)
 
End Function
 

patricktoulon

XLDnaute Barbatruc
re @Magic_Doctor voila un exemple de ce que je disais tout a l'heure

ce type de fonction existe déjà dans le forum sous diverses forme dont la mienne et celle de @Dudu2 me semble t il
le nom de ta fonction sous entant la recherche de la derniere cellules non vide (ValLastCelNotEmpty)
hors tu dis dans ton commentaire
VB:
'Si, par exemple, la cellule A5 est vide --> la fonction renverra la valeur de la cellule A4, même si les autres cellules de la plage sont pleines
c'est pas très cohérent la dernière c'est la dernière c'est tout ou alors change le nom de la fonction
d'autant plus que tu ne prévois pas dans ta fonction les cellules ayant une formule renvoyant un vide




pardonne ma franchise mais voila pourquoi j'imposerais des limites ;)
si tu cherche bien avec le moteur de recherche du site avec les mots cellules et valorisées tu devrait très vite retrouver cette discussion
A méditer mon cher Magic_Doctor ;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
tiens j'ai tapé "valorisé" dans le moteur de recherche et ding dong c'est la premiere de la liste
 

soan

XLDnaute Barbatruc
Bonsoir Yeahou et tous ceux du fil,

ménon, y'a pas de piège ; simplement patrick a écrit : « tiens j'ai tapé "valorisé" dans le moteur de recherche et ding dong c'est la premiere de la liste » et MVP = Most Valuable Professional ; Microsoft MVP = un expert indépendant reconnu par Microsoft dans les technologies de la société Microsoft.

y'a pas longtemps, j'ai vu une vidéo d'un MVP Microsoft à propos de Power Query. :)

soan
 

Magic_Doctor

XLDnaute Barbatruc
re @Magic_Doctor voila un exemple de ce que je disais tout a l'heure

ce type de fonction existe déjà dans le forum sous diverses forme dont la mienne et celle de @Dudu2 me semble t il
le nom de ta fonction sous entant la recherche de la derniere cellules non vide (ValLastCelNotEmpty)
hors tu dis dans ton commentaire
VB:
'Si, par exemple, la cellule A5 est vide --> la fonction renverra la valeur de la cellule A4, même si les autres cellules de la plage sont pleines
c'est pas très cohérent la dernière c'est la dernière c'est tout ou alors change le nom de la fonction
d'autant plus que tu ne prévois pas dans ta fonction les cellules ayant une formule renvoyant un vide
donc a fin de compléter ta connaissance : voici la mienne
elle donne bien la lastcell not empty et avec l'argument donne la dernière cellule utilisée si formule renvoyant un vide
c'est plus cohérent avec le titre
elle renvoie 0 si colonne vide ce qui est plus cohérent que 1
VB:
Sub test()
    MsgBox LatCellUsedInColumn([A1:A100])
    MsgBox LatCellUsedInColumn([A1:A100], True)
End Sub

Function LatCellUsedInColumn(ByVal Colonne As Range, Optional IsValued As Boolean = False) As Long
    Const ChaineMax As String = "zzzzzzzzzzzzzzzzzzzz"
    Const NombreMax As Double = (2 ^ 53 - 1) * 2 ^ 971
    If Not Colonne Is Nothing Then
        With Application
            If Not IsValued Then
                LatCellUsedInColumn = .Max(.IfError(.Match(ChaineMax, Colonne.Columns(1), 1), 0), .IfError(.Match(NombreMax, Colonne.Columns(1), 1), 0))
            Else
                c = Colonne.Address(0, 0)
                LatCellUsedInColumn = Evaluate("MAX(ROW(" & c & ")*(" & c & "<>""""))")
            End If
        End With
    End If
End Function



pardonne ma franchise mais voila pourquoi j'imposerais des limites ;)
si tu cherche bien avec le moteur de recherche du site avec les mots cellules et valorisées tu devrait très vite retrouver cette discussion
A méditer mon cher Magic_Doctor ;)
Re,

Ma méditation fut courte.
Je reprends :
On propose une fonction. Elle tient la route ou pas.
Si le titre de la fonction n'est pas parfait, quelqu'un, judicieusement, propose de le modifier. En l'occurrence, je changerai donc le nom de la fonction par : ValLastCelFullBeforeFirstCelEmpty
Prévoir toutes les possibilités d'une fonction est une gageure. En revanche, quand un membre du forum a une idée pertinente, qu'il modifie alors à sa guise la fonction. C'est le but du jeu, que je sache.
Si, enfin, avant de proposer une fonction, on doit passer 2 plombes pour vérifier si ici ou ailleurs il n'y aurait pas une fonction similaire, autant dire que plus personne n'osera balancer une fonction.
Plutôt qu'un long discours, mieux vaut, laconiquement, modifier la fonction en expliquant pourquoi, et à ce moment-là on conservera la dernière modification. Et tout le monde sera content !
Donc, merci patricktoulon, tu m'auras aidé à modifier le nom de la fonction.
VB:
Function ValLastCelFullBeforeFirstCelEmpty(Plage As Range)
'Renvoie le contenu de la dernière cellule pleine d'une colonne
'- Plage : une plage de cellules sur une même colonne (ex : A1:A20)
'Si, par exemple, la cellule A5 est vide --> la fonction renverra la valeur de la cellule A4, même si les autres cellules de la plage sont pleines
'Si, par exemple, les cellules A1:A3 sont vides, la fonction réagira comme s'il s'agissait de la plage A4:A20

  If Plage.Columns.Count > 1 Or Application.CountA(Plage) = 0 Then ValLastCelFullBeforeFirstCelEmpty= CVErr(xlErrRef): Exit Function
  If IsEmpty(Plage(1)) Then Set Plage = Plage.End(xlDown)(1)
  If Plage.Row = 65536 Then Set ValLastCelFullBeforeFirstCelEmpty= Plage(1) Else If IsEmpty(Plage(2)) Then Set ValLastCelFullBeforeFirstCelEmpty= Plage(1) Else Set ValLastCelFullBeforeFirstCelEmpty= Plage.End(xlDown)
 
End Function
 

Discussions similaires

Statistiques des forums

Discussions
292 783
Messages
1 926 195
Membres
182 955
dernier inscrit
thezmyake