Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment connaître la dernière ligne utilisée ?

8 réponses
Avatar
Gouap
Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe

8 réponses

Avatar
Daniel.C
Bonjour.

essaie :

With ActiveSheet.[_filterdatabase]
If ActiveSheet.FilterMode = True Then
DerLig = .Row + .Rows.Count - 1
Else
DerLig = Cells.Find("*", [IV65536], , , xlByRows,
xlPrevious).Row
End If
End With

Daniel

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée sur
ma feuille. Seulement pour cela il faut que toutes les lignes soient visibles
ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les 50
lignes situées au dessous sont 50 lignes de données et j'applique un filtre
qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
Daniel.C
ou plutôt :

With ActiveSheet.[_filterdatabase]
If ActiveSheet.FilterMode = True Then
DerLig = Application.Max(.Row + .Rows.Count - 1, _
Cells.Find("*", [IV65536], , , xlByRows, _
xlPrevious).Row)
Else
DerLig = Cells.Find("*", [IV65536], , , xlByRows, _
xlPrevious).Row
End If
End With

Par contre, ça ne résout pas le problème des éventuelles lignes
masquées. Tu peux utiliser :

With ActiveSheet.UsedRange
DerLig = .Row + .Rows.Count - 1
End With

Qui tient compte des lignes masquées et des filtres, mais qui,
malheureusemeent compte aussi les lignes sans valeur si une cellule a
un format différent du standard.

Daniel

Daniel

Bonjour.

essaie :

With ActiveSheet.[_filterdatabase]
If ActiveSheet.FilterMode = True Then
DerLig = .Row + .Rows.Count - 1
Else
DerLig = Cells.Find("*", [IV65536], , , xlByRows, xlPrevious).Row
End If
End With

Daniel

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select"
j'obtiens comme dernière ligne la ligne 24. Comment faire pour obtenir la
ligne 50 ?

@+
Philippe
Avatar
michdenis
Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
Daniel.C
Deux choses, Denis :
1. DerLig = .Range("_FilterDataBase").Rows.Count
suppose que le filtre soit sur la ligne 1.

2. Tu peux avoir avoir des valeurs en dehors de la plage filtrée,
éventuellement en dessous.

Daniel

Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
michdenis
Bon, si tu tiens vraiment à un bout de code qui tient
compte de divers scénario, teste ceci :
(je te dis toute suite, je devrai majorer la note !)
;-)
'------------------------------------
Sub test()
Dim DerLig As Long, LastRow As Long
With Feuil1
LastRow = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count + _
.Range("_FilterDataBase")(1, 1).Row - 1
End If
End With
MsgBox Application.Max(DerLig, LastRow)
End Sub
'------------------------------------



"Daniel.C" a écrit dans le message de groupe de discussion :

Deux choses, Denis :
1. DerLig = .Range("_FilterDataBase").Rows.Count
suppose que le filtre soit sur la ligne 1.

2. Tu peux avoir avoir des valeurs en dehors de la plage filtrée,
éventuellement en dessous.

Daniel

Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
Daniel.C
;-)))

Daniel

Bon, si tu tiens vraiment à un bout de code qui tient
compte de divers scénario, teste ceci :
(je te dis toute suite, je devrai majorer la note !)
;-)
'------------------------------------
Sub test()
Dim DerLig As Long, LastRow As Long
With Feuil1
LastRow = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count + _
.Range("_FilterDataBase")(1, 1).Row - 1
End If
End With
MsgBox Application.Max(DerLig, LastRow)
End Sub
'------------------------------------



"Daniel.C" a écrit dans le message de groupe de
discussion :
Deux choses, Denis :
1. DerLig = .Range("_FilterDataBase").Rows.Count
suppose que le filtre soit sur la ligne 1.

2. Tu peux avoir avoir des valeurs en dehors de la plage filtrée,
éventuellement en dessous.

Daniel

Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
michdenis
La réponse précédente ne tenait pas compte de la possibilité
d'avoir une ligne masquée comme dernière ligne de
la plage (dans une plage non filtrée).

Pour obtenir la dernière ligne occupée par une donnée
ou formule que cette dernière soit masquée ou visible :
'------------------------------------
Sub test()
Dim L As Long
With Feuil1
Limite .Name
L = .UsedRange.Rows.Count
Do While Application.CountA(.Rows(L)) = 0
L = L - 1
Loop
End With
MsgBox L
End Sub
'------------------------------------
Sub Limite(Nom As String)
With Worksheets(Nom)
.UsedRange
End With
End Sub
'------------------------------------



"michdenis" a écrit dans le message de groupe de discussion :
#
Bon, si tu tiens vraiment à un bout de code qui tient
compte de divers scénario, teste ceci :
(je te dis toute suite, je devrai majorer la note !)
;-)
'------------------------------------
Sub test()
Dim DerLig As Long, LastRow As Long
With Feuil1
LastRow = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count + _
.Range("_FilterDataBase")(1, 1).Row - 1
End If
End With
MsgBox Application.Max(DerLig, LastRow)
End Sub
'------------------------------------



"Daniel.C" a écrit dans le message de groupe de discussion :

Deux choses, Denis :
1. DerLig = .Range("_FilterDataBase").Rows.Count
suppose que le filtre soit sur la ligne 1.

2. Tu peux avoir avoir des valeurs en dehors de la plage filtrée,
éventuellement en dessous.

Daniel

Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne, les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans cette
configuration je lance la commande "Selection.End (xlDown).Select" j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50 ?

@+
Philippe
Avatar
Gouap
Bonsoir,

J'ai tester toutes les macros que vous me proposez (sans réussir à les
comprendre vraiment) et ça fonctionne.
Je vais donc tenter d'en intégrer une dans mon code !
Comme celle de Michdenis me parait la plus claire je retiendrais celle-ci
même si je comprends tout pour le moment ;)

Merci à vous 2 pour votre aide.
Bonne soirée !
Philippe

"michdenis" a écrit dans le message de news:
%
La réponse précédente ne tenait pas compte de la possibilité
d'avoir une ligne masquée comme dernière ligne de
la plage (dans une plage non filtrée).

Pour obtenir la dernière ligne occupée par une donnée
ou formule que cette dernière soit masquée ou visible :
'------------------------------------
Sub test()
Dim L As Long
With Feuil1
Limite .Name
L = .UsedRange.Rows.Count
Do While Application.CountA(.Rows(L)) = 0
L = L - 1
Loop
End With
MsgBox L
End Sub
'------------------------------------
Sub Limite(Nom As String)
With Worksheets(Nom)
.UsedRange
End With
End Sub
'------------------------------------



"michdenis" a écrit dans le message de groupe de
discussion :
#
Bon, si tu tiens vraiment à un bout de code qui tient
compte de divers scénario, teste ceci :
(je te dis toute suite, je devrai majorer la note !)
;-)
'------------------------------------
Sub test()
Dim DerLig As Long, LastRow As Long
With Feuil1
LastRow = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count + _
.Range("_FilterDataBase")(1, 1).Row - 1
End If
End With
MsgBox Application.Max(DerLig, LastRow)
End Sub
'------------------------------------



"Daniel.C" a écrit dans le message de groupe de
discussion :

Deux choses, Denis :
1. DerLig = .Range("_FilterDataBase").Rows.Count
suppose que le filtre soit sur la ligne 1.

2. Tu peux avoir avoir des valeurs en dehors de la plage filtrée,
éventuellement en dessous.

Daniel

Bonjour,

Tu as essayé quelque chose comme :

'----------------------------------------
Sub test()
Dim DerLig As Long
With Feuil1
If .FilterMode = True Then
DerLig = .Range("_FilterDataBase").Rows.Count
Else
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End If
End With
MsgBox DerLig
End Sub
'----------------------------------------



"Gouap" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avec la commande "Selection.End (xlDown).Select" j'obtiens la dernière
cellule utilisée et de là, je peux en déduire le nombre de ligne utilisée
sur ma feuille. Seulement pour cela il faut que toutes les lignes soient
visibles ce qui m'interdit d'utilier un filtrage de données.

Existe-t-il un moyen de contourner le problème ?

Exemple :
J'ai une feuille dont la 1ere ligne est une ligne d'entête de colonne,
les
50 lignes situées au dessous sont 50 lignes de données et j'applique un
filtre qui va masquer les lignes 5 à 10 + les lignes 25 à 50. Si dans
cette
configuration je lance la commande "Selection.End (xlDown).Select"
j'obtiens
comme dernière ligne la ligne 24. Comment faire pour obtenir la ligne 50
?

@+
Philippe