Suppression plusieurs lignes sous conditions
Résolu/Fermé
A voir également:
- Suppression plusieurs lignes sous conditions
- Forcer suppression fichier - Guide
- Mise en forme conditionnelle excel plusieurs conditions - Guide
- Suppression page word - Guide
- Suppression cookies - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
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
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()
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()
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
merci,
Frédéric P
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
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
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
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
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
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,
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,
3 déc. 2009 à 13:26
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