Résolu Suppression de bloc de cellule en boucle, comment faire ?

abdess47

Nouveau membre
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.
[cpp]Sub etape2()
'
' etape2 Macro
' suppression du détail des heures
'

'
Rows("11:22").Select
Selection.Delete Shift:=xlUp
Rows("12:23").Select
Selection.Delete Shift:=xlUp
Rows("13:24").Select
Selection.Delete Shift:=xlUp
Rows("14:25").Select
Selection.Delete Shift:=xlUp
Rows("15:26").Select
Selection.Delete Shift:=xlUp
Rows("16:27").Select
Selection.Delete Shift:=xlUp
Rows("17:28").Select
Selection.Delete Shift:=xlUp
Rows("18:29").Select
Selection.Delete Shift:=xlUp
End Sub[/cpp]
 

zeb

Modérateur
Meilleure réponse
Salut,

M'enfin, pourquoi d'abord sélectionner les lignes avant d'agir sur la sélection ?
Agis directement sur les lignes !
Code:
Rows("11:22").Delete
Rows("12:23").Delete
Rows("13:24").Delete
Rows("14:25").Delete
Rows("15:26").Delete
Rows("16:27").Delete
Rows("17:28").Delete
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 : 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 :[fixed]11:22
12:23
13:24
14:25
15:26
16:27
17:28
18:29
...[/fixed]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 :
Code:
Dim x As Long
For x = 11 To 18
    Range(Rows(x), Rows(x + 11)).Delete
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 et fais des propositions.
 

abdess47

Nouveau membre
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
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 :

[cpp]Sub etape2()
'
' etape2 Macro
' suppression du détail des heures
'

'
Do
Dim x As Long
For x = 11 To x
Range(Rows(x), Rows(x + 11)).Delete
Next
Loop Until Condition.collum("B:B") = "TEMPTATION"
End Sub[/cpp]

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...
 

zeb

Modérateur
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 :
Code:
Dim x As Long
For x = 11 To 65536
    If Cells(x, 2) = "TEMPTATION" Then Exit For
    Range(Rows(x), Rows(x + 11)).Delete
Next
Autre façon de programmer la chose :
Code:
Dim row As Range
For Each row In Range(Rows(11), Rows(Rows.Count)).Rows
    If row.Columns("B") = "TEMPTATION" Then Exit For
    Range(row, row.Offset(11)).Delete
Next
 

abdess47

Nouveau membre
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
 

abdess47

Nouveau membre
Solution trouvé :

[cpp]Sub etape2()
'
' etape2 Macro
'

'
Range("D10").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-3]<>"""",1,0)"
Range("D10").Select
Selection.AutoFill Destination:=Range("D10:D1000"), Type:=xlFillDefault
Range("D10:D1000").Select
Rows("10:10").Select
Selection.AutoFilter
ActiveSheet.Range("$A$10:$P$1000").AutoFilter Field:=4, Criteria1:="0"
Rows("21:1000").Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-9
ActiveSheet.Range("$A$10:$P$801").AutoFilter Field:=4
Dim x As Long
For x = 11 To 1000
Range(Rows(x), Rows(x + 9)).Delete
Next
End Sub[/cpp]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 028
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut