XL 2019 Sélectionner dernières cellules non vide sur une ligne (VBA)

bluesky12000

XLDnaute Nouveau
Bonjour à tous,

J'ai un problème qui doit être très simple à régler mais je débute en VBA sur Excel.
J'ai un tableau qui va de A1 à H1 et qui s'étend vers le bas au fur et à mesure.
Je souhaite créer un bouton pour supprimer la dernière ligne qui contient des données mais mon code efface uniquement la dernière cellule A au lieu d'aller jusqu'à H

VB:
Sheets("Nom de la feuille").Select
Range("A1:H1").End(xlDown).Select
Selection.ClearContents

Merci pour votre aide,
 

soan

XLDnaute Barbatruc
Bonjour bluesky12000,

essaye ceci :

VB:
Sub Essai()
  Dim dlg&: Application.ScreenUpdating = 0
  dlg = Columns("A").Find("*", , , , , xlPrevious).Row
  If dlg > 1 Then Cells(dlg, 1).Resize(, 8).ClearContents
End Sub

ceci est pour un tableau structuré (ListObject), car tu as écrit :
« J'ai un tableau qui va de A1 à H1 et qui s'étend vers le bas
au fur et à mesure. »


soan
 

soan

XLDnaute Barbatruc
@bluesky12000

lis d'abord mon post précédent.

au cas où ton tableau ne serait pas un tableau structuré,
et c'est toi qui l'étend manuellement au fur et à mesure,
c'est plus simple :


Code:
Sub Essai()
  Dim dlg&: Application.ScreenUpdating = 0
  dlg = Cells(Rows.Count, 1).End(xlUp).Row
  If dlg > 1 Then Cells(dlg, 1).Resize(, 8).ClearContents
End Sub

tu peux aussi mettre : dlg = [A1].End(xlDown).Row
mais là, il ne doit pas y avoir de lignes vides intercalaires
dans les lignes de données de ton tableau.




pour le code VBA du post #2 et celui-ci, le test > 1 est pour éviter
d'effacer la ligne d'en-têtes, à supposer que tu as une ligne d'en-
têtes en ligne 1 (et pas la première ligne de données).


soan
 
Dernière édition:

Phil69970

XLDnaute Impliqué
Bonjour Bluesky12000, le forum

VB:
Sub SupLigne()
Application.ScreenUpdating = False

ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).EntireRow.Delete Shift:=xlUp

End Sub
Ceci est tiré d'un petit exemple que j'avais fait sur ce forum....
Tu peux regarder le code pour t'en inspiré...

@Phil69970
 

Pièces jointes

  • Test Ajout Lgne Protegee par MDP.xlsm
    26.1 KB · Affichages: 1

bluesky12000

XLDnaute Nouveau
Bonjour Bluesky12000, le forum

VB:
Sub SupLigne()
Application.ScreenUpdating = False

ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).EntireRow.Delete Shift:=xlUp

End Sub
Ceci est tiré d'un petit exemple que j'avais fait sur ce forum....
Tu peux regarder le code pour t'en inspiré...

@Phil69970
Merci Phil69970, par contre ce code efface toute la ligne, alors que que j'ai des données importantes après H
 

bluesky12000

XLDnaute Nouveau
Bonjour bluesky12000,

essaye ceci :

VB:
Sub Essai()
  Dim dlg&: Application.ScreenUpdating = 0
  dlg = Columns("A").Find("*", , , , , xlPrevious).Row
  If dlg > 1 Then Cells(dlg, 1).Resize(, 8).ClearContents
End Sub

ceci est pour un tableau structuré (ListObject), car tu as écrit :
« J'ai un tableau qui va de A1 à H1 et qui s'étend vers le bas
au fur et à mesure. »


soan
Merci Soan, donc le 8 correspond à la colonne H ?
 

soan

XLDnaute Barbatruc
@bluesky12000 : exact : 8 = colonne H !

@Phil69970 : salut ! :)

remarque : tu as mis :
.EntireRow.Delete Shift:=xlUp
comme tu supprimes la ligne entière, le décalage haut est inutile :
c'est fait de toute façon automatiquement, par le seul fait de
supprimer la ligne.

le décalage haut est utile uniquement quand c'est sur une plage
de colonnes données, pour remonter les lignes du tableau sans
interférer sur un autre tableau qui serait à côté.


soan
 
Dernière édition:

bluesky12000

XLDnaute Nouveau
Merci Soan le code fonctionne parfaitement, donc le 8 correspond à la colonne H ? Il s'agit en effet d'un tableau, par contre si j'ai déjà effacer une ligne une fois,
@bluesky12000 : exact : 8 = colonne H !

@Phil69970 : salut ! :)


soan
Super, merci. Il s'agit bien d'un tableau. Par contre si j'efface la ligne une fois, je me retrouve avec une ligne vierge. Du coup si je relance le code (ex, je veux effacer les 2 dernières entrées) ça n'a pas l'air de fonctionner. C'est normal ? Après ce n'est pas plus mal, ca évite de faire des erreurs, comme on ne peut pas revenir en arrière avec le VBA :) Merci pour la réactivité et bonne nuit
 

soan

XLDnaute Barbatruc
@bluesky12000

