Macro: supprimer x ligne sur y

Résolu
userlambda2 Messages postés 6 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -
Bonjour à tous,

J'ai déjà parcouru le forum pour chercher des questions similaires mais ne connaissant rien en VBA je n'ai pas pu modifier le code des macros que je trouvais.

J'aimerai pouvoir supprimer x lignes sur y (1 ligne sur 2 ou 4 lignes sur 10 par exemple) sur des fichiers ayant un nombre de lignes variables (100 000 lignes en moyenne).

Est ce que quelqu'un a une macro qui pourrait m'aider s'il vous plait (avec si possible une explications des lignes de codes à modifier pour faire varier le pas des lignes à supprimer)

Merci d'avance

14 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,
    Désolé mais j'étais sur une autre discussion...

    Option Explicit
    Option Base 1
    Sub Supprimer_svt_pas()
    Dim Pas As Byte
    Dim Ligfin As Long, T_in(), T_out(), Idx As Long, Cptr As Long, Col As Byte
    Dim start As Single

    ReDim T_out(3, 1)

    Application.ScreenUpdating = False
    On Error GoTo Erreur
    Pas = Application.InputBox("saisir le Pas de suppression désiré", 1)
    On Error GoTo 0
    start = Timer

    'mémorisation tableaux en RAM
    Ligfin = Columns("A").Find("*", , , , , xlPrevious).Row
    T_in = Range("A5:C" & Ligfin)

    For Idx = 1 To UBound(T_in) Step Pas
    Cptr = Cptr + 1
    ReDim Preserve T_out(3, Cptr)
    For Col = 1 To 3
    T_out(Col, Cptr) = T_in(Idx, Col)
    Next
    Next

    'A SUPPRIMER APRES ESSAIS
    Range("F5").Resize(Cptr, 3) = Application.Transpose(T_out) 'pour essais
    Range("F5:H" & Cptr).Borders.Weight = xlThin
    Application.ScreenUpdating = True
    MsgBox "suppression effectuée en :" & Timer - start & " .sec."

    'A ACTIVER APRES ESSAIS
    'Range("A5:C150000").Clear
    'Range("A5").Resize(Cptr, 3) = Application.Transpose(T_out) 'pour essais
    'Range("A5:C" & Cptr).Borders.Weight = xlThin

    Exit Sub
    Erreur:
    MsgBox " la saisie doit être un nombre!", vbCritical
    End Sub


    Avec un pas de 2 :durée env 0,09 sec avec un vieux coucou (512 ram) proche de la retraite

    Ton classeur en retour
    https://www.cjoint.com/?3FqqkTsIMWW

    1
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. Prendre pour la feuille But (FB) la feuille source (FS)
    2. Effacer la feuille source avant d'y envoyer le tableau T

    Ce qui donnerait

    Option Explicit
    Option Base 1

    Const FS = "Feuil3"
    Const FB = "Feuil3"
    ' a partir de la ligne 5 on supprime 4 lignes toutes les 10 lignes
    Const lideb = 5
    Const nblisupp = 4
    Const pas = 10

    Const nbco = 3
    Const codeb = 1

    Public Sub SuppLignes2()
    Dim lifin As Long, li2 As Long, nbpas As Long, li1 As Long, co As Long
    Dim T, nbli As Long, lit As Long, s As Single
    Application.ScreenUpdating = False
    s = Timer
    With Sheets(FS)
    lifin = .Cells(Rows.Count, codeb).End(xlUp).Row
    nbpas = 1 + (lifin - lideb) \ pas
    lifin = lideb + (nbpas) * pas + nblisupp - 1
    nbli = nbpas * (pas - nblisupp)
    ReDim T(1 To nbli, 1 To nbco)
    lit = 1
    On Error GoTo suite
    For li1 = lideb To lifin Step pas
    For li2 = li1 + nblisupp To li1 + pas - 1
    For co = 1 To nbco
    T(lit, co) = .Cells(li2, co)
    Next co
    lit = lit + 1
    Next li2
    Next li1
    End With
    Sheets(FS).Range(Cells(lideb, codeb), Cells(lifin, codeb + nbco - 1)).ClearContents
    Sheets(FB).Cells(lideb, codeb).Resize(nbli, nbco) = T
    Application.ScreenUpdating = True
    MsgBox "temps mis " & Timer - s & " s"
    End Sub

    Cdlmnt
    1
  3. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Bonjour,


    For x = 1 To 100000 Step 4

    Rows(x).Delete.
    x = x - 1

    Next

    Step 4 signifie que x s'incrémente de 4. Ici, à la première boucle, x = 1, à la seconde x = 4, à la troisième x = 7 etc.

    "Il vaut mieux savoir tout chercher que chercher à tout savoir."
    0
  4. userlambda2 Messages postés 6 Statut Membre
     
    Merci pour ta réponse rapide mais VBA me dis qu'il y a une erreur de syntaxe à la ligne:

    Rows(x).Delete.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Pas de . à la fin de la ligne

    Un peu plus optimisé :
    Sub suppLig()
        Application.ScreenUpdating = False
        For lig = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -4
            Rows(lig).Delete
        Next
    End Sub

    Mais ne sera pas plus rapide qu'en ajoutant une colonne avec =MOD(LIGNE();4)
    Et avec un filtre automatique sur 'différent de 0' supprimer les lignes visibles.

    eric
    0
  7. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Oui désolé, je sais pas pk il m'a ajouté un point après Delete... Une erreur de ma part sans doute.
    0
  8. userlambda2 Messages postés 6 Statut Membre
     
    Merci les 2 macros fonctionnent bien mais prennent beaucoup de temps à cause de la boucle je suppose étant donnée que j'ai environ 100 000 lignes à traiter.

    Existe t il un moyen de faire plutôt une sélection d'1 ligne sur 4 (ou 2 lignes sur 3) avec 1 seule suppression? Genre:

    Rows("1 ligne sur 4").Select
    Selection.delete Shift:=xlUp

    Sinon j'ai essayé d'utilisé la technique du filtre automatique avec =MOD(LIGNE();4) (que je ne connaissais pas). Ça fonctionne bien mais je n'ai pas trouvé comment automatiser la suppression des lignes visibles.
    0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour à tous,

    Pour essayer un traitement rapide:

    Combien de colonnes au tableau ?

    1° colonne : A ?
    départ en ligne 2 ?

    Si possible
    mettre un extrait du classeur (env.1000 lignes maxi) sans données confidentielles en pièce jointe sur
    https://www.cjoint.com/
    puis copier l'adresse du lien et la coller dans le message de réponse

    Merci d'avance

    Michel
    0
  10. userlambda2 Messages postés 6 Statut Membre
     
    Bonjour,

    Mon fichier brut a 3 colonnes (A, B et C).
    Les 3 premières lignes sont des titres et des unités.
    Les données à traiter commencent en ligne 5.

    Extrait de 500 lignes d'une feuille d'un de mes fichiers brut:
    https://www.cjoint.com/?0FqmTq54wMS

    Merci de votre aide
    0
  11. sipherion Messages postés 1836 Date d'inscription   Statut Membre Dernière intervention   287
     
    Effectuer la suppression de 100.000 / 4 lignes ou sélectionner 100.000 / 4 lignes pour les supprimer toutes d'un coup revient au même question temps d'exécution.
    0
  12. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    un essai

    Option Explicit
    
    ' a partir de la ligne 2 on supprime 4 lignes toutes les 10 lignes
    Const lideb = 2
    Const nblisupp = 4
    Const pas = 10
    
    ' colonne renseignée
    Const co = "A"
    
    Public Sub SuppLignes()
    Dim lifin As Long, li2 As Long, nbpas As Long, li1 As Long
    Application.ScreenUpdating = False
    With ActiveSheet
     lifin = .Range(co & Rows.Count).End(xlUp).Row
     nbpas = 1 + (lifin - lideb) \ pas
     lifin = lideb + (nbpas - 1) * pas + nblisupp - 1
     For li2 = lifin To lideb Step -pas
       li1 = li2 - nblisupp + 1
       .Rows(li1 & ":" & li2).Delete
     Next li2
    End With
    Application.ScreenUpdating = True
    End Sub


    Cdlmnt
    0
  13. userlambda2 Messages postés 6 Statut Membre
     
    Merci ccm81 ça fonctionne très bien et très rapidement! Par contre pour l'utiliser sur mon fichier j'ai du renommer la feuille de résultat en "feuil3" et créer la "feuil4" où les résultats sont copiés. Est il possible de s'affranchir de cela? Je ne traite que des copies de mes fichiers brut donc ça ne me dérange pas si les feuilles de calculs sont écrasées.

    Encore merci
    0
  14. userlambda2 Messages postés 6 Statut Membre
     
    Merci aussi michel_m ça fonctionne également très bien et très rapidement! J'ai maintenant ce qu'il me faut pour traiter rapidement mes résultats.

    Un grand merci aussi à tous ceux qui on pris sur leur temps pour m'aider. Je mets le sujet en RESOLU.

    Bonne journée tous le monde
    0