Dernière ligne éditée d'un Tableau

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour à tous,

En pièce jointe un petit fichier exemple avec un tableau (hé oui, j'ai voulu écouter Misange mais je m'en mord les dents...)
Avant cette invention diabolique, quand on voulait, par VBA, déterminer la dernière cellule éditée d'une colonne on écrivait (pour la colonne B par exemple) :

Code:
DL = Cells(Application.Rows.Count, 2).End(xlUp).Row
on obtenait la ligne 29...
Dans l'exemple joint, ce même code me renvoie la ligne 33 qui est la dernière ligne éditée du tableau.
J'ai vu qu'avec ce genre de bestiole il fallait utiliser des Range("Tableau1[#All]") mais après quelques essais je ne suis pas arrivé à obtenir DL = 29 (toujours pour la colonne B).
C'est pourquoi je m'adresse à vous, avant d'adresser des Emails perso à Misange avec des menaces de représailles sérieuses, des Hou...., des sifflets si flais qu'ils font tomber les oreilles, des reproches, des invectives, voire même un désamour immédiat et irrémédiable.
C'est dire si je compte sur vous pour pouvoir, comme avant, être redevable, admiratif, fan, bref, retrouver l'amour non pas des tableaux mais de Misange...
 

Pièces jointes

  • Tableau de M.xlsm
    15.6 KB · Affichages: 68

pierrejean

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Re

Pour prendre en compte l’éventualité de la colonne pleine

Code:
 Sub test1()
colonne = 2
If Range("Tableau1")(Range("Tableau1").Rows.Count, colonne) = "" Then
  DLV = Range("Tableau1")(Range("Tableau1").Rows.Count, 2).End(xlUp).Row + 1
Else
  DLV = "colonne " & colonne & " du tableau pleine"
End If
MsgBox (DLV)
End Sub

Salut Hasco (tu devrais revoir le début du post)
 
Dernière édition:
G

Guest

Guest
Re : Dernière ligne éditée d'un Tableau

Re salut la bande,

A partir de ton exemple pour avoir la dernière ligne de cellule occupée dans la colonne de tableau, par le nom de colonne une fonction en H2 tirée vers la droite:

Code:
Function DerLigneColonne(NomColonne As String) As Long
    Dim c As Range
    With Feuil1.ListObjects(1)
        With .ListColumns(NomColonne)
           Set c = .Range(.Range.Rows.Count, 1)
           'Chercher la dernière cellule de la colonne
           If IsEmpty(c) Then Set c = c.End(xlUp)
           'Si la colonne n'est pas entièrement vide, renvoyer sa ligne sinon la fonction renverra 0
           If c.Row >= .Range.Row Then DerLigneColonne = c.Row
        End With
    End With
End Function

A+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Dernière ligne éditée d'un Tableau

Bonjour le fil, bonjour le forum,

mais tout dépend de ce que tu veux exactement.

Moi je veux rien, surtout quand je vois les em...dements que ça apporte. J'avais juste constaté en venant en aide à quelqu'un. Je crois que je vais faire comme avec les cellules fusionnées. N'utiliser qu'en cas de réelle nécessité...
 

MJ13

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Bonjour à tous

Et oui, c'est un problème un peu "sciant" :eek:. Et après, tu m'étonnes qu'on trouve des erreurs dans les programmes :eek:.

Une autre façon de faire, mais il faut défiltrer .

Sinon, on peut travailler cellule par cellule en remontant, comme a fait Hasco :), il me semble.. (j'ai pas le temps de tester tous les codes :rolleyes:).

Code VBA:
Sub Dernière_Ligne_en_Partant_Du_Bas()
col = 2
DerLigneact = Cells.Find("*", Cells(Rows.Count, col), , , 2, 2).Row
MsgBox DerLigneact
End Sub
Sub Dernière_Ligne_en_Partant_Du_Bas_Supprime_Filtre()
col = 2
On Error Resume Next
ActiveSheet.ShowAllData
DerLigneact = Cells.Find("*", Cells(Rows.Count, col), , , 2, 2).Row
MsgBox DerLigneact
End Sub
 

Misange

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Hello

J'avions point vu cette ficelle vu j'étions en ouacances quand elle a débuté ! L'ami Robert s'en est ému et me l'a indiquée en MP. Franchement passer à coté de tant de déclarations d'amour et de variables ce serait vraiment dommage :) Merci au passage pour les coucous

Je vous livre ma petite façon :
Code:
Sub PourRobert()
Dim DerL As Long
Dim TitreL As Long
Dim PremL
Dim Tblo As Range

Set Tblo = ActiveSheet.ListObjects(1).Range
       TitreL = Tblo.Find("*").Row
       PremL = Tblo.Find("*").Row + 1
       DerL = Tblo.Find("*", , , , , xlPrevious).Row
MsgBox "Ligne d'entête : " & TitreL & Chr(10) & "première ligne : " & PremL & Chr(10) & "dernière ligne : " & DerL
End Sub

c'est pas si monstrueux quand même !
En revanche c'est fort mal documenté. On peut regretter que le nom de table soit aussi confusionnant et qu'en prime entre la feuille et le VBA on passe de table en anglais à listobject en VBA. Mais bon une fois qu'on le sait.

Ce que en revanche je trouve VRAIMENT très ch... avec les tables c'est la complication pour figer une colonne dans une référence. Et entre nous, les développeurs de MS, qui développent mais n'utilisent pas le produit... ne voient pas du tout quel est l'intérêt ! Leur réponse est toujours la même depuis 2007 : il suffit dans ce cas de basculer vers les références classiques de cellules et de mettre les $. Grr un super boulot pas complètement abouti, ça me fait raler.

Mais pour revenir dans le fil il suffit donc de deux lignes pour trouver le N° de la dernière ligne (et encore le set peut servir pour d'autres choses dans le code alors il ne devrait compter que pour une demi ligne au plus :)
DerL = Tblo.Find("*", , , , , xlPrevious).Row
 

Efgé

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Bonjour à toutes et tous,
@ Misange :)
Je ne voiudrais pas jouer le rabat joie, mais cela ne donne pas la dernière ligne remplie de la colonne X mais la situation du tableau dans la feuille.
On pourrais d'ailleurs se passer des find (en reprenant ton code):
VB:
Sub Test()
Dim DerL As Long
Dim TitreL As Long
Dim PremL
Dim Tblo As Range
Set Tblo = ActiveSheet.ListObjects(1).Range
       TitreL = Tblo(1, 1).Row
       PremL = Tblo(2, 1).Row
       DerL = TitreL + Tblo.Rows.Count - 1
MsgBox "Ligne d'entête : " & TitreL & Chr(10) & "première ligne : " & PremL & Chr(10) & "dernière ligne : " & DerL
End Sub
Cordialement
 

Misange

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Salut Efgé
Oui cela donne le N° de la ligne de la feuille qui contient la dernière ligne du tableau. Il me semblait que c'était la question mais je n'ai peut être rien compris. Sinon je ne vois pas où est le problème ?
en effet le code donné par Robert au post 1 donne parfaitement la dernière ligne remplie de la colonne X,
si tu mets un tableau en A2:C45 et un truc hors tableau en B78, son code
DL = Cells(Application.Rows.Count, 2).End(xlUp).Row
renvoie bien 78. Il me semblait qu'il voulait que cela renvoie justement 45 et pas 78 (mais je n'ai encore une fois peut être pas compris la question, je ne parle pas toujours le Robert couramment !!)
 

Efgé

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Re
@Misange,
Il y a confusion, le point de départ est : Si, dans un tableau, une colonne n'est pas entièrement remplie, comment trouver la première cellule vide de la dites colonne.
En utilisant Xlup dans la colonne concernée de la feuille, on retrouve la dernière ligne du tableau pas de la colonne.
Cordialement

EDIt
En d'autre termes: Comment trouver $C$6 dans le classeur joint?
Cordialement
 

Pièces jointes

  • colonne.xlsx
    10.7 KB · Affichages: 32
  • colonne.xlsx
    10.7 KB · Affichages: 29
  • colonne.xlsx
    10.7 KB · Affichages: 30
Dernière édition:

Si...

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

re :D

