Macro: supprimer x ligne sur y
Résolu/Fermé
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
-
16 juin 2014 à 09:26
ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 - 16 juin 2014 à 16:28
ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 - 16 juin 2014 à 16:28
A voir également:
- Macro: supprimer x ligne sur y
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Jitbit macro recorder - Télécharger - Confidentialité
- Macro logiciel - Télécharger - Organisation
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
14 réponses
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
16 juin 2014 à 16:11
16 juin 2014 à 16:11
re,
Désolé mais j'étais sur une autre discussion...
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
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
ccm81
Messages postés
10905
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
27 décembre 2024
2 429
Modifié par ccm81 le 16/06/2014 à 16:30
Modifié par ccm81 le 16/06/2014 à 16:30
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
Cdlmnt
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
sipherion
Messages postés
1809
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
285
Modifié par sipherion le 16/06/2014 à 09:29
Modifié par sipherion le 16/06/2014 à 09:29
Bonjour,
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."
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."
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
16 juin 2014 à 09:43
16 juin 2014 à 09:43
Merci pour ta réponse rapide mais VBA me dis qu'il y a une erreur de syntaxe à la ligne:
Rows(x).Delete.
Rows(x).Delete.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 249
16 juin 2014 à 10:06
16 juin 2014 à 10:06
Bonjour,
Pas de . à la fin de la ligne
Un peu plus optimisé :
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
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
sipherion
Messages postés
1809
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
285
16 juin 2014 à 11:09
16 juin 2014 à 11:09
Oui désolé, je sais pas pk il m'a ajouté un point après Delete... Une erreur de ma part sans doute.
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
16 juin 2014 à 11:52
16 juin 2014 à 11:52
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.
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.
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
Modifié par michel_m le 16/06/2014 à 12:21
Modifié par michel_m le 16/06/2014 à 12:21
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
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
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
16 juin 2014 à 12:48
16 juin 2014 à 12:48
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
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
sipherion
Messages postés
1809
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
19 décembre 2016
285
16 juin 2014 à 14:01
16 juin 2014 à 14:01
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.
ccm81
Messages postés
10905
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
27 décembre 2024
2 429
16 juin 2014 à 14:44
16 juin 2014 à 14:44
Bonjour
un essai
Cdlmnt
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
ccm81
Messages postés
10905
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
27 décembre 2024
2 429
16 juin 2014 à 15:53
16 juin 2014 à 15:53
Un essai avec traitement en mémoire qui devrait aller plus vite
https://www.cjoint.com/?3Fqp0HuVHX1
Cdlmnt
https://www.cjoint.com/?3Fqp0HuVHX1
Cdlmnt
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
16 juin 2014 à 16:15
16 juin 2014 à 16:15
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
Encore merci
userlambda2
Messages postés
6
Date d'inscription
lundi 16 juin 2014
Statut
Membre
Dernière intervention
16 juin 2014
16 juin 2014 à 16:25
16 juin 2014 à 16:25
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
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