XL 2010 RESOLU par Lolote83 Supprimer plusieurs lignes d'un clic

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,

Sur le forum, j'ai relevé un code permettant de supprimer la ligne entière sélectionnée (j'en remercie l'auteur au passage).

Ce code me serait très utile s'il me permettait de sélectionner plusieurs lignes à supprimer.
J'ai cherché et aussi tenté de modifier le code sans succès.

Comme d'habitude, votre aide me serait précieuse.

Voici le code en question :
Code:
Option Explicit
Sub efface_ligne()
'objet.méthode paramètre 1 = valeur 1, paramètre 2 = valeur 2
'ou
'object.méthode (paramètre)

Dim ligne As Integer
Dim confirme As String
ligne = ActiveCell.Row
Rows(ligne).Select
confirme = MsgBox("je vais supprimer la ligne " & ligne & " ?", vbYesNo, "Attention")
Select Case confirme
Case vbYes
Selection.Delete Shift:=xlUp
Case vbNo
Exit Sub
End Select

End Sub

Je joins un classeur test.
Avec mes remerciements,
Très bonne journée à vous,
Amicalement,
Lionel,
 

Pièces jointes

  • SupprimeLignes.xls
    33.5 KB · Affichages: 41

Guy_M

XLDnaute Occasionnel
Bonjour,

Si j'ai bien compris, dans le cadre d'une automatisation, cette procédure sera appelée par une autre. Dans ce cas, il me semble plus "propre" de passer en paramètre la plage avec laquelle on va travailler.

Personnellement, je n'utilise "selection" ou "activexxx" que dans les macros dont l'exécution est demandée par l'utilisateur, dès qu'il y a un appel à une fonction/procédure, je passe en paramètre les éléments avec lesquels cette fonction/procédure doit travailler.

Dans une procédure dont l'exécution est demandée par l'utilisateur, si je prévois de travailler avec "selection" ou "activexxx" je les affecte dès le début de la fonction/procédure à une variable avec laquelle je travaillerai : certaines commande VBA changent "selection" ou "activexxx" par exemple si on créé un classeur ("workbooks.add") ce classeur devient le classeur actif. Ca évite de se poser plein de question sur le comportement étrange la macro.

En espérant que cela sera utile
A bientôt
Guy
 

Staple1600

XLDnaute Barbatruc
Bonsoir à tous

arthour973
Mon propos est motivé par deux choses au moins (et encore une fois ce n'est qu'une opinion)
Le 9ième régle d'or du VBA (tu trouveras les neuf autres sur le Web ;) )
9. Ne présumez pas que le code VBA soit nécessaire.
Souvent, une fonction de feuille de calcul est bien meilleur et plus efficace.

Et puisque tu parles philosophie, alors je suis assez adepte de celle-ci ;)
Sans oublier, que ceux qui ont conçu Excel et son ergonomie ont consulté et parfois pris en compte les avis des utilisateurs d'Excel pour ajouter/améliorer des fonctionnalités.

Bref pour supprimer des lignes, Microsoft a déjà prévu des moyens de le faire nativement dans Excel.

Si l'utilisateur veut supprimer des lignes, il les sélectionne, clic-droit Supprimer ou le raccourci clavier évoqué plus haut.

Je pense que le demandeur à ses raisons n'est-ce pas le plus important ?
Non car le demandeur surtout(et là je ne parle pas de toi) quand il connait mal Excel ou débute avec lui peut se fourvoyer.
Exemple: combien d'utilisateurs ont en bavé en créant des usines à gaz, jusqu'au jour ou quelqu'un leur a parler des TCD.

Si on te suit, parce que untel décide d'utiliser un outil (ici Excel) d'une façon non optimale, il ne faudrait pas le prévenir qu'il existe telle ou telle fonctionnalité dans Excel (qui soulagerait sa peine), sous prétexte qu'on postule que le demandeur a toujours raison et doit faire ce qu'il a envie de faire même si on sait qu'il existe d'autres voies beaucoup plus simples.
 

Staple1600

XLDnaute Barbatruc
Re à tous

Juste histoire de finir par non plus une opinion, mais une petit taquinerie amicale à l'endroit d'arthour. ;)
En fonction des objectifs, il cherche des solutions et veut apprendre (si, si ... il y en a).
Si tu aimes apprendre, alors pourquoi tu oublies ce que tu as déjà appris :D:p
http://www.excel-downloads.com/threads/supprimer-des-lignes-non-classées.20010361/
Dans ce fil que tu initias le 29 juillet 2016, déjà dans les réponses faites, on évitait de recourir à Selection dans le code
Et en octobre 2016, zou tu replonges déjà dans la Selection et la belle macro de 00 semble avoir fini aux oubliettes.
 

Staple1600

XLDnaute Barbatruc
Re à tous

Pour revenir à la question en suivant ce que disait Guy_M, et en modifiant un chouia la macro de 00
Une macro paramétrée sans passer par Selection.
Ici on supprime les lignes qui ont un x en colonne A
VB:
Sub test()
Lignes_supprimer ActiveSheet.Columns("A:O"), "x"
End Sub
Private Sub Lignes_supprimer(Plage As Range, Critere As String)
Dim P As Range
Application.ScreenUpdating = 0
Set P = Intersect(Plage, ActiveSheet.UsedRange.EntireRow): P.AutoFilter 1, Critere
ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(12).EntireRow.Delete: P.AutoFilter
Application.ScreenUpdating = -1
End Sub

NB:
Ça se fait aussi très bien aussi à la main, comme un homme des cavernes :
filtre automatique, sélection du résultat du filtre, clic-droit -> Supprimer ;)
 

Guy_M

XLDnaute Occasionnel
Bonjour,
Staple1600, je vais donner l'impression de jouer au puriste, mais l'utilisation de 'ActiveSheet' dans 'Lignes_supprimer' est très dangereux puisque la procédure n'est pas obligatoirement appelée pour ActiveSheet. Je propose cette amélioration :
VB:
Sub test()
Lignes_supprimer ActiveWorkbook.Sheets("Feuil2").Columns("A:O"), "x" 'Appel de la procédure pour n'importe quelle feuille de calcul
End Sub
Private Sub Lignes_supprimer(Plage As Range, Critere As String)
Dim P As Range
Dim F as WorkSheet
Set F = Plage.Parent 'Il faudrait tester que la plage est dans une seule feuille (pas 3D) sinon il y aura une erreur
Application.ScreenUpdating = 0
Set P = Intersect(Plage, F.UsedRange.EntireRow): P.AutoFilter 1, Critere
F.AutoFilter.Range.Offset(1).SpecialCells(12).EntireRow.Delete: P.AutoFilter
Application.ScreenUpdating = -1
End Sub

C'est vrai qu'il est possible de faire ce genre de suppressions en quelques clics mais avec la macro d'appel suivante, on peut se simplifier la vie en associant cet appel à un bouton
VB:
Sub test()
Dim ValASupprimer as Variant
''Il faut qu'il n'y ait qu'une cellule sélectionnée
If Selection.Cells.Count <> 1 Then Exit Sub
ValASupprimer = InputBox("Que voulez-vous supprimer ?", , Selection.Value)
If ValASupprimer <> "" Then Lignes_supprimer ActiveSheet.Columns("A:O"), CStr(ValASupprimer) 
End Sub

Faire une macro est intéressant si on fait très souvent la même chose.
 

Staple1600

XLDnaute Barbatruc
Bonjour à tous, arthour973, lolote83, Guy_M

Si l'utilisateur qui utilise le classeur contenant le VBA, ne maîtrise pas VBA, que fait-on dans ce cas de figure ?
error1004.jpg
Alors qu'un utilisateur à qui on aura pris le temps de fournir un mode opératoire sur les fonctionnalités de base d'Excel saura sélectionner les lignes qu'il souhaite supprimer avec ce simple CTRL+-
=>Guy_M: Comme tu le remarquais (sauf à le prévoir dans le code), on peut pas annuler l'effet d'une macro alors que si des lignes sont supprimées par erreur par un CTRL+-, il suffit d'un CTRL+Z pour revenir à l'état initial.

Entre une macro qui utilise Selection +clic bouton + bouton Msgbox et Selection + raccourcis clavier , je ne vois pas de gain de temps mais plutôt le risque qu'un jour pour X raison, la marco plante et affiche un message comme la copie d'écran dans ce message, laissant l'utilisateur novice d'Excel fort marri. ;)

Sinon Guy_M, tu es adepte ou pas de la "philosophie" KISS?
(voir lien dans le message#18 ou ici pour commodité de lecture)

PS: Merci pour les corrections de mon bout de code ;)
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour JM, Bonjour Guy sans oublier Lolote83,
Bonjour Guy (en espérant n'oublier personne que j'aurais à nommer)

Mon Cher JM, très occupé et fatigué par mon travail, j'ai pris un peu de temps pour te répondre.
Voilà ci-dessous, c'est fait.
Avec mes imperfections, mes erreurs et mon langage "du matin" LOL

arthour973
Mon propos est motivé par deux choses au moins (et encore une fois ce n'est qu'une opinion)
Le 9ième régle d'or du VBA (tu trouveras les neuf autres sur le Web ;) )
9. Ne présumez pas que le code VBA soit nécessaire.
Souvent, une fonction de feuille de calcul est bien meilleur et plus efficace.


Je comprends tout à fait ton opinion, mais je n’ai pas la même.
Je pense que « ne présumez pas » n’est pas de mise quand une question est posée.
Sauf dans certains cas pour lesquels, à l’évidence vos conseils sont géniaux, le demandeur a besoin d’automatiser et/ou de ne pas oublier certaines actions. Dans ces cas, c’est à lui de décider d’utiliser VBA ou pas.
Et, comme Guy le dit : Faire une macro est intéressant si on fait très souvent la même chose.

Je le dis autrement :
Philosopher ? Pourquoi pas ?
Mais est-il indispensable de philosopher sur tout et n’est-il pas plutôt plus dans l’esprit d’un forum d’aider et de former le demandeur quand il confirme qu’il souhaite un code VBA et faire avec des macros, même ce qui peut être fait avec les fonctionnalités excel de bases ?
Toujours pour les même raisons :
- dans les classeurs, chacun y a "son travail" ou objectifs à atteindre et les macros permettent l'automatisation (je crois que c'est la raison d'existence des macros ou de tout programme ?),
- certaines macros (celle-ci pour moi), entrent en exécution automatique à l'exécution d'autres macros = plus d'automatisation = gain de temps,
- Egalement, tjrs à mon humble avis, l'une des raisons d'être des macros, l'automatisation évite des oublis,
- Enfin, pour le plaisir de s'améliorer grâce à vos codes et conseils,

Conseils et orientation OUI mais philosophie qui n’en finit plus …. Cela me semble un peu plus compliqué.
(c’est mon humble avis)

Et puisque tu parles philosophie, alors je suis assez adepte de celle-ci ;)
LOL, je te fais remarquer, que c’est toi qui m’amène à te parler de philosophie (pour ma part, je n’ai pas vraiment trop de temps dans ce contexte).

Sans oublier, que ceux qui ont conçu Excel et son ergonomie ont consulté et parfois pris en compte les avis des utilisateurs d'Excel pour ajouter/améliorer des fonctionnalités.
Pas de commentaire
Bref pour supprimer des lignes, Microsoft a déjà prévu des moyens de le faire nativement dans Excel.
Pas de commentaire
Si l'utilisateur veut supprimer des lignes, il les sélectionne, clic-droit Supprimer ou le raccourci clavier évoqué plus haut.
Pas de commentaire
Je pense que le demandeur à ses raisons n'est-ce pas le plus important ?
Non car le demandeur surtout(et là je ne parle pas de toi) quand il connait mal Excel ou débute avec lui peut se fourvoyer.
Exemple: combien d'utilisateurs ont en bavé en créant des usines à gaz, jusqu'au jour ou quelqu'un leur a parler des TCD.


Je pense que sur le forum, le demandeur a simplement besoin de codes et de formation. Je pense que le demandeur à ses raisons, ses objectifs et qu’il est capable de prendre ses décisions.
Bien sûr, on en bave tous en créant des usines à gaz quelques fois … mais c’est un passage normal, à mon avis, pour acquérir l’expérience et avancer.
Suis-je vraiment hors de l’état d’esprit des interventions du forum ?

Si on te suit, parce que untel décide d'utiliser un outil (ici Excel) d'une façon non optimale, il ne faudrait pas le prévenir qu'il existe telle ou telle fonctionnalité dans Excel (qui soulagerait sa peine), sous prétexte qu'on postule que le demandeur a toujours raison et doit faire ce qu'il a envie de faire même si on sait qu'il existe d'autres voies beaucoup plus simples.

Bien sûr que si et nous en remercierons jamais assez mais :
ne sommes-nous pas, dans le cadre de notre échange, sur VBA ?
Le demandeur qui poste un fil sur le forum excel VBA n’attend-il pas un code et conseils formateurs VBA ?

Bien sûr, c’est tout en votre honneur et louable de le conseiller mais de là à philosopher !!! es-ce là l’attente du demandeur qui a souvent besoin d’une solution et si possible qu’il comprenne.
Le demandeur qui souvent fait la demande dans le cadre d’un besoin pour son travail a-t-il le temps de philosopher ?

Enfin pour la petite taquinerie amicale que j’accepte accepte plaisir.
Je te taquine moi aussi dans mes réponses et LOL souvent sans m’en apercevoir.
Juste histoire de finir par non plus une opinion, mais une petit taquinerie amicale à l'endroit d'arthour. ;)
En fonction des objectifs, il cherche des solutions et veut apprendre (si, si ... il y en a).
Si tu aimes apprendre, alors pourquoi tu oublies ce que tu as déjà appris :D:p
http://www.excel-downloads.com/threads/supprimer-des-lignes-non-classées.20010361/
Dans ce fil que tu initias le 29 juillet 2016, déjà dans les réponses faites, on évitait de recourir à Selection dans le code
Et en octobre 2016, zou tu replonges déjà dans la Selection et la belle macro de 00 semble avoir fini aux oubliettes.

Pas de souci pour la taquinerie, c'est un "sport" que j'adore et souvent, je le fais moi-même sans même m'en apercevoir LOL.

Je n’ai pas oublié le fil que tu me rappelles, bien au contraire, je l’utilise pour un autre classeur et j’ai déjà pu avoir plusieurs codes pour cette même action. Cependant, je ne les utilise pas forcément dans les mêmes contextes.

Tout est sauvegardé dans un dossier, le tout classé en sous-dossiers dans lesquels sont tous les classeurs avec toutes les macros que vous avez tous eu la gentillesse de me donner. Pour certaines, j’ai compris, j’en ai compris les codes. Pour d’autres, j’ai pas encore compris et je m’y remets dès que j’ai des moments car je trouve que tout ça c’est magique et j’ajoute que c’est grâce à vous tous que j’ai pu « automatiser » mes classeurs de travail qui me sont indispensables.

Pour chaque question posée, il y a mille et une solutions VBA (LOL, j’exagère un peu).
Pour apprendre, c’est mon cas, tous les codes m’intéressent, mêmes pour un même but à atteindre.

C’est ma façon de progresser.

Grâce à vous tous, j’ai déjà une vraie bibliothèque de codes que je peux :
Consulter selon mes besoins,
Prendre le temps de comprendre selon mon temps disponible,
Etc ….

Quand j’ai besoin d’un code, je pose ma question sur le forum.
J’ai à ce moment-là 3 contraintes :
1 – Le besoin souvent immédiat pour mon travail,
2 – J’ai au préalable réfléchi (en grand garçon LOL) et je connais bien mon besoin. Je suis preneur de conseils bien évidemment mais c’est d’un code dont j’ai besoin ou d’être guidé pour faire le code si j’ai le niveau de comprendre immédiatement,
3- Si je n’ai pas compris le code, je prends le temps, dès que j’ai un moment, de le décortiquer pour tenter de le comprendre.

Mais, sans vouloir blesser qui que ce soit, je n’ai vraiment pas le temps de philosopher longuement à chaque question posée.

Il y avait déjà ma femme qui philosophait (à sa manière) sur chacun des sujets qu’elle pouvait aborder et même si l’on est adepte de la communication, on n’a pas toujours le temps et …….. Tu me comprends JM LOL.

Ma petite pierre aux derniers propos de Guy et de toi-même :
Guy
J'oubliais l'intérêt de ne pas utiliser une macro : ON PEUT ANNULER alors que dès qu'on modifie une cellule par macro, il n'est plus possible d'annuler.


JM
Si l'utilisateur qui utilise le classeur contenant le VBA, ne maîtrise pas VBA, que fait-on dans ce cas de figure ?
Alors qu'un utilisateur à qui on aura pris le temps de fournir un mode opératoire sur les fonctionnalités de base d'Excel saura sélectionner les lignes qu'il souhaite supprimer avec ce simple CTRL+-


Arthour973
Comme je l'ai dit dans ma réponse à JM, le demandeur est un grand garçon et il doit faire son expérience. En fonction de vos conseils, c’est à lui de décider ou pas d’avancer sur du VBA ?

Et bien, pour quelqu’un qui ne veut pas philosopher à chaque instant, j’ai quand même pas mal développé …..
Mais je me devait de t’apporter ma réponse.
Bonne journée JM
Bonne journée à toutes et à tous,
Amicalement,
Lionel,
 

Guy_M

XLDnaute Occasionnel
Bonjour Staple1600 et Arthour973,

Si l'utilisateur qui utilise le classeur contenant le VBA, ne maîtrise pas VBA, que fait-on dans ce cas de figure ?
Regarde la pièce jointe 973638

Quand on fait un code, on gère les erreurs pour que ce genre de popup ne s'affiche pas surtout quand c'est pour quelqu'un d'autre. Sinon faut assumer : expliquer avant/après à celui auquel on refile le code ou être prêt à intervenir.

Dans la "Sub test()", j'ai essayé de gérer les erreurs les plus évidentes : l'appel aurait pu tenir sur une seule ligne :
VB:
Sub test()
Lignes_supprimer ActiveSheet.Columns("A:O"), CStr(InputBox("Que voulez-vous supprimer ?", , Selection.Value) )
End Sub

Petit conseil pour Arthour973 qui à l'air de les apprécier : on ne fait jamais trop de gestion d'erreurs, voir apparaître un popup comme celui que nous a montré Staple1600 est très désagréable (et encore, celui là est explicite), surtout si cela correspond à la vérification des données en entrée.
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Guy,

Un grand merci de participer à cette longue philosophie et merci pour vos codes et conseils.
LOL, quelle discussion !!! mais au final très intéressante.

Bonne journée,
Amicalement,
Lionel,
PS :
Il y a déjà un bon moment qu'avec JM nous philosophons sur la protection Excel et sur d'autres sujets ;)
 

Staple1600

XLDnaute Barbatruc
Bonsoir à tous

Mais est-il indispensable de philosopher sur tout et n’est-il pas plutôt plus dans l’esprit d’un forum d’aider et de former le demandeur quand il confirme qu’il souhaite un code VBA et faire avec des macros, même ce qui peut être fait avec les fonctionnalités excel de bases ?
Rien n'est indispensable sur ce forum (à part rester courtois)
Comme tu as passé ta discussion en RESOLU, rien n’empêche les digressions, camarade ;)

Personnellement, je considère qu'une question posée sur un forum public n'appartient plus au demandeur.
Chacun est libre d'apporter la réponse de son choix qu'elle résolve ou pas la question.
C'est ce qui fait la richesse des échanges, non ?
Peut-être qu'une réponse ne répondra pas précisément au besoin du demandeur.
C'est pas grave, peut-être cette réponse intéressera un autre membre du forum qui passerait dans le fil.
Une autre réponse y répondra, tant mieux pour le demandeur.

Tant que les échanges restent amicaux et courtois, la parole est libre sur XLD.
C'est ce qui faisait le charme de ce forum jadis. Aujourd'hui, l'esprit de l'ancien XLD est plus que moribond.

Les questions redondantes s’enchaînent les unes après les autres, et la même brochette d'aficionados persistent à y répondre mais le plus souvent chacun dans son coin, sans l'émulation et les délires des temps anciens.

La plus grande part des nouveaux membres est dans l'air du temps:
consumériste et voulant du tout cuit et peu encline à mettre les mains dans le cambouis.

Mais je m'égare, je vais prendre mes gouttes et oublier tout ce que je viens d'écrire ;)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour JM,
Bonjour à toutes et à tous,

Mes propos en réponses aux tiens n'avaient pas pour but d'être discourtois et restent pour moi des propos amicaux et reconnaissants de vos interventions toujours indispensables et si bienveillantes.

Mais pour beaucoup, les temps changent, tout va plus vite et les "anciens" que nous sommes regrettent les temps passés.
C'est un peu la même triste évolution dans les sentiments LOL.

J'espère ne pas t'avoir donné cette mauvaise impression, mon but n'était que de te répondre et te donner mon avis.

A toutes et à tous, je vous souhaite une très belle journée,
Amicalement,
Lionel,
 

Staple1600

XLDnaute Barbatruc
Bonsoir à tous

arthour973
Je n'ai jamais dis que tu étais discourtois ;)

Je parlais en général:
On peut tout dire sur un fil:
•répondre à la question
•digresser
•philsopher
•délirer
•faire de l'humour
•échanger des recettes sans gluten (nan je déconne)
etc...​
Tant que les échanges restent courtois et amicaux.

[reductio ad absurdum, matinée d'une pointe d'humour à moins que ce soit le contraire]
Maintenant revenons à l'essentiel
Pourquoi donc veux-tu supprimer des lignes dans un classeur?
(que ce soit en VBA ou manuellement)
Car enfin si ces lignes sont à supprimer, c'est qu'elles sont inutiles.
Dans ce cas, pourquoi sont-elles présentes dans le classeur ?​
[/reductio ad absurdum, matinée d'une pointe d'humour à moins que ce soit le contraire]
 

Discussions similaires

Statistiques des forums

Discussions
312 224
Messages
2 086 410
Membres
103 201
dernier inscrit
centrale vet