Trouver la dernière cellule non vide en VBA

Djorge84

XLDnaute Nouveau
Bonjour,

mon problème doit être simple à régler je pense, encore que pour ma part je ne vois pas comment... :confused:

Je désire trouver la dernière cellule non vide dans une plage donnée ("F10:F20").
Je pensais utiliser pour cela End(xlDown).Row, mais cela ne me donne pas ce que je veux car les cellules de la plage considérée contiennent en fait une formule Excel avec une condition If qui leur attribue la valeur "" dans certains cas...

Je me rends donc compte qu'elles ne sont pas vide au sens de End(xlDown).Row, qui me renvoie 20 (logique au final...) :p

Quelqu'un pourrait me dire comment je peux m'en sortir avec ce problème?

Merci par avance!
 

Djorge84

XLDnaute Nouveau
Re : Trouver la dernière cellule non vide en VBA

Bonjour,
votre procédure n'a pas fonctionné à cause du IsEmpty qui ne permet pas de détecter les cellules dont le contenu est vide à cause d'une formule Excel. Le IsEmpty les voit non vide... J'ai donc cherché comment résoudre ce problème et j'ai trouvé vbNullString qui fonctionne. Et j'avoue qu'après j'ai trouvé plus simple pour moi de faire un test plus simple au vu de mes connaissances en VB.

Mais je vais essayer de voir si votre procédure fonctionne en remplaçant IsEmpy peut-être?
 

Dranreb

XLDnaute Barbatruc
Re : Trouver la dernière cellule non vide en VBA

Ma procédure est actuellement la suivante:
VB:
Function PlageÀPartirDe(ByVal PlageDép As Range) As Range
Dim F As Worksheet, NbL As Long, NbC As Long, V As Variant, N As Long
Set F = PlageDép.Worksheet
With F.UsedRange: NbL = .Row + .Rows.Count - PlageDép.Row
   NbC = .Column + .Columns.Count - PlageDép.Column: End With
    If NbC < 1 Then GoTo CEstToutVide
Do: If NbL < 1 Then GoTo CEstToutVide
   V = PlageDép.Item(NbL, 1).Resize(, NbC).Value
   For N = 1 To NbC: If V(1, N) <> "" Then Exit Do
      Next N
   NbL = NbL - 1: Loop
Do: V = PlageDép.Item(1, NbC).Resize(NbL).Value
   For N = 1 To NbL: If V(N, 1) <> "" Then Exit Do
      Next N: If NbC = 1 Then GoTo CEstToutVide
   NbC = NbC - 1: Loop
Set PlageÀPartirDe = PlageDép.Resize(NbL, NbC)
Exit Function
CEstToutVide: Set PlageÀPartirDe = Nothing
End Function
Et je compte l'utiliser partout ou j'ai un classeur d'origine inconnue résultant généralement d'une extraction d'une autre application.
Car dans un classeur d'exploitation soigné c'est un Nom de plage à l'ensemble des lignes effectivement utilisées qui restera employé.
À+
 

Dranreb

XLDnaute Barbatruc
Re : Trouver la dernière cellule non vide en VBA

Non: C'est une étiquette de l'avant dernière ligne de la procédure qui fait rendre une plage vide à la fonction lorsqu'elle n'a trouvé aucune cellule contenant mieux qu'une chaîne vide.
La condition peut être testée ainsi:
VB:
Dim ClasseurX As Workbook, PlgÀPrendre As Range
'     . . .
Set PlgÀPrendre = PlageÀPartirDe(ClasseurX.Worksheets(1).Cells(2, 2))
If PlgÀPrendre Is Nothing Then MsgBox "C'est tout vide !?..."
 

nvoisn

XLDnaute Nouveau
Re : Trouver la dernière cellule non vide en VBA

Bonjour a tous,

Souhaitant trouver la dernière cellule non vide d'une colonne en VBA, et ayant trouvé une solution beaucoup plus simple, je tenais à la partager avec vous :

Le principe, partir de la dernière cellule dune colonne, et remonter jusqu’à la première cellule non vide :

Ex, dans la colonne A :

Range("A65536").End(xlUp).Row

Tout simplement!

@+
 

Dranreb

XLDnaute Barbatruc
Re : Trouver la dernière cellule non vide en VBA

Bonjour nvoisn.
Ça ne convient pas du tout pour trouver la ligne de fin et la colonne de fin de la plus petite plage contenant tout ce qui vaut plus qu'une chaîne vide, qui est le plus proche possible de rien du tout que puisse rendre une formule.
Ni de celles de la plus petite plage comportant toutes les cellules non vides qui ne contiennent pas une formule rendant une chaîne vide (à défaut de ne pouvoir rendre rien du tout). C'est très légèrement différent: une cellule contenant une constante qui est une chaîne vide pourrait à la rigueur ne pas être considérée comme vide puisqu'elle pourrait l'être, contrairement à une formule reproduite sur tout le reste de la feuille, ou presque, pour le cas où elle aurait à traiter des cellules enfin renseignées, ce qui n'est d'ailleurs pas forcément une bonne pratique...
La dernière version que j'ai retrouvé de ma fonction qui rend la plage correspondant à la 1ère définition (considérés vides même les constantes = "") est celle ci :
VB:
Function PlageÀPartirDe(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing) As Range
Dim F As Worksheet, LMax As Long, CMax As Long, Nbl As Long, NbC As Long
On Error GoTo RienTrouvé
Set F = PlageDép.Worksheet: If PlagExam Is Nothing Then Set PlagExam = F.UsedRange
LMax = PlagExam.Find("*", F.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
CMax = PlagExam.Find("*", F.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
On Error GoTo 0
Nbl = LMax - PlageDép.Row + 1: If Nbl < 1 Then GoTo CEstToutVide
NbC = CMax - PlageDép.Column + 1: If NbC < 1 Then GoTo CEstToutVide
Set PlageÀPartirDe = PlageDép.Resize(Nbl, NbC)
Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlageÀPartirDe = Nothing
End Function
Mais peu de temps avant de partir en retraite j'avais constaté qu'elle n'était pas sûre sous Excel 2000
Cordialement.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 291
Messages
2 086 843
Membres
103 399
dernier inscrit
Tassiou