Supprimer relativement certaines lignes

Bonjour à tous ceux à qui je n'ai pas dit bonjour,

et aussi à ceux qui ne liront jamais ce message.

Je cherche à supprimer dans toutes mes feuilles (sauf la première) un certain nombre de lignes, à un certain emplacement (puis revenir à une certaine position, mais ça, ça va).

Hum. Pas clair ?

Partons de la position de l'image 1:

ima110

On monte de deux cellules, on sélectionne les cellules jusqu'à ce qu'on en rencontre une non vide, et on redescend d'une cellule

ima410

On supprime les lignes sélectionnées :

ima510

Et on se repositionne sur la cellule finale

ima610

J'avais essayé une macro, mais elle ne fonctionne pas sur toutes les feuilles de la même manière, je ne comprends pas pourquoi :

Sub SupprLigneOdessu()
'
' SupprLigneOdessu Macro
' Macro enregistrée le 22/10/2018 par utilisateur
'
  For i = 1 To Worksheets.Count - 2
    Selection.End(xlUp).Select
    ActiveCell.Offset(2, -1).Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveCell.Range("A1:A50").Select
    Selection.EntireRow.Delete
    ActiveCell.Offset(0, 1).Range("A1").Select

    ActiveSheet.Next.Select
Next i
    Selection.End(xlUp).Select
    ActiveCell.Offset(2, -1).Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveCell.Range("A1:A50").Select
    Selection.EntireRow.Delete
    ActiveCell.Offset(0, 1).Range("A1").Select

Sheets(2).Select
End Sub

Avez-vous une idée de l'erreur ? Sur certaines feuilles, j'ai ma ligne contenant les cellules qui sont supprimées.

Bonjour,

Si on ne te l'a pas encore dit, le code cité dans un post se place sous balises Code. Tu disposes d'un bouton pour le faire </>, et il convient de le faire systématiquement.

D'autre part, des images ne servent généralement à rien, et ne remplacent jamais un fichier. Pour opérer sur Excel et et élaborer des réponses aux questions, cela se passe sur fichier. En l'absence tu ne pourras avoir de réponse précise et adaptée à ta situation et la discussion ne fera que traîner inutilement en longueur.

Enfin, un code enregistré, non épuré, a comme caractéristiques essentielles d'être lent, non qualifié car basé sur des sélections, insuffisamment fiable, et de mon point de vue à mettre à la poubelle et à oublier ! Le meilleur service à se rendre est de fuir l'enregistreur et s'attaquer à l'écriture de code en VBA qui ne pourra jamais résulter d'un enregistrement. Il est donc beaucoup plus judicieux de fournir un fichier en expliquant avec tous les détails utiles ce que l'on souhaite réaliser, en l'illustrant s'il y a lieu. On aura ainsi des réponses parfaitement adaptées, et que l'on pourra analyser pour comprendre comment VBA fonctionne...

Cordialement.

Bonjour,

Si on ne te l'a pas encore dit, le code cité dans un post se place sous balises Code. Tu disposes d'un bouton pour le faire </>, et il convient de le faire systématiquement.

Effectivement, je découvre grâce à toi.

C'est fait, j'ai édité mon post avec les balises "Code", thanks !

D'autre part, des images ne servent généralement à rien, et ne remplacent jamais un fichier.

Mince, je fais des trucs inutiles. Tiens, comme cette dernière phrase, d'ailleurs. Enfin, je veux dire, les deux dernières. Les trois ! Les...

Enfin, un code enregistré, non épuré, a comme caractéristiques essentielles d'être lent, non qualifié car basé sur des sélections, insuffisamment fiable, et de mon point de vue à mettre à la poubelle et à oublier !

C'est fait, j'ai tout oublié!

'me souviens mêm' p'us pourquoi j'suis v'nu...

Ah si.

Bon, je vais tenter d'apprendre VBA, ça vous fera moins de travail à tenter de rectifier mes bavures

Coucou Patapin85, MFerrand, et le Forum !

