Si "E,K ou P" dans une cellule, supprimer la ligne
Bonjour tout le monde !
Je débute en VBA, j'ai vu pas mal d'exemples pour ma problématique mais je n'arrive pas à les appliquer.
En colonne "C" j'ai mes numéros de commandes sous ce format "C#######-####", j'ai certaines commandes sous ce format "E#######-####", "K#######-####" et "P#######-####". J'aimerais avoir une macro qui me supprime les lignes correspondantes à ces numéros de commandes (E,K et P) pour garder uniquement les C.
Ce serait pour l'ajouter à une suite de manipulations déjà établies sinon je ferais "trier>supprimer"
Si quelqu'un peut m'aider je lui serais vraiment reconnaissant
Merci d'avance
Bonjour Tipsy,
Il y a beaucoup de solutions possible pour répondre à cette demande, selon les personnes et les connaissance
Quelques question déjà:
Si l'on tri tes numéros de commande cela te gène? au pire tu peux refaire un tri par date par la suite (j'imagine que tu as une colonne de date)
Combien de ligne as tu dans ton fichier?
Des indices pour faire cela:
1. Soit on veut faire ça bien et on passe par des tableaux: on prend dans un tableau toute ta sheet, on fait le tri en regardant si on commence par un "C" dans ta colonne 3 (if left(cellule(X,X).value,1)= "C" then), on delete toute les info de ta feuille et on copie le nouveau tableau trié
1.1 On veut faire ça bien et être malin pour gagner du temps et le tri ne te dérange pas, on fait déjà un tri croissant sur la colonne C donc toutes les infos que tu ne veux pas sont en fin, pour boucler sur le tableau il y a beaucoup moins d'itération que la première solution.
2. Soit on est barbare et en quelques lignes de codes c'est fini et surtout tu as peu de ligne dans ton fichier ou alors ça va prendre du temps: on boucle par macro sur ta colonne C, si le premier caractère n'est pas un C on fait un row.delete
2.1 On est barbare mais un peu malin, on fait la même boucle mais on stock dans un range les lignes à supprimer et on le fait en un coup une fois toute les lignes finies car supprimer 1 ligne par 1 c'est long !
2.2 On est barbare, un peu malin mais pas pressé: on fait d'abord un tri croissant, on boucle pour trouver la première référence pas en "C" et on supprime ligne par ligne
2.3 On est barbare, un peu malin et pressé quand même: on fait d'abord un tri croissant, on boucle, on met dans un range les références pas en "C", on delete tout à la fin
2.4 Bon ça commence à en faire des idées, on est barbare mais dans le top 3 des moins bêtes : on fait un tri croissant, on boucle pour trouver la première référence pas en "C" et... on ne fait pas delete de ligne car ca prend un temps fou ... mais on supprime simplement le contenu en passant par un range
ECG
Bonjour Tipsy,
Comme tu n'as pas joint de fichier, je te propose ce code VBA barbare (selon les termes d'ExcelCoreGame) :
Option Explicit
Sub Essai()
' N° Commande : en colonne C
' ligne 1 : en-têtes ; données à partir de la ligne 2
Application.ScreenUpdating = 0: Application.Calculation = -4135
Dim dlig&, lig&: dlig = Cells(Rows.Count, 3).End(xlUp).Row
For lig = dlig To 2 Step -1
If Left$(Cells(lig, 3), 1) <> "C" Then Rows(lig).Delete
Next lig
Application.Calculation = -4105
End Sub
ECG a raison quand il dit que c'est une méthode lente, mais ça peut convenir si tu n'as pas trop de lignes.
Cordialement
Bonjour les gars !
Merci ECG, ton message m'a fait sourire et me creuser la tête un petit peu.
Et merci dhany pour le code, je vais essayer avec ça avant d'optimiser tout ça avec vous
Je vous met le fichier en PJ mais dans l'idée j'aimerais que ça se fasse le plus rapidement possible car j'aimerais rajouter certaines automatisations. Je ne sais pas comment je vais faire encore mais j'essaierai de trouver avant de venir vous embêter.
J'extrais ces tableaux d'environ +25XX lignes tous les mois. J'aimerais créer une macro qui :
- Supprime les colonnes dont j'ai pas besoin,
- Supprime les commandes E,K,P,
- Supprime les doublons de ligne,
- M'affiche les temps en minutes (00:00),
- La colonne date n'affiche que la date et plus l'heure à côté,
- Créer un TCD qui me sert sur un plateau :
- La consommation mensuel par camion (ça je le traiterai en dernier car j'ai pas toutes les infos)
- les kilomètres journaliers/camion (moyenne)
- le nombres de déchargements journaliers/camion (moyenne)
- le temps de déchargements journaliers/camion (moyenne)
- surement deux ou trois autres trucs
A terme, quand je sortirais mon extraction en début de mois, j'aurais juste à lancer ma macro pour avoir toutes mes infos. J'ai compris les bases de VBA mais j'ai pas encore l'esprit assez élastique alors je m'entraine sur autre chose.
Si vous avez le temps de m'aider à avancer sur mon projet je vous en remercie mais j'aimerais chercher un peu tout seul
Donc pour l'instant, traiter mes lignes de commande E,K,P ça m'aiderai pas mal et pour le reste, si je galère, je vous mettrais le code que j'essaye pour qu'on puisse avancer.
Je vous remercie énormément pour votre attention, ça fait plaisir de voir qu'on peut s'entraider comme ça
Tipsy
Bonjour à tous !
Pour diversifier le test (avec Like), greffé sur le modèle de Dhany
If Cells(lig, 3) Like "[EKP]*" Then '=>on supprime
Au vu du nombre de manipulations à suivre, on peut aussi se demander s'il ne convient pas d'opter pour reconstituer un tableau par prélèvement de ce qu'on garde : à la fin on supprime l'existant et on réaffecte le tableau recomposé.
Cordialement.
Re Bonjour !
Merci MFerrand,! J'ai ajouté votre diversification. Je suis pas contre votre idée, malheureusement je n'ai aucune idée de la mise en pratique. Je verrais ça de mon côté
Sub Projet_Automatisation_Step2()
' Step 2 : Surppression des lignes de commandes E,K,P
Application.ScreenUpdating = 0: Application.Calculation = -4135
Dim dlig&, lig&: dlig = Cells(Rows.Count, 3).End(xlUp).Row
For lig = dlig To 2 Step -1
If Cells(lig, 3) Like "[EKP]*" Then Rows(lig).Delete
Next lig
Application.Calculation = -4105
End Sub
Ceci fonctionne très bien
Sub Projet_Automatisation_Step1()
' Step 1 : Suppression des colonnes inutiles
Range("C:C,E:E,G:G,H:H,J:J,L:L,N:N,O:O").Delete
End Sub
Ceci également
Comment faire un 2 en 1 ?
Merci pour votre disponibilité
Bonjour Tipsy,
Tu a écrit :Comment faire un 2 en 1 ?
Je te propose ce code VBA (à adapter au besoin selon l'avertissement situé en dessous) :
Sub Projet_Automatisation_Steps1et2()
Application.ScreenUpdating = 0: Application.Calculation = -4135
' Step 1 : Surppression des lignes de commandes E,K,P
Dim dlig&, lig&: dlig = Cells(Rows.Count, 3).End(xlUp).Row
For lig = dlig To 2 Step -1
If Cells(lig, 3) Like "[EKP]*" Then Rows(lig).Delete
Next lig
' Step 2 : Suppression des colonnes inutiles
Range("C:C,E:E,G:G,H:H,J:J,L:L,N:N,O:O").Delete
Application.Calculation = -4105
End Sub
⚠ Note bien qu'avec ce code qui supprime la colonne C, tu supprimes les N° de commande qui ont servi pour
supprimer les lignes des commandes E, K, P ; je ne suis pas sûr que ce soit ce que tu veux, alors vérifie bien !
Ça pourrait être plutôt celui-ci, si les N° de commande sont en colonne D AVANT suppression des colonnes :
Sub Projet_Automatisation_Steps1et2()
Application.ScreenUpdating = 0: Application.Calculation = -4135
' Step 1 : Suppression des colonnes inutiles
Range("C:C,E:E,G:G,H:H,J:J,L:L,N:N,O:O").Delete
' Step 2 : Surppression des lignes de commandes E,K,P
Dim dlig&, lig&: dlig = Cells(Rows.Count, 3).End(xlUp).Row
For lig = dlig To 2 Step -1
If Cells(lig, 3) Like "[EKP]*" Then Rows(lig).Delete
Next lig
Application.Calculation = -4105
End Sub
Et si les N° de commande sont en colonne C AVANT suppression des colonnes :
Sub Projet_Automatisation_Steps1et2()
Application.ScreenUpdating = 0: Application.Calculation = -4135
' Step 1 : Suppression des colonnes inutiles
Range("C:C,E:E,G:G,H:H,J:J,L:L,N:N,O:O").Delete
' Step 2 : Surppression des lignes de commandes E,K,P
Dim dlig&, lig&: dlig = Cells(Rows.Count, 2).End(xlUp).Row
For lig = dlig To 2 Step -1
If Cells(lig, 2) Like "[EKP]*" Then Rows(lig).Delete
Next lig
Application.Calculation = -4105
End Sub
(car alors, les N° de commande de la colonne C passent en colonne B)
Cordialement
Pardonnez-moi, je suis un vrai demeuré. J'avais la réponse depuis le début de matinée, c'est juste que je l'avais pas tapé dans un module.. Je vous ai dis que je commençais !
Merci beaucoup pour votre aide ! Vous êtes des génies !
Je continue mon petit projet et je reviens vers vous quand je bloquerai sur quelque chose au point de péter mon écran !
Cordialement !