XL 2016 Derniere cellule non vide

KTM

XLDnaute Impliqué
Salut Cher forum
j'ai une Plage [A3:A55]
J'aimerais récupérer par code vba le numéro de la première cellule non vide en partant de A55
Merci
 

KTM

XLDnaute Impliqué
Bonsoir à tous :)

J'avais, il y a quelques temps, tenter de faire un fonction qui retourne la dernière cellule (range) non vide de la première colonne d'une plage.
Il fallait que ça fonctionne avec une plage quelconque, avec un tableau structuré ou non inclus dans la plage, avec des lignes masquées (ou filtrées) ou non.

J'ai pondu ce qui suit:
VB:
Function DerCellNonVide(xplage As Range) As Range
Dim i&, j&
   On Error Resume Next
   i = Application.Match(999 ^ 9, xplage.Columns(1), 1)
   j = Application.Match(String(255, "z"), xplage.Columns(1), 1)
   On Error GoTo 0
   If i = 0 And j = 0 Then
      Exit Function
   Else
      If j > i Then i = j
      Set DerCellNonVide = xplage.Columns(1).Cells(i, 1)
   End If
End Function

Divers exemples figurent dans le fichier joint.

Pouvez-vous critiquer en espérant que je n'ai pas laissé passer un cas évident ou trivial d'échec ?

Merci
super merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le plus souvent c'est en vue de définir une plage allant d'une cellule de départ jusqu'à cette ligne là. Alors moi j'ai défini une fonction PlgUti qui renvoie directement un objet Range représentant cette plage, et une fonction ColUti qui en cerne plutôt une colonne ou un groupe de colonnes.
VB:
Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing, _
   Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
   Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
   On Error GoTo RienTrouvé
   If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
   LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
   CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
   On Error GoTo 0
   NbL = LMax - PlageDép.Row + 1: If NbL < LMin Then NbL = LMin
   NbC = CMax - PlageDép.Column + 1: If NbC < CMin Then NbC = CMin
   If NbL < 1 Or NbC < 1 Then GoTo CEstToutVide
   Set PlgUti = PlageDép.Resize(NbL, NbC)
   Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
   End Function
Function ColUti(ByVal PlageDép As Range, Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
   Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn), LMin, CMin)
   End Function
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 083
Messages
2 085 188
Membres
102 809
dernier inscrit
Sandrine83