Je te met ci-joint un fichier qui, avec une procédure, va supprimer les blancs entre ta ligne contenant "2OI" (C'était bien la ligne a rechercher ?)et ta ligne non vide.

La procédure le fais sur toute les feuilles, hormis la première, et supprime toute les lignes sauf une.

Je te laisse regarder et revenir vers nous si tu a des questions

Sub SuppLigne()
Dim v As Long, w As Long, x As Long, y As Long, z As Long
Dim MaCel As String, Vide As String
v = Worksheets.Count
For w = 2 To v
    x = Sheets(w).Range("A" & Rows.Count).End(xlUp).Row
    For y = 2 To x
        MaCel = Sheets(w).Cells(y, 1) & Sheets(w).Cells(y, 2) & Sheets(w).Cells(y, 3)
        If MaCel = "2OI" Then
            z = y - 1
            Vide = Sheets(w).Cells(z, 1)
            While Vide = ""
                z = z - 1
                Vide = Sheets(w).Cells(z, 1)
            Wend
            If z + 2 <> y Then
                Sheets(w).Rows("" & z + 2 & ":" & y - 1 & "").Delete Shift:=xlUp
            End If
            Sheets(w).Select
            Cells(z + 2, 4).Select
            Sheets(1).Select
        End If
    Next
Next
End Sub
13pour-patapin85.xlsm (20.97 Ko)

Bonsoir à tous,

Patapin a écrit :

C'est fait, j'ai tout oublié!

'me souviens mêm' p'us pourquoi j'suis v'nu...

mais si, j'te rappelle que t'es v'nu pour lire la solution de Juice :

https://forum.excel-pratique.com/viewtopic.php?p=698812#p698812


sauf si j'ai mal compris, il me semble que la longue explication de ton énoncé aurait simplement pu être :

« je veux qu'il y ait une seule ligne vide entre les lignes 1 et 2 » ( y'a p't'être un truc qui m'a échappé ?)

si oui, fallait pas en faire tout un FROMAGE !

dhany

Bonsoir à tous !

Bon, je vais tenter d'apprendre VBA, ça vous fera moins de travail à tenter de rectifier mes bavures

Si, tentant d'écrire en VBA, tu commets une bavure, on a de bonnes chances de détecter ce que tu as voulu faire et pouvoir du même coup t'expliquer pourquoi ça n'a pas donné le résultat attendu. On peut même parfois découvrir des réactions inattendues d'Excel parce que tu auras écrit quelque chose d'i nhabituel... Et d'un autre côté, si tu as écrit un peu à l'aveuglette tu verras plus clairement quelle syntaxe utiliser, quelles variations possibles, et celles qui ne le sont pas... On apprend tous quelque chose en fait !

Avec du code enregistré, on doit passer par un décodage de tes mouvements, qui démarrent souvent sur une sélection dont on ne sait où elle est située, on ne sait pas non plus si les mouvements qui se succèdent sont tous nécessaires ou s'ils incluent des faux mouvements (l'enregistreur ne fait pas de différence, il enregistre), et quand on arrive à l'action on voit ce que tu as fait, pas toujours en totalité, et on doit réinterpréter l'ensemble pour décoder ce que tu voulais faire... Honnêtement, ça finit par être beaucoup plus fatiguant.

Et comme le montre Dhany avec son humour habituel, expliquer ce que tu veux faire doit toujours d'abord viser à nous montrer l'essentiel en peu de mots, ce qui distingue la situation résultante souhaitée de la situation de départ. Une fois qu'on voit on pourra ensuite entrer dans les détails. Tant qu'on n'a pas vu les grosses différences, on ne sait pas ou placer les détails...

Bon courage !

@MFerrand : très judicieux. D'autant plus que je formule mal mes questions, et que je n'explique pas tout (ce qui revient sans doute à peu de choses près au même) !

Merci pour tes conseils.

Coucou Patapin85, MFerrand, et le Forum !

Je te met ci-joint un fichier qui, avec une procédure, va supprimer les blancs entre ta ligne contenant "2OI" (C'était bien la ligne a rechercher ?)et ta ligne non vide.

Merci Juice.

Je me suis malheureusement mal exprimé (et de plus je ne peux ouvrir que des fischiers xls, pas xlsx), désolé.

En fait, il n'y a pas que des FROMAGES, ni que des 2OI, ça varie d'une feuille à l'autre.

Et ça s'éclaircit un peu :

sauf si j'ai mal compris, il me semble que la longue explication de ton énoncé aurait simplement pu être :

« je veux qu'il y ait une seule ligne vide entre les lignes 1 et 2 » ( y'a p't'être un truc qui m'a échappé ?)

Sur toutes mes feuilles, j'ai effectivement le chiffre 1 en cellule A13, mais la colonne D peut être plus ou moins remplie. Dans cet exemple, on ne voit qu'un FROMAGES" (alors pourquoi le mettre au pluriel ? ) en D13, mais il peut y avoir des mots en D14, D15, D16, etc.

Puis, en général , on trouve le chiffre 2 en A65 (mais pas toujours, il peut arriver en A66, A67, etc.)

Je souhaite supprimer toutes les lignes (sauf une, bien vu dhany) qui vont du dernier mot (en conservant ce mot) jusqu'à la ligne au-dessus du chiffre 2.

D'où l'importance de mon image 3

ima510

Là où j'ai merdoyé, c'est que j'ai oublié de dire que les mots et les lettres peuvent varier d'une feuille à l'autre

Exemple :

ima710

Et après suppression des lignes :

[EDIT Image effacée et remplacée par ci-dessous, merci dhany )

ima810

Alors, tout ce que je sais faire pour l'instant, c'est sélectionner la cellule colonne D à côté du chiffre 2 avec cette macro qui marche :

Sub LETTRE_D_2()
'
' LETTRE_D_2 Macro
' Macro enregistrée le 20/09/2018 par utilisateur
'
For Each f In Worksheets
 f.Select False
Next
Range("A1").Select
Sheets(1).Select

For i = 1 To Worksheets.Count - 1
For j = 1 To 5
    Selection.End(xlDown).Select
Next j
    ActiveCell.Offset(0, 3).Range("A1").Select
    ActiveSheet.Next.Select
Next i
For k = 1 To 5
    Selection.End(xlDown).Select
Next k
    ActiveCell.Offset(0, 3).Range("A1").Select
Sheets(4).Select
End Sub

Il ne me resterait plus qu'à sélectionner la plage de cellules au-dessus de la cellule (en l'occurence D65, mais peut varier d'une feuille à l'autre), et supprimer les lignes sauf deux. Et là, je bloque.

Mais je prépare peu à peu la suite :

1. Je vais créer une macro qui monte le curseur de deux cellules

C'est fait :

Sub 2cellOdessu()
'
' 2cellOdessu Macro
' Macro enregistrée le 24/10/2018 par utilisateur
'
For Each f In Worksheets
 f.Select False
Next
    ActiveCell.Offset(-2, 0).Range("A1").Select

End Sub

2. Il me reste à trouver comment sélectionner la plage relative qui va de la cellule jusqu'à la fin de plage du dessus.

3. J'utiliserai la création précédente de h2so4 :

For i = 1 To Worksheets.Count - 2
    Selection.EntireRow.Delete
    ActiveCell.Offset(0, 3).Select
    ActiveSheet.Next.Select
Next i
 Selection.EntireRow.Delete
    ActiveCell.Offset(0, 3).Select
Sheets(2).Select

End Sub

Bonjour Patapin,

pour ta 3ème image, c'est la même que la 2ème image !

mais j'ai quand même compris que « 2 R E » devrait être en ligne 17, soit 2 lignes sous « CARDONs 3 ».

dhany

Exact ! Merci

Bon ,j'ai fait une macro qui marche parfois, mais pas sur toutes les feuilles.

For Each f In Worksheets
 f.Select False
Next
    ActiveCell.Offset(-2, 0).Range("A1").Select
    Selection.End(xlUp).Select

    Range(Selection, Selection.End(xlUp)).Select
    ActiveCell.Offset(-30, 0).Range("A1:A31").Select
    ActiveCell.Activate
End Sub

A cause bien sûr de

ActiveCell.Offset(-30, 0).Range("A1:A31").Select

J'avais pourtant créé la macro en mode relatif. Incroyable.

Comment sélectionner relativement cette plage?

Bonjour,

Tu es un peu décourageant ! Tant que tu restes dans les Select, etc. tu ne cibleras pas avec précision, que ce soit en mode absolu ou relatif. Rien n'interdit d'utiliser un ActiveCell au démarrage, façon de prendre en compte une décision de l'utilisateur du point de référence duquel il faut partir, mais le recueillir immédiatement dans une variable, de façon que ce point de référence ne risque plus de varier, et contrôler que les décalages ou redimensionnement qu'on lui applique ne font pas sortir de la feuille, lors de l'ajustement de la cible...

Et la sélection n'étant jamais une fin en soi à ce stade, on ne sélectionne pas, on définit la cible pour lui appliquer l'action prévue.

Cordialement.

Tu es un peu décourageant !

