VBA - Problème pour trouver la dernière cellule non vide d'une colonne

Bonjour à tous,

Je possède un tableau de A3 à D103. Dans ma colonne B j'ai une date et dans ma colonne A j'ai une formule Si qui renvoie l'année de la date : =SI(B3="";"";ANNEE($B$3)). Cette formule est étendu j'usqu'à la cellule A103.

Je cherche à trouver en VBA la dernière cellule non vide de ma colonne A avec le code suivant :

Dim dernière_ligne1 As Long

dernière_ligne1 = onglet1.Cells(103, 1).End(xlUp).Row

Mais il me renvoi toujours la cellule A103

Par exemple si je n'ai pas de date en B4, la formule Si renvoi "" en A4, mais mon code VBA me renvoi la cellule A103 comme dernière cellule non vide de la colonne A alors que je souhaiterais qu'il me renvoi la cellule A3

Avez-vous une solution à me proposer ?

Merci d'avance celles et ceux qui prendront le temps de se pencher sur mon cas.

Jérémy

Bonjour,

dernière_ligne1 = onglet1.Cells(rows.count, 1).End(xlUp).Row

ou

dernière_ligne1 = onglet1.Cells(1, 1).End(xlDown).Row

selon que tu veuilles la dernière cellule vide de la colonne ou la première

Salut Jérémy,

Sinon tu peux faire comme cela :

dernière_ligne1 = onglet1.Cells(1, 1).End(xlDown).Row

Cela implique qu'il ne faut pas qu'il y ai une cellule vide entre des cellules non-vides dans ta colonne A.

Bonne journée,

Baboutz

EDIT : Bonjour Steelson, toujours aussi rapide !

Bonjour

