Se connecter avec
S'enregistrer | Connectez-vous

Suppression de bloc de cellule en boucle, comment faire ?

Dernière réponse : dans Programmation

Bonjour,
Je suis sur des données Excel, etant novice en programmation, je souhaiterais avoir votre aide pour un petit programme qui pour vous je suppose doit être simple, mais que pour moi est hyper compliqué ! Donc voici le souci,
J’ai une feuille Excel et je souhaiterais supprimer un bloc de 12 lignes consécutives, mais je souhaiterais garder la 13ième ligne et supprimer de la 14 ieme à la 26ième.
Le premier bloc à supprimer est de la ligne 11 à 22, garder la ligne 23
Le second bloc à supprimer est de la ligne 12 à 23 et garder la ligne 24
et ainsi de suite … jusqu'à la dernière ligne contenant des données
Voici un enregistrement de macro Excel en espérant que ça peut vous aider. Merci beaucoup pour votre aide.
  1. Sub etape2()
  2. '
  3. ' etape2 Macro
  4. ' suppression du détail des heures
  5. '
  6.  
  7. '
  8. Rows("11:22").Select
  9. Selection.Delete Shift:=xlUp
  10. Rows("12:23").Select
  11. Selection.Delete Shift:=xlUp
  12. Rows("13:24").Select
  13. Selection.Delete Shift:=xlUp
  14. Rows("14:25").Select
  15. Selection.Delete Shift:=xlUp
  16. Rows("15:26").Select
  17. Selection.Delete Shift:=xlUp
  18. Rows("16:27").Select
  19. Selection.Delete Shift:=xlUp
  20. Rows("17:28").Select
  21. Selection.Delete Shift:=xlUp
  22. Rows("18:29").Select
  23. Selection.Delete Shift:=xlUp
  24. End Sub

Autres pages sur : suppression bloc cellule boucle

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Salut,

M'enfin, pourquoi d'abord sélectionner les lignes avant d'agir sur la sélection ?
Agis directement sur les lignes !
  1. Rows("11:22").Delete
  2. Rows("12:23").Delete
  3. Rows("13:24").Delete
  4. Rows("14:25").Delete
  5. Rows("15:26").Delete
  6. Rows("16:27").Delete
  7. Rows("17:28").Delete
  8. Rows("18:29").Delete
Le paramètre Shift étant facultatifs d'une part et ce qui est à supprimer étant bien défini comme des lignes, pas de soucis, on peut ne pas le préciser. Je trouve ce code plus clair. Et toi ?

La suppression de lignes dans un tableau est un cas bien connu.
J'en traite un peu ici : http://www.presence-pc.com/forum/ppc/Programmation/tuto... Tu ne tombes pas dans le piège et c'est bien. Nous n'aurons pas besoin de prendre le problème à l'envers ici.

Bon. Factorisons ton code. Voici la partie variable :
11:22
12:23
13:24
14:25
15:26
16:27
17:28
18:29
...
Cela peut s'écrire : x:x+11, avec x variant de 11 à 18 par pas de 1.

Bien. Moi, j'aime les chiffres. Alors au lieu d'écrire Rows("11:22"), je vais écrire Range(Rows(11), Rows(22)). C'est plus "mathématique" ;) 

Ça donne :
  1. Dim x As Long
  2. For x = 11 To 18
  3. Range(Rows(x), Rows(x + 11)).Delete
  4. Next


Bon, maintenant il y a le problème de la borne supérieure. D'où sort ce 18 ? Il faudrait le calculer. Relis ce topic http://www.presence-pc.com/forum/ppc/Programmation/tuto... et fais des propositions.

Merci oui c'est beaucoup plus clair effectivement, mais je n'ai pas le sens de la programmation.
Pour répondre à a question le 18 est un numéro de ligne à la quel je me suis arrêté, en réalité il en existe presque 1000.
En lisant http://www.presence-pc.com/forum/ppc/Programmation/tuto...
je peux mieux t'aiguiller en te disant que pour que le programme ne s'execute plus quand il trouve la valeur
"TEMPTATION" dans une cellule de la collone B, sachant que je le numéros de ligne n'est jamais fixe.

J'ai une idée, ça pourrais être :

  1. Sub etape2()
  2. '
  3. ' etape2 Macro
  4. ' suppression du détail des heures
  5. '
  6.  
  7. '
  8. Do
  9. Dim x As Long
  10. For x = 11 To x
  11. Range(Rows(x), Rows(x + 11)).Delete
  12. Next
  13. Loop Until Condition.collum("B:B") = "TEMPTATION"
  14. End Sub


Désolé mais je ne connais pas les formules qui faudrais mettre. J'essaye de progresser mais c'est difficile quand on y connait rien...
Expert Programmation

M'enfin, pourquoi as-tu élue ma réponse comme étant la meilleure ?
Maintenant le topic est réputé résolu :/  Spa grave, mais bon :/ 

Bon, une boucle qui contient un Dim, je trouve ça louche.
Et puis tu mets une boucle dans une boucle. C'est sûr, ce n'est pas la bonne solution.

Pour être académique, il faudrait effectivement utiliser une boucle While. Je préfère (c'est personnel) interrompre ma boucle For :
  1. Dim x As Long
  2. For x = 11 To 65536
  3. If Cells(x, 2) = "TEMPTATION" Then Exit For
  4. Range(Rows(x), Rows(x + 11)).Delete
  5. Next

Autre façon de programmer la chose :
  1. Dim row As Range
  2. For Each row In Range(Rows(11), Rows(Rows.Count)).Rows
  3. If row.Columns("B") = "TEMPTATION" Then Exit For
  4. Range(row, row.Offset(11)).Delete
  5. Next

Désolé, j'ai trouvé ta réponse excellente que j'ai voulu faire partagé :ange:  mais on est pas loin de la solution ! :bounce:  j'ai lancé la macro mais j'ai un autre problème en fait parce que je me suis rendu compte qu'a un moment le nombre de ligne entre deux bloc de tableau à supprimer n'étant pas respecté (j'espère que tu vois ce que je veux dire).
En gros les données sont organisé ainsi :

1 ligne à conserver
10 lignes suivante à supprimer
2 lignes vides

1 ligne à conserver
10 lignes suivante à supprimer
2 lignes vides

1 ligne à conserver
10 lignes suivante à supprimer
2 lignes vides

etc...

sauf qu'à un moment dans mon tableau qui est extrait, j'ai une ligne vide qui ce rajoute en plus :cry: 

pour me me faire comprendre voici un imprime écran :



Uploaded with ImageShack.us

Solution trouvé :

  1. Sub etape2()
  2. '
  3. ' etape2 Macro
  4. '
  5.  
  6. '
  7. Range("D10").Select
  8. ActiveCell.FormulaR1C1 = "=IF(RC[-3]<>"""",1,0)"
  9. Range("D10").Select
  10. Selection.AutoFill Destination:=Range("D10:D1000"), Type:=xlFillDefault
  11. Range("D10:D1000").Select
  12. Rows("10:10").Select
  13. Selection.AutoFilter
  14. ActiveSheet.Range("$A$10:$P$1000").AutoFilter Field:=4, Criteria1:="0"
  15. Rows("21:1000").Select
  16. Selection.Delete Shift:=xlUp
  17. ActiveWindow.SmallScroll Down:=-9
  18. ActiveSheet.Range("$A$10:$P$801").AutoFilter Field:=4
  19. Dim x As Long
  20. For x = 11 To 1000
  21. Range(Rows(x), Rows(x + 9)).Delete
  22. Next
  23. End Sub
Lassé par la pub ? Créez un compte