Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VBA] suppression de lignes

    9 août 2018 à 14:23:13

    Bonjour

    Je dispose d'un tableau des colonnes de ce tableau ne présente pas de cellules vides, et d'autres colonnes si. Je cherche à supprimer les lignes dont les cellules sont vides pour une colonne précise.

    j'ai d'abord essayé avec une boucle, mais elle ne fonctionne pas ou est trop longue à se faire,voici le code que j'ai utilisé:

    Sub test()
    
    Dim i As Long
    
    With Sheets("DataIn").Activate
    For i = 8 To 50000
    If Cells(i, 18) = "" Then 
    rows(i).delete
    End If
    
    Next i
    End With
    
    End Sub
    


    j'ai trouvé un autre code sur internet, mais elle demande à choisir une colonne pour çà:

    Sub DeleteBlackCell()
    Dim Rng As Range
    Dim WorkRng As Range
    On Error Resume Next
    xTitleId = "KutoolsforExcel"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
    Set WorkRng = WorkRng.SpecialCells(xlCellTypeBlanks)
    If Err = 0 Then
    WorkRng.EntireRow.Delete
    End If
    End Sub

    Comment je peux l'adapter pour ne pas avoir à sélectionner la plage, et qu'elle le fasse automatiquement.

    lequelle des 2 codes est le plus adapter à mon càs (en terme de rapidité d'exécution)?

    • Partager sur Facebook
    • Partager sur Twitter
      12 août 2018 à 22:04:51

      Salut,

      Je pense que ceci fera l'affaire :

      Sub colonne_18()
      Application.Calculation = xlCalculationManual
      
      Dim i As Integer
      Sheets("DataIn").Activate
      
      For i = Range("R65536").End(xlUp).Row To 8 Step -1
          If IsEmpty(Cells(i, 18)) Then Rows(i).Delete
      Next i
      
      Application.Calculation = xlCalculationAutomatic
      End Sub

      Je prends d'en bas : ligne 65536 (bien entendu, la version EXCEL 2016 permet bien plus mais c'est à toi d'ajuster à la taille de ton tableau)

      "To 8 step -1" veut dire qu'on va remonter jusqu'à la ligne 8 en décrémentant d'1 à chaque fois. (peut-être faudrait-il mettre 9 si la cellule R8 est vide mais que la ligne doit être gardée : à toi de voir).

      On contrôle donc si la cellule est vide avec "IsEmpty" et on supprime si c'est le cas.

      "Application.calculation = XlCalculationManual" permet de ne faire aucun calcul pendant l'exécution de la macro.

      En fin de Macro, on le replace en XlCalculationAutomatic Afin qu'Excel se comporte normalement !

      J'espère avoir assez bien détaillé et avoir réussi à t'aider...

      [EDIT] On peut aussi ajouter "Application.screenupdating = false" en début de macro et "Application.screenupdating = True" en fin de macro pour optimiser encore un peu plus le temps d'exécution.
      Ce qui donnerait :

      Sub colonne_18()
      Application.screenpdating = False
      Application.Calculation = xlCalculationManual
      
      Dim i As Integer
      Sheets("DataIn").Activate
      
      For i = Range("R65536").End(xlUp).Row To 8 Step -1
          If IsEmpty(Cells(i, 18)) Then Rows(i).Delete
      Next i
      
      Application.Calculation = xlCalculationAutomatic
      Application.screenupdating = True
      End Sub

      On pourrait aussi ajouter "Application.EnableEvents =..." mais ce n'est pas nécessaire pour cette macro.

      -
      Edité par Tr!ck 17 août 2018 à 9:37:11

      • Partager sur Facebook
      • Partager sur Twitter
        16 août 2018 à 11:06:10

        Merci beaucoup pour ton aide Tr!ck,

        Juste pour ma culture perso, çà change quoi  de ne faire aucun calcul pendant la macro?

        Cà n'applique pas les calculs du classeur, mais lorsque que tu réactive les calculs auto , çà met à jour les calculs du classeur?

        • Partager sur Facebook
        • Partager sur Twitter
          16 août 2018 à 20:41:29

          [Par contre, J'ai modifié mon code plus haut afin de prendre la colonne concernée (R65536) dans la recherche de dernière ligne. Enfin, ça c'est à toi de voir en fonction de comment est ton tableau. Sans l'avoir sous les yeux, il est difficile d'opter pour la bonne méthode.]

          Exactement. En théroie, de base, Excel recalcule l'onglet dès qu'une cellule change. Il est évident que de supprimer plusieurs lignes oblige Excel à faire des calculs.

          On réduit ainsi le temps d'exécution d'une macro en ne calculant pas, si ce n'est pas nécessaire. Ce qui est le cas ici !

          Le "sreenupdating" est l'affichage graphique. On va donc éviter de perdre du temps en affichant l'onglet à chaque fois qu'il supprime une ligne. Même si c'est occupé par la carte graphique sur un bon PC, autant l'optimiser et gagner un peu de temps quand-même. :D

          [EDIT] Petit détail, pour ceux que ça intéresse :

          Pourquoi partir d'en bas et remonter ?

          On va voir la ligne 65536. Si elle est vide, on la supprime. OK ?

          On supprime donc la ligne 65536 et on passe à la ligne 65535 (step -1)

          On contrôle celle-ci et il y a une valeur en colonne R. On ne supprime pas !

          On passe donc à 65534... et ainsi de suite.

          Si on démarre de la ligne 8 et qu'on va vers le bas (65536)? imaginons ligne 14 colonne 18 vide.

          On supprime la ligne 14 et la ligne 15 devient donc la ligne 14.

          La macro va donc passer à la ligne 15 mais le tableau ayant monté d'une ligne, on ne contrôle pas la ligne 15 (qui est devenu 14) et ainsi de suite après chaque suppression de ligne de la macro.

          D'où l'intérêt de partir du bas du tableau et non d'en haut dans le cas de figure ici.

          -
          Edité par Tr!ck 17 août 2018 à 9:40:24

          • Partager sur Facebook
          • Partager sur Twitter

          [VBA] suppression de lignes

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown