Bonjour,
Je suis "tombé" sur une discussion ouverte sur un autre site et relative à la détermination de la dernière ligne "réelle" d'une colonne d'une feuille Excel.
Le demandeur entendait par "dernière ligne réelle", la dernière cellule remplie (précédée ou non de lignes vides) d'une colonne, y compris si cette ligne faisait partie de lignes masquées.
Aucune des solutions proposées ne le satisfaisait dans la mesure où :
- certaines n'étaient valables que si la colonne était totalement remplie jusqu'à cette dernière ligne
- d'autres étaient "justes", mais passaient par un tremplin (une autre feuille). Lourd
- d'autres fonctionnaient, mais à condition de faire "harakiri" des lignes masquées (ce qui est gênant) ...
Ce qui m'a par ailleurs étonné, c'est d'une part que ceux qui ont proposé ces solutions boiteuses ne sont pas des débutants et que, d'autre part, des forumeurs à la fois avancés et d'habitude toujours présents n'ont pas proposé de solutions.
Je me suis dans un premier temps interrogé sur l'utilité de la "chose", mais, après réflexion, j'en ai trouvé plus d'une (dans certains cas).
Je m'y suis donc attelé.
Le but, donc : que les lignes visibles ou masquées contiennent ou non une ou plusieurs lignes (voire la totalité) vides, déterminer la dernière ligne remplie, masquée ou non, d'une colonne, quel que soit le nombre de plages masquées présentes.
Voici où j'en suis, qui fonctionne sans faille :
Private Function derlig_reelle(plage As Range) As Long
Dim plage_visible As Range, plageutile As Range, colonne As Long, ou As Long
Application.ScreenUpdating = False
With plage.Worksheet
Set plagevisible = .Columns(plage.Column).SpecialCells(xlCellTypeVisible)
ou = plagevisible.Areas(plagevisible.Areas.Count).Row
If ou = 1 Then
derlig_reelle = .Cells(Rows.Count, plage.Column).End(xlUp).Row
Else
Set plageutile = .Range(.Cells(1, plage.Column), .Cells(ou, plage.Column))
plageutile.EntireRow.Hidden = False
derlig_reelle = .Cells(Rows.Count, plage.Column).End(xlUp).Row
plageutile.EntireRow.Hidden = True
plagevisible.EntireRow.Hidden = False
End If
Application.ScreenUpdating = True
End With
End Function
Fonction appelable ainsi, au gré de chacun (exemples) :
MsgBox derlig_reelle(Worksheets("Feuil1").Columns(1))
MsgBox derlig_reelle(Worksheets("Feuil1").Columns("A"))
MsgBox derlig_reelle(Worksheets("Feuil2").Range("B:B"))
Un snippet en sera fait, mais pas avant que d'autres ici n'aient cherché une solution éventuellement meilleure.
Je compte sur vous pour tenter de perfectionner (si possible).
Merci d'avance à ceux qui s'y mettront.
-
Oui. Je déplace donc le sujet dans le "bon" forum.
Merci.