web-dev-qa-db-fra.com

Supprimer une ligne dans Excel VBA

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

35
Andrei Ion

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.

54
Ed Bolton

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.

4
Jordan D. Karim

Changer votre ligne

ws.Range(Rand, 1).EntireRow.Delete

à 

ws.Cells(Rand, 1).EntireRow.Delete 
3
chris neilsen

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
0
Matt Wilko