il est vrai qu'on (je) ne pense pas à tout :eek:
VB:
Sub d()
  With [Tableau1[col2]]
    If .Rows(1) <> "" Then
      .Find("*", , , , , xlPrevious).Row
    Else
      MsgBox "pourquoi me faire chercher pour rien ?", 16, "Oh ..." 'je n'aime pas masquer les erreurs
    End If
  End With
End Sub
 

Regueiro

XLDnaute Impliqué
Re : Dernière ligne éditée d'un Tableau

Bonjour le FORUM, Robert
Regarde sur mon fichier en PJ
Sur la Feuille "TABLO" un tableau nommée "Tableau1" avec la ligne des sous-totaux
Sur la Feuille "INFO" tu retrouves toutes les informations nécessaires, après
avoir activer la macro "bouton bleu"
Code:
Sub Rectangleàcoinsarrondis1_Cliquer()
Dim lstObj As ListObject
Dim F As Worksheet
Set F = Sheets("INFO")
Set lstObj = Worksheets("TABLO").ListObjects("Tableau1")
MsgBox lstObj.DataBodyRange.Cells.Count
With F
.[C2] = lstObj.Name
.[C3] = lstObj.DataBodyRange.Cells.Count
.[C4] = lstObj.DataBodyRange.Columns.Count
.[C5] = lstObj.DataBodyRange.Rows.Count
.[C6] = lstObj.DataBodyRange.SpecialCells(xlCellTypeConstants).Count
.[C7] = lstObj.DataBodyRange.SpecialCells(xlCellTypeBlanks).Count
.[C8] = lstObj.DataBodyRange.SpecialCells(xlCellTypeFormulas).Count
.[C9] = lstObj.DataBodyRange.Columns(1).Cells.Count
.[C10] = lstObj.DataBodyRange.Columns(1).Cells.Find("*", , , , xlByColumns, xlPrevious).Address
.[C11] = lstObj.DataBodyRange.Columns(1).Cells.Find("", , , , xlByColumns, xlPrevious).Address
.[C12] = lstObj.DataBodyRange.Columns(1).SpecialCells(xlCellTypeVisible).Address
.[C13] = "Ligne : " & lstObj.DataBodyRange.Columns(1).Cells.Find("*", , , , xlByColumns, xlPrevious).Row
End With
End Sub
A+
 

Pièces jointes

  • TABLEAUX VBA.xlsm
    20.6 KB · Affichages: 29

Robert

XLDnaute Barbatruc
Repose en paix
Re : Dernière ligne éditée d'un Tableau

Bonjour le fil, bonjour le forum,

Bon... N'en jetez plus ! La cour est pleine... aurais-je tendance à dire. Mais au contraire, ce fil aura au moins le mérite de proposer le condensé de plein de solutions différentes.
Merci à tous pour votre participations, j'avance et si c'est un pas de teckel (qui a dit un pet ?...) pour le forum c'est un pas de géant pour la crevette que je suis !
 

Efgé

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Re
Je suis tétu...
J'ai peutr être une piste, mais je n'arrive pas a finaliser.
En passant par une formule matricielle:
=MAX(NON(ESTVIDE(C1:C8))*LIGNE(C1:C8))

On peux, bien sûr, la coller par VBA:
Range("$G$1").FormulaArray = "=MAX(NOT(ISBLANK(C1:C8))*ROW(C1:C8))"
Mais, il doit y avoir un moyen de l'évaluer.

Ce n'est qu'une idée de piste.

Coridlament
 

Pièces jointes

  • colonne(2).xlsm
    16.8 KB · Affichages: 32

Efgé

XLDnaute Barbatruc
Re : Dernière ligne éditée d'un Tableau

Re
VB:
Sub Test()
Dim Tblo As Range, Adr$, Col&, Formu$
Col = 3 'Colonne où chercher
Set Tblo = ActiveSheet.ListObjects(1).Range
Adr = Tblo(1, Col).Address & ":" & Cells(Rows.Count, Tblo.Columns(Col).Column).End(3).Address
Formu = "MAX(NOT(ISBLANK(" & Adr & "))*ROW(" & Adr & " ))"
X = Evaluate([Formu])
MsgBox X
End Sub

Bonne vacances à ceux qui ont la chance de partir....

Cordialement
 

Statistiques des forums

Discussions
312 327
Messages
2 087 314
Membres
103 515
dernier inscrit
Cherbil12345