oui, si tu supprimes la dernière ligne d'un tableau structuré
qui est aussi la première et la seule ligne du tableau, alors
la ligne ne disparaît pas car un tableau a forcément au
moins une ligne : il ne peut pas y avoir aucune ligne de
données et seulement la ligne d'en-têtes.

tu as écrit : «
si je relance le code (ex, je veux effacer les 2 dernières entrées)
ça n'a pas l'air de fonctionner. C'est normal ? »
difficile d'y répondre sans voir le fichier ; il faudrait aussi que
tu détailles plus concrètement les manips que tu fais.

bonne nuit à toi aussi. 😴


soan
 
Dernière édition:

soan

XLDnaute Barbatruc
@bluesky12000

petite rectification : dans mon post #7, j'ai écrit : « exact : 8 = colonne H »

c'est vrai, mais dans le contexte de
Cells(dlg, 1).Resize(, 8) c'est plutôt :
à partir de la colonne 1 ("A"), 8 colonnes en tout, de A à H ; si j'avais mis :

Cells(dlg, 5).Resize(, 8) ça aurait été : à partir de la colonne 5 ("E"),
8 colonnes en tout, de E à L.

donc j'avais répondu un peu trop vite, mais c'était quand même correct,
car ça coïncidait bien avec la colonne H pour : à partir de la colonne 1.


soan
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Si vraiment, il s'agit d'un Tableau "structuré" (Listobject), alors autant utiliser la syntaxe dédiée.
VB:
Sub Efface_DerLigne_Tableau()
Dim k&
With ActiveSheet.ListObjects(1).DataBodyRange
k = .Rows.Count: .Rows(k) = ""
End With
End Sub
Sub Supprime_DerLigne_Tableau()
Dim k&
With ActiveSheet.ListObjects(1).DataBodyRange
k = .Rows.Count: .Rows(k).Delete
End With
End Sub
Sinon voir les réponses précédentes

NB: Pour info
A Vesoul, La Table ou Ixelles , le H est la 8ième lette de notre l'alphabet bicaméral.
Pour ma part, qui dit colonne H, dit Berlin 1928 ;)
 

bluesky12000

XLDnaute Nouveau
Bonjour le fil

Si vraiment, il s'agit d'un Tableau "structuré" (Listobject), alors autant utiliser la syntaxe dédiée.
VB:
Sub Efface_DerLigne_Tableau()
Dim k&
With ActiveSheet.ListObjects(1).DataBodyRange
k = .Rows.Count: .Rows(k) = ""
End With
End Sub
Sub Supprime_DerLigne_Tableau()
Dim k&
With ActiveSheet.ListObjects(1).DataBodyRange
k = .Rows.Count: .Rows(k).Delete
End With
End Sub
Sinon voir les réponses précédentes

NB: Pour info
A Vesoul, La Table ou Ixelles , le H est la 8ième lette de notre l'alphabet bicaméral.
Pour ma part, qui dit colonne H, dit Berlin 1928 ;)
Merci beaucoup pour tes codes Staple. Malheureusement je ne suis pas sur de tout comprendre.
Que signifie k& ?
Sinon, comment avoir la liste des objets dans dans une feuille ? ici mon tableau s'appelle Tab54

Et merci pour ce cours d'échecs :)
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil,

k&
C'est comme: k As Long
Et k ici représente le nombre de lignes dans le tableau*

*:Mais un tableau "structuré" => Sur le ruban Insertion=>Tableau (Attention:Tableau et non pas Tableau Croisé Dynamique)

De quel objet tu parles?
Des tableaux? =>ListObject
ou de formes => Shapes

PS: De rien, pour les échecs, c'était un petit clin d'œil en guise de bonus.
;)
 

bluesky12000

XLDnaute Nouveau
Bonsoir le fil,

k&
C'est comme: k As Long
Et k ici représente le nombre de lignes dans le tableau*

*:Mais un tableau "structuré" => Sur le ruban Insertion=>Tableau (Attention:Tableau et non pas Tableau Croisé Dynamique)

De quel objet tu parles?
Des tableaux? =>ListObject
ou de formes => Shapes

PS: De rien, pour les échecs, c'était un petit clin d'œil en guise de bonus.
;)
Je parlais de ListObjects, comment savoir que de mon cas ListObjects(1) est bien égal à ListObjects("Table54"). Un peu comme le selection pane (alt+f10)

J'ai ajouté un message d'avertissement avant d'effacer la ligne pour éviter de faire des erreurs.
Je me demande s'il est possible de lire le contenu de la ligne plutôt que d'avoir la valeur de K ? J'ai ajouté +1 à K pour obtenir le bon numéro de ligne (avec le titre)

VB:
Sub EffacerDerniereLigne()

Dim k As Long

With ActiveSheet.ListObjects("Table54").DataBodyRange
k = .Rows.Count

If MsgBox("Etes-vous certain de vouloir supprimer le contenu de la ligne " & k + 1, vbYesNo, "Demande de confirmation") = vbYes Then
.Rows(k).Delete
End If

End With

End Sub

Merci beaucoup,
 
Dernière édition:

Discussions similaires

Réponses
9
Affichages
324
Haut Bas