XL 2016 Derniere cellule non vide

KTM

XLDnaute Occasionnel
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
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

KTM
La première ou la dernière (parce que ton titre est en contradiction avec ton message) ;)

Sinon pourquoi le VBA, alors qu'une formule peut le faire?

dernière
=RECHERCHE(2;1/($A$1:$A$54<>"");$A$1:$A$54)

première
=INDEX($A$1:$A$54;EQUIV(VRAI;INDEX(($A$1:$A$54<>0);0);0))
 

ChTi160

XLDnaute Barbatruc
Bonsoir KTM
peut être avec :
VB:
LigneNonVide=WorkSheets("Feuil1").Cells(55,1).End(xlUp).Row
sans fichier pas évident
Edit Bonsoir JM
jean marie
 

Staple1600

XLDnaute Barbatruc
Re

KTM
Merci d'avoir superbement ignoré le message#2 :rolleyes:

PS: Heureusement, ChTi160 m'a vu passé dans le fil
(Ce qui minore la douleur qui irradie encore en dedans de moi)
 

KTM

XLDnaute Occasionnel
Re

KTM
Merci d'avoir superbement ignoré le message#2 :rolleyes:

PS: Heureusement, ChTi160 m'a vu passé dans le fil
(Ce qui minore la douleur qui irradie encore en dedans de moi)
Votre proposition est bonne et est prise en compte et pourra me servir plus tard mais je devais utiliser ce code dans une macro.
Encore Merci.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il y a des solutions plus modernes que ce fameux .End(xlUp) lorsque la plage a fait l'objet d'une mise sous forme de tableau Excel.
 

Hervé

XLDnaute Barbatruc
salut :)

et si on rajoute un tout petit s à la fin de la proposition de chti on récupère la valeur de la cellule.

a plus
 

ChTi160

XLDnaute Barbatruc
Bonjour KTM
Bonjour JM (mdr)
Bonjour Hervé (Content de te Croiser , j'espère que tu vas bien ?)
Bonjour Bernard , il faudrait que je m'y mette , j'ai récolté un Max de Tutos et autres exemples sur les Tableaux ( ListObjects ), mais je ne m'y suis pas encore attelé ( je ne dois pas être moderne) , je n'utilise pas personnellement Excel , peut être la raison ! Lol
Bonne journée
jean marie
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Il faut bien voir que End(xlUp) ne va pas bien si la feuille est filtrée.

Par ailleurs avec les tableaux structurés ListObjects(1).Range.Row + ListObjects(1).DataBodyRange.Rows.Count ne donne pas la bonne valeur si la dernière ligne est vide.

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Il vaut mieux utiliser ListObjects(1).ListRows.Count, parce que s'il est à 0 .DataBodyRange n'est pas défini.
 

job75

XLDnaute Barbatruc
Oui, tu veux dire ListObjects(1).Range.ListRows.Count je suppose.

Edit : pardon Bernard j'ai mal lu, je voulais dire ListObjects(1).Range.Rows.Count
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non, l'objet Range n'a pas de collection ListRows, c'est le ListObject qui a une collection ListRows d'objets ListRow et une collection ListColumns d'objets ListColumn. L'objet ListRow a une propriété Range, le ListColumn aussi, et en plus une DataBodyRange, le ListObject aussi, et en plus une HeaderRowRange et une TotalsRowRange. En ajoutant que le ListObject a aussi une TableStyle, je croyais naïvement avoir fait le tour de ce qu'il fallait savoir, mais l'Explorateur d'objets m'a révélé qu'il n'en était rien…
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
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 + j <> 0 Then Set DerCellNonVide = xplage.Columns(1).Cells(IIf(i > j, i, j), 1)
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

edit: version v1a plus concise.
 

Fichiers joints

Dernière édition:

KTM

XLDnaute Occasionnel
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:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas