XL 2019 Trouver dernière cellule avec une valeur

netparty

XLDnaute Occasionnel
Bonjour à tous

J'ai un petit soucis avec ma macro,
j'utilise le code suivant pour trouver la dernière ligne :
VB:
dlig = Cells(Rows.Count, 1).End(xlUp).Row
Mais cela sélectionne aussi les cellules avec les formules même si il n'y a pas de résultat.

Est-il possible de trouver la dernière ligne uniquement si il y a une valeur ?

Merci d'avance

Bonne journée
 

Pièces jointes

  • Exemple forum.xlsm
    27.6 KB · Affichages: 6

Jacky67

XLDnaute Barbatruc
Bonjour à tous

J'ai un petit soucis avec ma macro,
j'utilise le code suivant pour trouver la dernière ligne :
VB:
dlig = Cells(Rows.Count, 1).End(xlUp).Row
Mais cela sélectionne aussi les cellules avec les formules même si il n'y a pas de résultat.

Est-il possible de trouver la dernière ligne uniquement si il y a une valeur ?

Merci d'avance

Bonne journée
Bonjour à tous
En dehors de la question, il y a quelque chose qui m'interpelle
Fichier = Range("C2") & ".scr"
Pour mon info personnelle, a quoi va servir ce format "scr"
 

job75

XLDnaute Barbatruc
Bonjour M12, Jacky67,

On peut aussi utiliser dans la feuille cette formule matricielle :
Code:
=MAX((A5:A1000<>"")*LIGNE(A5:A1000))
à valider par Ctrl+Maj+Entrée, ou l'utiliser en VBA :
VB:
dlig = [MAX((A5:A1000<>"")*ROW(A5:A1000))]
Adapter 1000 bien sûr.

A+
 

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Je me souviens avoir discuté cette question en long et en large avec des As du forum.
Ce n'est pas si simple si on considère les filtres et les masquages possibles.
Et j'en ai déduit des fonctions que j'utilise maintenant sans me poser de question données ici pour informations.

Les options (IgnoreNullString...) sont là parce que certains des As considéraient qu'une chaine vide n'était pas une valeur (contrairement à une valeur numérique 0 !) ce qui n'était pas mon avis.
Pour résoudre ce différent géostratégique majeur, donc, les options.

VB:
Option Explicit

'----------------------------------------------------------------------
'Calcul de la dernière ligne non vide d'une colonne avec fonction Match
'DernièreLigne = DernièreLigneEnColonne(ActiveSheet.Columns(1))
'IgnoreNullStringConstant = Ignore les valeurs de chaine vide
'                           en tant que valeurs constantes
'IgnoreNullStringFormula = Ignore les valeurs de chaine vide
'                          en tant que valeurs de formules
'----------------------------------------------------------------------
Function DernièreLigneEnColonne(ByVal Colonne As Range, _
                                Optional IgnoreNullStringConstant As Boolean = False, _
                                Optional IgnoreNullStringFormula As Boolean = False) As Long
    Const ChaineMax As String = "zzzzzzzzzzzzzzzzzzzz"
    Const NombreMax As Double = (2 ^ 53 - 1) * 2 ^ 971
    Dim DernièreLigne As Long
    Dim Cel As Range
 
    If Not Colonne Is Nothing Then
        With Application
            DernièreLigne = .Max(.IfError(.Match(ChaineMax, Colonne.Columns(1), 1), 0), _
                                 .IfError(.Match(NombreMax, Colonne.Columns(1), 1), 0))
        End With
     
        'Ignorer les cellules dont la valeur constante ou formule est une chaine vide
        If IgnoreNullStringConstant Or IgnoreNullStringFormula Then
            Do While DernièreLigne > 0
                Set Cel = Colonne.Parent.Cells(DernièreLigne, Colonne.Column)
             
                'Ne pas grouper les tests (cas VarType(Cel.Value) = vbError)
                If VarType(Cel.Value) <> vbString Then Exit Do
                If Len(Cel.Value) > 0 Then Exit Do
                If Not (IgnoreNullStringFormula And Len(Cel.Formula) > 0) _
                And Not (IgnoreNullStringConstant And Len(Cel.Formula) = 0) Then Exit Do
             
                'Cellule contenant une chaine vide
                DernièreLigne = DernièreLigne - 1
            Loop
        End If
    End If
 
    DernièreLigneEnColonne = DernièreLigne
End Function

'-------------------------------------------------------------
'Calcul de la dernière colonne non vide d'une ligne par Match
'DernièreColonne = DernièreColonneEnLigne(ActiveSheet.Rows(1))
'IgnoreNullStringConstant = Ignore les valeurs de chaine vide
'                           en tant que valeurs constantes
'IgnoreNullStringFormula = Ignore les valeurs de chaine vide
'                          en tant que valeurs de formules
'-------------------------------------------------------------
Function DernièreColonneEnLigne(ByVal Ligne As Range, _
                                Optional IgnoreNullStringConstant As Boolean = False, _
                                Optional IgnoreNullStringFormula As Boolean = False) As Long
    Const ChaineMax As String = "zzzzzzzzzzzzzzzzzzzz"
    Const NombreMax As Double = (2 ^ 53 - 1) * 2 ^ 971
    Dim DernièreColonne As Long
    Dim Cel As Range

    If Not Ligne Is Nothing Then
        With Application
            DernièreColonne = .Max(.IfError(.Match(ChaineMax, Ligne.Rows(1), 1), 0), _
                                   .IfError(.Match(NombreMax, Ligne.Rows(1), 1), 0))
        End With

        'Ignorer les cellules dont la valeur constante ou formule est une chaine vide
        If IgnoreNullStringConstant Or IgnoreNullStringFormula Then
            Do While DernièreColonne > 0
                Set Cel = Ligne.Parent.Cells(Ligne.Row, DernièreColonne)
             
                'Ne pas grouper les tests (cas VarType(Cel.Value) = vbError)
                If VarType(Cel.Value) <> vbString Then Exit Do
                If Len(Cel.Value) > 0 Then Exit Do
                If Not (IgnoreNullStringFormula And Len(Cel.Formula) > 0) _
                And Not (IgnoreNullStringConstant And Len(Cel.Formula) = 0) Then Exit Do
             
                'Cellule contenant une chaine vide
                DernièreColonne = DernièreColonne - 1
            Loop
        End If
    End If
 
    DernièreColonneEnLigne = DernièreColonne
End Function
 
Dernière édition:

Discussions similaires