J'ai ce morceau de code qui trouve la ligne Excel d'un élément d'une liste et supprime les éléments d'une liste. Ce que je veux ... c'est aussi supprimer la ligne Excel.
Le code est ici
Private Sub imperecheaza_Click()
Dim ws As Worksheet
Dim Rand As Long
Set ws = Worksheets("BD_IR")
Rand = 3
Do While ws.Cells(Rand, 4).Value <> "" And Rand < 65000
If ws.Cells(Rand, 4).Value = gksluri.Value * 1 And ws.Cells(Rand, 5).Value = gksluri.List(gksluri.ListIndex, 1) * 1 Then
ws.Range(Rand, 1).EntireRow.Delete '(here I want to delete the entire row that meets the criteria from the If statement)
gksluri.RemoveItem gksluri.ListIndex
Exit Do
End If
Rand = Rand + 1
Loop
End Sub
Où j'ai ajouté ws.Range (Rand, 1) .EntireRow.Delete est l'endroit où je veux supprimer toute la ligne, mais je ne sais pas comment le faire. Ce que je veux ... si elle trouve la même valeur dans une cellule, comme dans un élément sélectionné de ma liste, afin de pouvoir supprimer à la fois la ligne entière dans Excel et l'élément de la liste Cela fonctionne pour supprimer l'élément de la liste mais je ne sais pas comment supprimer la ligne aussi
La solution de Chris Nielsen est simple et fonctionnera bien. Une option légèrement plus courte serait ...
ws.Rows(Rand).Delete
... notez qu'il n'est pas nécessaire de spécifier un décalage lors de la suppression d'une ligne car, par définition, il n'est pas possible de déplacer à gauche
Incidemment, ma méthode préférée pour supprimer des lignes est d'utiliser ...
ws.Rows(Rand) = ""
... dans la boucle initiale. J'utilise ensuite une fonction de tri pour pousser ces lignes au bas des données. La raison principale en est que la suppression de lignes uniques peut être une procédure très lente (si vous supprimez> 100). Cela garantit également que rien ne soit oublié selon le commentaire de Robert Ilbrink
Vous pouvez apprendre le code de tri en enregistrant une macro et en réduisant le code, comme indiqué dans/ expert Excel video . Je soupçonne que la méthode la plus soignée (Range ("A1: Z10"). Clé de tri1: = Range ("A1"), Order1: = xlSortAscending/Descending, En-tête: = xlYes/No) ne peut être découverte que sur Les versions 2007 d'Excel ... mais vous pouvez toujours réduire le code équivalent à 2007/2010
Couple plus de points ... Si votre liste n'est pas déjà triée par une colonne et que vous souhaitez conserver l'ordre, vous pouvez coller le numéro de ligne "Rand" dans une colonne disponible à la droite de chaque ligne lorsque vous passez en boucle. Vous pouvez alors trier par ce commentaire et l'éliminer
Si vos lignes de données contiennent un formatage, vous pouvez rechercher la fin de la nouvelle plage de données et supprimer les lignes que vous avez effacées précédemment. C'est pour garder la taille du fichier. Notez qu'une seule suppression volumineuse à la fin de la procédure n'affectera pas les performances de votre code de la même manière que la suppression de lignes uniques.
Mieux encore, utilisez union pour saisir toutes les lignes que vous souhaitez supprimer, puis supprimez-les toutes en même temps. Les lignes ne doivent pas nécessairement être continues.
dim rng as range
dim rDel as range
for each rng in {the range you're searching}
if {Conditions to be met} = true then
if not rng is nothing then
set rDel = union(rng,rDel)
else
set rDel = rng
end if
end if
next
rDel.entirerow.delete
De cette façon, vous n'avez pas à vous soucier du tri ou de ce qui se passe en bas.
Changer votre ligne
ws.Range(Rand, 1).EntireRow.Delete
à
ws.Cells(Rand, 1).EntireRow.Delete
Quelque chose comme ça va le faire:
Rows("12:12").Select
Selection.Delete
Donc, dans votre code, cela ressemblerait à quelque chose comme ça:
Rows(CStr(Rand) & ":" & CStr(Rand)).Select
Selection.Delete