XL 2016 VBA: dernière ligne valorisée d'une colonne ?

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Une question apparemment simple: quel est le numéro de la dernière ligne valorisée (formule ou constante) d'une colonne ?

Je pense que beaucoup d'entre nous répondraient un truc du genre:
DerniereLigneUtilisée = Range("X" & Rows.Count).End(xlUp).Row 'où X est la colonne donnée
ou encore:
DerniereLigneUtilisée = ActiveSheet.Columns(X).Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row

SAUF que ça ne marche pas toujours quand par exemple il y a un filtre actif sur la colonne et que la dernière ligne réelle est masquée par le filtre (voir fichier joint).
Donc la question est, à part la méthode "artisanale" employée dans le fichier joint, y a-t-il un autre moyen de connaître cette ligne ?

Merci par avance.

Comparatif des méthodes qui fonctionnent mis à jour en tenant compte des plus récents posts.
 

Pièces jointes

  • Dernière ligne d'une colonne.xlsm
    294.5 KB · Affichages: 59
Dernière édition:
Solution
Bonsoir,

Tirée de lointains souvenirs, une fonction personnalisée :
VB:
Function NumDerLig&(plage As Range, Optional relatif)
   NumDerLig = Application.Max(Application.IfError(Application.Match("z", plage.Columns(1)), 0), _
   Application.IfError(Application.Match(9 ^ 99, plage.Columns(1)), 0))
   If NumDerLig > 0 Then If IsMissing(relatif) Then NumDerLig = plage.Row - 1 + NumDerLig
End Function

Dudu2

XLDnaute Barbatruc
Merci pour vos propositions. Quelques remarques:

@Phil69970 NBVAL donne le nombre de valeurs. Si il y a des "trous" dans la colonne (des cellules vides) NBVAL ne donnera pas la dernière ligne valorisée.

@pierrejean pareil pour la fonction CountA

@kiki29 le UsedRange peut s'étendre en hauteur plus que la colonne cherchée.
De plus je pense qu'il faudrait plutôt faire UsedRange.Row + UsedRange.Rows.Count - 1 pour le cas où le UsedRange ne commencerait pas en 1ère ligne.
Le lien que tu indiques donne les méthodes classiques que j'ai mentionnées, sans jamais indiquer leurs limites dues au filtrage, comme d'hab ce qui est une magnifique source d'erreur.
Edit: correction le post #4 de ce lien fait référence au problème du filtre.

Il n'y a qu'une option que je n'avais pas testée (je l'ai ajoutée au fichier du Post #1):
ActiveSheet.Columns(1).SpecialCells(xlCellTypeLastCell).Address
mais elle est également sensible au filtrage et de plus elle ne tient pas compte du Range indiqué ActiveSheet.Columns(1) et prend en compte toute la feuille.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour Dudu2
ben si tu veux j'ai un truc bien tordu de chez tordu
VB:
Sub test()
    MsgBox getLastValueHideOrNotHide([A:A])
End Sub

Function getLastValueHideOrNotHide(rng)
    Dim ligne
    With Application: t = Split(Join(.Transpose(.Index(rng, 0, 1)), ",||"), ","):
        getLastValueHideOrNotHide = .IfError(.Match("||", t, 0) - 1, False)
    End With
End Function
puré j'ai la migraine ;)
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG