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:
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
On supprime les lignes sélectionnées :
Et on se repositionne sur la cellule finale
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. </>
, 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 !
Cordialement.
Effectivement, je découvre grâce à toi.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.
C'est fait, j'ai édité mon post avec les balises "Code", thanks !
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...D'autre part, des images ne servent généralement à rien, et ne remplacent jamais un fichier.
C'est fait, j'ai tout oublié!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 !
'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
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 » (
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
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.
Merci Juice.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.
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 ?
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
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 :
Et après suppression des lignes :
[EDIT Image effacée et remplacée par ci-dessous, merci dhany
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,
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.
ouaf ! mdr !!!
heureusement, j'sais que Patapin a compris qu'c'est à lui d'épurer son code pour élaguer tout le boulot !
dhany
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 !
Moi, du moment que ça marche...