Teste comme ceci (B2 étant la première cellule remplie par l'entête)

dernière_ligne1 =onglet1.Range("B2").End(xlDown).Row + 1

Bonjour à vous trois et merci pour vos solutions.

M12 merci pour ton bout de code mais dans mon cas il faut que je reste sur la colonne A

J'ai essayé les solution et à chaque fois ça me renvoi vers A103. En fait même si je n'ai qu'une seule date de renseigner dans ce tableau en B3, les formules sont tout de même étendu jusqu'à la ligne 103 et même si elles renvoi un résultat "" elles comporte tout de même des formule et je me demande si ce n'est pas ça qui m'embête.

Mets alors un fichier excel simplifié, c'est sans doute qu'on n'a pas vraiment compris le soucis !

Et si ta cellule comporte une formule, en effet, le xldown ira jusqu'au bout des formules ! il faut plutôt dans ce cas faire une recherche de empty ""

M12 merci pour ton bout de code mais dans mon cas il faut que je reste sur la colonne A

Il te suffit de mettre "A1" à la place dans le code de M12.

Et comme dit Steelson, un fichier serait de bonne augure pour t'aider!

Bonjour à tous,

Est-ce que votre plage est un tableau structuré ? Car dans ce cas, vous ne devriez pas vous embêter avec des lignes vides (les formules étant automatiquement reproduite à l'insertion de lignes). La ligne suivante pourrait suffire :

dl = range("tableau").rows.count 'donne le nombre de lignes du tableau (et pas vraiment la ligne sur la feuille)

Sinon, s'il y a un risque que des cellules intermédiaires soient vides :

dl = Evaluate("MAX((A3:A103<>"""")*ROW(A3:A103))")

Cdlt,

Voici un fichier explicatif pour mieux comprendre. Je tiens à préciser que je l'ai simplifier au maximum.

En fait je travaille pour un distributeur Multi-marques et je suis en train de mettre en place un outil de reporting des activités marketing. Nous réalisons des opérations marketing pour ces marques. Ces opérations sont parfois mono marque et parfois multi marques.

Mon but final c'est de venir copier la plage H3:L3 pour les ajouter dans une base. le soucis c'est que quand il s'agit d'une opération Multi marque il me faut autant de ligne que de marque.

Donc en retrouvant la dernière cellule non vide je peux venir copier coller la plage H3:L3 en cas de mono marque et H3:L5 en cas de multi marque comme dans mon exemple.

J'espère que c'est assez clair n,'hésitez pas à revenir vers moi si vous avez des intérrogations.

77formulaire-mkt.xlsx (24.24 Ko)
Sub premiereLigneVide()
Dim r As Range
Set r = ActiveSheet.Columns("B").Find("", LookIn:=xlValues)
If Not r Is Nothing Then MsgBox "Première ligne vide : " & r.Row
End Sub
88buzz.xlsm (13.84 Ko)

Une alternative inspirée de la dernière proposition de Steelson :

on error goto fin
dl = Range("b3:b103").SpecialCells(xlCellTypeBlanks)(0).row
'...
exit sub
fin:
msgbox "aucune vide"
end sub

Cdlt,

Le problème est différent !

Mon but final c'est de venir copier la plage H3:L3 pour les ajouter dans une base. le soucis c'est que quand il s'agit d'une opération Multi marque il me faut autant de ligne que de marque.

Comme le suggérait la réponse de 3GB que je salue, si tes donnes étaient en tableau, alors il suffirait de rajouter une ligne au tableau dont on connait la longueur (et sans même la calculer).

Salut Buzz,

à part la ligne 393 (qu'est-ce ?), ceci pourrait fonctionner... mais il reste la ligne 393 !?
Peut-on avoir des repères d'affichage entre ton tableau "Marketing" et cette partie souterraine ?

iRow = Columns(7).Find(what:="*", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious).Row


A+

Si tes données résultat sont en tableau

With ActiveSheet.ListObjects("ta_base_de_données_résultat")
    .ListRows.Add
    derL = .ListRows.Count
    Range("ce_que_tu_veux_copier").Copy Destination:=.DataBodyRange.Cells(derL, 1)
End With

Bonjour Curulis !

Si tableau structuré, car je n'aime pas les copiés/collés et que j'évite ça au maximum

Dim tbl()

With ActiveSheet.ListObjects("ta_base_de_données_résultat")
    .ListRows.Add
    tbl = Range("ce_que_tu_veux_copier").Value
    .DataBodyRange.Rows(.ListRows.Count) = tbl
End With

Je suis assez intéressé par cette histoire de tableau structuré. Est-ce que l'un d'entre vous aurait la gentillesse de me montrer ce que ça donnerai car je ne suis pas sur de comprendre à 100% les propositions de Baboutz et Steelson. J'apprends le VBA de façon autodidacte donc je n'ai pas toujours les connaissances nécessaires pour tout assimiler sans exemple sur lequel m'appuyer

PS: la ligne 393 c'est un oublie de ma part elle n'a rien à faire ici.

Salut Buzz,
Salut la fine équipe,
Mes respects, Steelson,

PS: la ligne 393 c'est un oublie de ma part elle n'a rien à faire ici.

dans ce cas, sans prétendre, loin s'en faut, être meilleure qu'une autre, l'instruction VBA suivante fonctionne très bien.

iRow = Columns("H").Find(what:="*", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious).Row

Cela dit, tu indiques sans cesse la colonne [A:A] mais tes formules sont dans [H:L]... ?


A+

Je suis en train de regarder pour les tableau structuré.

Curulis concernant ta solution pourrais-tu me montrer ce que ça donne dans le fichier que j'ai joint précédemment ? Car de mon côté ça ne donne pas le résultat voulu.

Oui au début je parlé d'un tableau qui commençais en A3 mais vu que j'ai joint une version simplifié de mon fichier ça a juste décaler le tableau qui se trouve en H3, du coup maintenant.

Voici votre fichier avec un tableau structuré (nommé "Recap") et une plage nommée "Saisie" correspondant à chaque entrée du formulaire.

Cdlt,

100formulaire-mkt.xlsm (27.68 Ko)

Edit : Et ça ne couterait pas grand-chose de passer l'année en valeur et de s'affranchir ainsi des formules...

Bonjour 3 GB !

Merci pour votre fichier

J'ai compris le principe est effectivement c'est très pratique. mais dans le cas d'une activité Multi marque je ne vais pas pouvoir faire rentrer une ligne par marque dans mon tableau à moins que je me trompe ?

C'était pour ça que j’avais à la base fais un tableau "intermédiaire" (présent en H3:L103) pour pouvoir copier les lignes qui apparaitraient (une seule si mono-marque, plusieurs si multi) et ensuite aller les coller dans ma base de données.

Rechercher des sujets similaires à "vba probleme trouver derniere vide colonne"