XL 2019 VBA - Supprimer une ligne désignée

im_Guillaume

XLDnaute Nouveau
Bonjour,

Merci à ce forum qui me sauve décidément la journée,

Voici mon problème :
J'ai une base de données à disposition.
L'utilisateur doit mettre une croix devant la ligne qu'il souhaite supprimer dans l'onglet "Base de données pour modif"
Et le VBA se charge de le faire dans l'onglet "BDDsource" lorsqu'il appuie sur le bouton :

Voici mon code (boucle), qui bug et plante excel (car elle doit rester ouverte?) :

Sub Supprimer()

Dim i As Integer
i = 5

While i < Sheets("BDDsource").Range("C5").CurrentRegion.End(xlDown).Row 'i va du début (5) à la fin (l'indice de la dernière ligne de la liste)
If Sheets("Base de données pour modif").Cells(i, 2) = "x" Then
Sheets("BDDsource").Rows(i).EntireRow.Delete
i = i + 1
End If
Wend

End Sub


Merci beaucoup pour votre aide!
 

Pièces jointes

  • Guillaume_ED_v06.xlsm
    15.5 KB · Affichages: 4

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Guillaume, bonjour le forum,

Quand on supprime plusieurs lignes dans un tableau, il faut toujours faire une boucle inversée en commençant par la fin.De plus, si tu ne supprimes que la ligne de l'onglet BDDsource, lors de la prochaine suppression tu n'auras plus de concordance entre les deux tableaux. D'ailleurs je me demande pourquoi 2 tableaux ?!...
Une proposition :

VB:
Sub Supprimer()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OS (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set OS = Worksheets("Base de données pour modif") 'définit l'onglet source OS
Set OD = Worksheets("BDDsource") 'définit l'onglet destination OD
DL = OS.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne B de l'onglet OS
For I = DL To 5 Step -1 'boucle inversée : de DL à 5 en remontnant
    If OS.Cells(I, "B") = "x" Then 'condition : si la cellule ligne I colonne B de l'onglet OS vaut "x"
        OD.Rows(I).EntireRow.Delete 'supprime la ligne I de l'onglet OD
        'supprime la ligne I de l'onglet OS (il me semble sinon tu n'auras plus de correspondance entre les deux onglets)
        OS.Rows(I).EntireRow.Delete
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub
 

Discussions similaires

Réponses
7
Affichages
338
Réponses
12
Affichages
243

Statistiques des forums

Discussions
312 161
Messages
2 085 853
Membres
103 005
dernier inscrit
gilles.hery