Suppression plusieurs lignes sous conditions

Résolu/Fermé
Frédéric - 3 déc. 2009 à 12:37
 Frédéric - 3 déc. 2009 à 21:30
Bonjour,
je ne sais pas programmer en VB, mais j'essaie. Sur excel je souhaite créer une macro qui supprime un ensemble de lignes (11) si les 11 cellules contiguës de ces lignes sont toutes vides, puis que cette macro passe à la cellule N+11 et ainsi de suite sur toutes mes données.
Voilà ce que j'ai écrit et evidemment ça ne marche pas : VB me dit que il y a un "next" sans "for" (NB : la colonne dans laquelle se trouve les cellules à regarder est la colonne 51, j'ai bcp de lignes dans mon fichier, à regarder les unes après les autres par groupes de 11) :
Sub supsitoutvide()
For i = 2 To 45475 Step 11
If Rows(i).Cells(51) = "" Then
If Rows(i + 1).Cells(51) = "" Then
If Rows(i + 2).Cells(51) = "" Then
If Rows(i + 3).Cells(51) = "" Then
If Rows(i + 4).Cells(51) = "" Then
If Rows(i + 5).Cells(51) = "" Then
If Rows(i + 6).Cells(51) = "" Then
If Rows(i + 7).Cells(51) = "" Then
If Rows(i + 8).Cells(51) = "" Then
If Rows(i + 9).Cells(51) = "" Then
If Rows(i + 10).Cells(51) = "" Then
Rows(i).Delete
Rows(i + 1).Delete
Rows(i + 2).Delete
Rows(i + 3).Delete
Rows(i + 4).Delete
Rows(i + 5).Delete
Rows(i + 6).Delete
Rows(i + 7).Delete
Rows(i + 8).Delete
Rows(i + 9).Delete
Rows(i + 10).Delete
Next i
End Sub

Si quelqu'un peut m'aider... (NB : je n'arrive pas à savoir comment supprimer toutes les rows i à i+11 d'un seul coup...d'où cette drôle de syntaxe).
Par avance merci bcp,
A voir également:

3 réponses

Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
3 déc. 2009 à 12:51
Bonjour,
Je n'ai peut-être pas tout compris dans la question mais voici ma première remarque : si tu supprimes 11 lignes, tu n'as pas besoin de sauter 11 lignes, il te suffit de rester sur ta ligne.
Pour supprimer les lignes 1 à 10, tu peux utiliser Rows("1:10").Delete (ou dans ton cas Rows(i & ":" & (i+10)).Delete

Sinon, pour vérifier que les 11 cellules sont vides, tu peux utiliser la fonction countblank()
1
merci pour votre réponse, avec des "end if" ma requête tourne, mais il y un pb de "décalage" qui vient peut être de mon saut de 11 lignes.
Je pense pourtant devoir sauter 11 lignes :
Ce que je veux, c'est regarder (et éventuellement supprimer) des cellules 11 lignes par 11 lignes :
si toutes les 11 cellules contigues de telle colonne sont vides, alors
supprime les 11 lignes correspondant à ces 11 cellules
Sinon, passe à la 12 ème cellule
recommence

Manifestement ma macro est defectueuse car j'observe qu'une fois qu'elle a tourné, j'ai bien supprimer des lignes mais pas forcément des lignes contigues... y a un pb de décalage.

Je continue de réfléchir, voici ma macro dans sa dernière mouture :
Sub supsitoutvide()
For i = 2 To 45475 Step 11
If Rows(i).Cells(51) = "" Then
If Rows(i + 1).Cells(51) = "" Then
If Rows(i + 2).Cells(51) = "" Then
If Rows(i + 3).Cells(51) = "" Then
If Rows(i + 4).Cells(51) = "" Then
If Rows(i + 5).Cells(51) = "" Then
If Rows(i + 6).Cells(51) = "" Then
If Rows(i + 7).Cells(51) = "" Then
If Rows(i + 8).Cells(51) = "" Then
If Rows(i + 9).Cells(51) = "" Then
If Rows(i + 10).Cells(51) = "" Then
Rows(i & ":" & (i + 10)).Delete
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
Next i
End Sub
0
heu, je viens de réaliser que je devais mettre des "end if" sans doute autant que des "if", je vais essayer tt de suite, mais si un "pro" peut venir à mon aide d'ici là...
merci,
Frédéric P
0
Finalement cela marche avec la macro ci dessous.
Merci à Gord 21 pour la syntaxe nécessaire à la prise en compte de plusieurs lignes.
Le problème venait (sans doute?) de ce que ma boucle allait au delà de ma plage de données (bien que je ne comprenne pas bien en quoi cela avait pu créer des décalages).
Il subsiste un seul problème : certains blocs de 11 cellules contigues, bien que vides, ne sont pas supprimée après execution de la macro (la macro s'arrêterait-elle d'elle même?), je vais régler ce pb en la faisant retourner plusieurs fois sur les données après traitement.
La macro :
Sub supsitoutvide()
For i = 2 To 45278 Step 11
If Rows(i).Cells(51) = "" Then
If Rows(i + 1).Cells(51) = "" Then
If Rows(i + 2).Cells(51) = "" Then
If Rows(i + 3).Cells(51) = "" Then
If Rows(i + 4).Cells(51) = "" Then
If Rows(i + 5).Cells(51) = "" Then
If Rows(i + 6).Cells(51) = "" Then
If Rows(i + 7).Cells(51) = "" Then
If Rows(i + 8).Cells(51) = "" Then
If Rows(i + 9).Cells(51) = "" Then
If Rows(i + 10).Cells(51) = "" Then
Rows(i & ":" & (i + 10)).Delete
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
Next i
End Sub
0
Gord21 Messages postés 918 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 20 mars 2013 289
3 déc. 2009 à 18:45
Bonjour,
Attention à ce que ta macro n'efface pas des lignes que tu souhaites garder. D'après ton énoncé, moi j'utiliserais une macro du type :

Sub supsitoutvide()
Dim i As Long
Dim derniere_ligne As Long

i = 2
derniere_ligne = 45278

While i < derniere_ligne
If Application.WorksheetFunction.CountBlank(Range("AY" & i & ":AY" & (i + 10))) < 11 Then
Rows(i & ":" & (i + 10)).Delete Shift:=xlUp
derniere_ligne = derniere_ligne - 11
Else
i = i + 11
End If
Wend

End Sub
0
Merci Gord21,
ta requête est plus élégante et concise que la mienne.
A noter, il faut remplace le signe "<11" par "=11" dans cette requête (sinon elle va effacer toutes les lignes des données pour lesquelles on a moins de 11 blancs...et non celle pour lesquelles on a 11 blancs consécutifs).

C'est ce que je viens de faire et de la lancer.
Tout ce que j'espère maintenant, c'est que le résultat que je vais obtenir sera similaire à celui que j'ai obtenu avec ma requête bizarre que j'ai du faire tourner plusieurs fois. En effet, j'ai la même procédure à appliquer sur différentes colonnes, j'y ai passé une bonne partie de l'après midi et si les 2 résultats (entre ta requête et l'autre réappliquée) ne sont pas identiques, il va falloir recommencer avec cette nouvelle requête! certes ce sera moins long...mais il commence à se faire tard!
EN TOUT CAS MERCI BCP POUR TON AIDE et pour le temps que tu as bien voulu consacrer à ma question.
je ne suis pas sûr de pouvoir te rendre un jour la pareille, au moins dans le domaine VBA, dans un autre domaine p ê (compta/finance?).
Frédéric P

PS : ça y est requête terminée et résultats OK CA MARCHE!
merci,
0