Allons, ce n'est pas la vaillance qui te fera défaut ! Tu vas y arriver, j'en suis sûr, ressaisis-toi !

ouaf ! mdr !!! allez, MFerrand, encore un p'tit effort, et t'auras droit à un beau trophée :

heureusement, j'sais que Patapin a compris qu'c'est à lui d'épurer son code pour élaguer tout le boulot !

dhany

heureusement, j'sais que Patapin a compris qu'c'est à lui d'épurer son code pour élaguer tout le boulot !

Je vais épurer... la crise ! Mais pour ça, faut pas trop décoder !

Suivant les conseils de MFerrand, je vais donc procéder autrement.

Je voudrais stocker une variable V en mémoire pour m'en servir comme nombre de lignes à supprimer.

Si je reprends la macro précédente, c'est le nombre 30 qui est intéressant.

ActiveCell.Offset(-30, 0).Range("A1:A31").Select

C'est lui qui va me donner le nombre de lignes environ à supprimer.

La manip consisterait à

1- partir d'une cellule (la plupart du temps, D65, mais bon, passons, l'important, c'est que je sais positionner le curseur à l'endroit nécessaire)

2- compter le nombres de lignes séparant cette cellule de la première cellule non vide située au-dessus, stocker en variable V

3- retrancher 3 (V2 = V -3) V2 autre variable de stockage, même si j'ai cru voir qu'on pouvait faire V=V-3

4- supprimer un nombre de lignes comprises entre D64 et celles du dessus...

c'est-à-dire

4a- positionner le curseur sur la dernière ligne non vide au-dessus de D65 par exemple puis descendre d'une ligne

4b- supprimer autant de lignes qu'il y a de V-3 (un des rares trucs que je connais en anglais : for i = 1 to v-3)

Donc, je sais faire

1.

Sub LETTRE_D_2()
'
' LETTRE_D_2 Macro
' Macro enregistrée le 20/09/2018 par utilisateur
'
For Each f In Worksheets
 f.Select False
Next
Range("A1").Select
Sheets(1).Select

For i = 1 To Worksheets.Count - 1
For j = 1 To 5
    Selection.End(xlDown).Select
Next j
    ActiveCell.Offset(0, 3).Range("A1").Select
    ActiveSheet.Next.Select
Next i
For k = 1 To 5
    Selection.End(xlDown).Select
Next k
    ActiveCell.Offset(0, 3).Range("A1").Select
Sheets(4).Select
End Sub

2. je ne sais pas

3.

V2=V-3

4a

Sub VersPlageDessus()
'
' VersPlageDessus Macro
' Macro enregistrée le 25/10/2018 par utilisateur
'

'
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

4b Je ne sais pas

Pouvez-vous m'aider pour les points 2 et 4?

EDIT :

pour le point 4

Est-ce que ça pourrait être bon ?

For i = 1 To V-3
    Selection.EntireRow.Delete
    next i

SOLUTION :

ActiveCell.Offset(-2, 0).Range("A1").Select
Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select
ActiveCell.Activate
Selection.EntireRow.Delete

merci à didibonf

Tes sélections me donnent le tournis !

Activer la cellule active ! Est-ce qu'elle devient doublement active ?

Je rêve de ne travailler qu'avec des feuilles masquées...

pssst, Patapin ! t'as oublié d'sélectionner la sélection ! faut faire comme ça : Selection.Select

j'ai pas testé, mais à tout hasard, tu peux aussi essayer : Selection.Selection.Select

(mais j'suis pas vraiment sûr qu'ce soit très productif ! )

dhany

D'accord, bien vu dhany.

C'est bizarre, mais ça marche quand même sans ton rajout....

  For i = 1 To Worksheets.Count - 2
ActiveCell.Offset(-2, 0).Range("A1").Select
Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select
ActiveCell.Activate
Selection.EntireRow.Delete
    ActiveSheet.Next.Select
Next i
ActiveCell.Offset(-2, 0).Range("A1").Select
Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select
ActiveCell.Activate
Selection.EntireRow.Delete
Sheets(2).Select
End Sub

Les mystères du PC sont inextricables.

Enfin, quoi qu'il en soit : problème résolu !

Bonjour,

Tu n'utilises pas la bonne règle du jeu ! Le problème ne peut être résolu que lorsque tout Select, Selection, Activate... aura disparu du code...

Moi, du moment que ça marche...

Rechercher des sujets similaires à "supprimer relativement certaines lignes"