VBA - Suppression de colonnes
Bonjour à tous,
Ceci est mon premier topic, j'espère respecter les conditions de demandes.
Je suis au niveau zero en macro. Comme beaucoup je n'ai pas le temps de me plonger dedans, donc je ne fais que prendre des idées, copier-coller des lignes et adapter pour mon utilisation.
Aujourd'hui, j'ai un objectif de par un export.
J'ai un classeur composer de trois feuille.
Une feuille ou je viens copier coller un export.
Une feuille avec des boutons.
Une feuille où vient s'intégrer le résultat des boutons ayant agit sur l'export.
Voici mes attentes.
Les boutons devrait être là pour :
Un bouton pour supprimer les colonnes inutiles de l'export. (toujours les mêmes).
Un bouton pour supprimer des lignes. (si la date de telle colonne est égale à telle colonne, alors supprimer la ligne).
Un bouton pour convertir une date (L'une des colonnes affiche la date ainsi : "JJ/MM/AAAA 15:42". De ce fait je dois sans arrêt supprimer convertir la colonne pour séparer la date et pouvoir la traiter dans une formule..)
Voilà voilà, je prend tout conseil, formule ou piste de réflexion.
Je vous remercie par avance,
Cordialement,
Tesla
Bonjour,
C'est bon je l'ai intégré dans la demande
Re,
J’ai placé sur trois lignes en tout cas les mêmes dates dans les colonnes I et M (marquées en rouge). En cliquant sur le premier bouton, ces lignes de la feuille Export disparaissent à tout jamais. La feuille Export n’est pas activée, ni en cours, ni en fin de macro.
Dans la colonne L, il y a des dates au format qui te gêne. Au deuxième des boutons est relié un code qui transforme ce format, également sans activer la feuille traitée.
Au troisième bouton, j’ai affecté une macro qui supprime les colonnes C, D et F de la feuille Export sans l’activer. Pour faire des essais, je te conseille d’ajouter des colonnes C, D et F au préalable, autrement, en faisant plusieurs essais, tu as toutes tes colonnes qui disparaissent gentiment, trois par trois
Et il est bien entendu que si tu supprimes des colonnes existantes, les autres colonnes changent de place et les deux macros ci-dessus ne fonctionnent plus correctement. Si tu utilises ces trois codes à la suite, fait bien attention à leur ordre.
Je trouve peu logique de placer les boutons sur une autre feuille que celle traitée, sauf si c’est une nécessité.
Il y a tout plein d’autres actions qui seraient possible – comme de sélectionner une feuille bien précise la fin de la macro – mais ne comprenant pas très bien ton travail, il est difficile d’en faire plus pour l’instant.
Amicalement.
Bonjour,
Une proposition Récupérer et transformer (Power Query) natif Excel 2016.
Le résultat est conforme à la feuille Traitement de ton classeur.
A te relire.
Cdlt.
Re !
Merci beaucoup pour le temps passé sur mon fichier.
Pour t'expliquer mon travail, je recontextualise :
Ce fichier contient une liste de RDV client qui ont été placé hors délais par les SI.
De ce fait une action manuelle doit avoir lieu pour replacer les RDV dans les délais selon un catalogue de prestation.
Pour cela, on a un export que l'on prend chaque jour sur un site interne.
Cet export à beaucoup de colonnes mais seules certaines nous sont utiles :
La référence client (colonne A, référence PDS)
Et toutes les colonnes avec les dates suivantes
"DATE EFFET SOUHAITEE DEMANDE RETENUE" Colonne L
"DATE ENGAGEMENT" Colonne M
"DATE PLANIFIEE DEPLACEMENT" Colonne AH
Et voici le déroulement du traitement :
Si DATE EFFET SOUHAITEE DEMANDE RETENUE = DATE PLANIFIEE DEPLACEMENT alors on est bon, on peut suppr la ligne
Si PLANIFIEE DEPLACEMENT < DATE ENGAGEMENT alors on est bon, on peut suppr la ligne
(la date engagement est la date maximale autorisé pour un RDV. C'est notre date de péremption en gros
Si "DATE PLANIFIEE DEPLACEMENT" < DATE EFFET SOUHAITEE DEMANDE RETENUE alors on est bon, on peut suppr la ligne
Si "DATE ENGAGEMENT =< à la date d'aujourd'hui alors c'est trop tard, on peut suppr la ligne
Si l'une de ces conditions est remplie, le catalogue de prestation est respecté ou déjà dépassé donc aucun traitement n'est nécessaire.
C'est pour ça que j'ai besoin de ces boutons, et la suppression des colonnes permet d'enlever du parasite visuel.
Ensuite, j'essaierai de créer un bouton pour copier coller l'export après traitement par bouton, dans la feuille "traitement".
Dans celle si, une colonne sera rajoutée pour que moi ou mes collègues laissions une trace de traitement. (comme RDV placé dans les délais, pas de réponse, message laissé le 20/12/2019....).
Je vais essayer demain matin à la première heure la V1 et je te fais un retour si j'ai des précisions ou des incompréhensions,
Merci beaucoup,
Cordialement,
Tesla
Salut Telsa,
Réponds-tu à Jean-Eric ou à moi ?
Dans tous les cas, ce serait bien que tu étudies les deux propositions et que tu choisisses l'une ou l'autre, afin que nous sachions comment continuer.
Chaleureusement.
Je te répondais à toi Yvouilles,
J'ai rapidement lu la réponse de Jean-Eric,
Je ne connais pas du tout cette façon de procéder donc demain je vais également me plonger dedans histoire d'apprendre quelques ficelles.
Donc merci à toi également Jean-Eric pour ta réponse.
Je vais partir dans un premier temps sur ta version Yvouilles étant donné qu'elle m'est plus familiere,
Cordialement,
Tesla
Salut Telsa,
Réponds-tu à Jean-Eric ou à moi ?
Dans tous les cas, ce serait bien que tu étudies les deux propositions et que tu choisisses l'une ou l'autre, afin que nous sachions comment continuer.
Chaleureusement.
Bonjour Yvouille,
Alors, j'ai regardé ce que tu avais fait ! les boutons marchent parfaitement, j'ai un peu modifier la suppression de colonne ainsi :
.Range("AI:AV,N:AG,B:K").Delete Shift:=xlToLeft
Afin qu'il ne reste plus que le vital.
Par contre, j'ai deux questions :
Pour la suppression de lignes, est-ce que je peux rajouter après "If .Range("I" & i) = .Range("M" & i) Then .Range("A" & i).EntireRow.Delete"
quelques choses comme ça : or "If .Range("I" & i) < .Range("L" & i) Then .Range("A" & i).EntireRow.Delete
Ou y'a t'il un mot de liaison spécifique peut-être ?
C'est pour rajouter les fameux :
Si DATE EFFET SOUHAITEE DEMANDE RETENUE = DATE PLANIFIEE DEPLACEMENT alors on est bon, on peut suppr la ligne
Si PLANIFIEE DEPLACEMENT < DATE ENGAGEMENT alors on est bon, on peut suppr la ligne
(la date engagement est la date maximale autorisé pour un RDV. C'est notre date de péremption en gros
Si "DATE PLANIFIEE DEPLACEMENT" < DATE EFFET SOUHAITEE DEMANDE RETENUE alors on est bon, on peut suppr la ligne
Si "DATE ENGAGEMENT =< à la date d'aujourd'hui alors c'est trop tard, on peut suppr la ligne
Aussi, je n'arrive pas à faire fonctionner le bouton de conversion format de date /:
Merci par avance,
Cordialement,
Tesla
Salut,
Comme pour la fonction SI() d'Excel, tu peux combiner à l'envi If Then avec des AND ou des OR. Si tes conditions se compliquent un peu, tu peux utiliser des parenthèses afin de séparer les diverses parties. Par exemple
If 1 = 1 AND 2=2 AND ((3=3 OR 4=4) AND 5=5) then
Mais le mieux de tout - lorsque tu n'es pas sûr d'un truc - c'est de l'essayer OR d'aller chercher l'aide d'Excel à l'aide de F1 OR de fouiller un peu la toile
Mais encore ? Tu n'arrives pas à cliquer sur le bouton en place ? Change de sourisAussi, je n'arrive pas à faire fonctionner le bouton de conversion format de date /:
Amicalement.
Yvouille,
D'accord je comprend un peu mieux avec la comparaison fonction SI
Pour la fonction format date, j'ai tenté directement que la faire fonctionner sur la version 1 que tu m'a envoyé.
Désolé pour le manque d'info. En fait lorsque je clique sur le bouton, rien ne se passe. Il s'agit bien de la colonne L.
Ton code contient :
.Range("L2:L" & .Range("A" & Rows.Count).End(xlUp).Row).NumberFormat = "dd/mm/yyyy;@"
Donc j'imagine que c'est cela qui concerne la colonne choisie
Le reste du code par contre, je t'avoue avoir du mal à le comprendre lol.
L'idéal est éventuellement de me fournir un fichier-modèle sur lequel tu n'arrives pas à appliquer mon code.
Il est où ton fichier à problème ?
Chez moi, voici le résultat avant / après avoir lancé la macro. Le format de date 17.01.2020 13:42 est peut-être visible différemment chez toi, mais comme Excel travaille en arrière plan avec des dates internationnales, ça ne devrait pas créer de problème. D'ailleurs, vois-tu les dates comme je les vois moi ?
.Range("L2:L" & .Range("A" & Rows.Count).End(xlUp).Row).NumberFormat = "dd/mm/yyyy;@"
Donc j'imagine que c'est cela qui concerne la colonne choisie
Oui, j'applique à une certaine plage un certain format de date.
Hop je te met ma version en PJ.
J'ai donc deux requêtes :/
Il faudrait que ce bouton de format date, traite la colonne AH, dans laquelle il y' a les heures. (petite erreur avec la colonne L, j'ai donc repris le fichier d'export original). Ta fonction marchait bien en fait (j'avais trop cafouillé) mais lorsque que je change L2:L par AH2:AH cela ne fonctionne pas sur mon fichier
J'ai un soucis avec la suppression des lignes. J'ai rajouter des conditions, mais cela supprime tout, comme si mes conditions concernait toutes les lignes.. Tu aurais une idée ?
Code :
Sub Supprimer_lignes()
Dim i As Integer
With Sheets("Export")
For i = .Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("AH" & i) = .Range("L" & i) Then .Range("A" & i).EntireRow.Delete
If .Range("AH" & i) < .Range("M" & i) Then .Range("A" & i).EntireRow.Delete
If .Range("AH" & i) < .Range("L" & i) Then .Range("A" & i).EntireRow.Delete
If .Range("M" & i) <= Date Then .Range("A" & i).EntireRow.Delete
Next i
End With
End Sub
Sub Nouveau_format_date()
With Sheets("Export")
.Range("AH2:H" & .Range("A" & Rows.Count).End(xlUp).Row).NumberFormat = "dd/mm/yyyy;@"
End With
End Sub
Sub Supprimer_Colonnes_CDF_Export()
With Sheets("Export")
.Range("AI:AV,N:AG,B:K").Delete Shift:=xlToLeft
End With
End Sub
Salut,
Tu sembles confondre le format des cellules et leur contenu. Le format des cellules est la manière dont tu les vois à l'écran, alors que leur contenu est ...... ce qu'elles contiennent.
Lorsque tu m'as demandé de changer le format des cellules de ton ancienne colonne L, j'ai changé la gueule que ça a à l'écran, mais non pas le contenu. Ainsi, si tu ne voyais plus les heures et minutes à l'écran, ces données étaient toujours bien présentes dans le contenu. Le format est ce que tu vois dans la cellule alors que le contenu est ce que tu vois dans la barre de formule, comme tu peux le voir pour la cellule AH2 du fichier ci-joint.
Pour ta nouvelle colonne AH, la nouvelle macro du fichier ci-joint, placée derrière le bouton ''Dates sans heures'', modifie le contenu des cellules et non plus seulement son format.
Mais bon, ton fichier est quand même un peu bizarre.
En colonne L, tu as des données qui sont à un format de cellule "Standard" et qui semble ne pas être reconnu comme une date lorsque tu veux lancer ta macro pour la suppression de lignes. C'est la raison pour laquelle toutes tes lignes sont supprimées.
J'ai voulu transformer ces ''textes'' non reconnus comme des dates en des dates et - oh surprise - au moment de copier la ligne de mon code du dessus - pour la colonne AH - afin de m'en servir comme base, ces cellules de la colonne L sont reconnues comme dates par la macro, lorsque je veux créer cette nouvelle DateSerial !!!!!!!!!
.Range("AH" & i) = DateSerial(Year(.Range("AH" & i)), Month(.Range("AH" & i)), Day(.Range("AH" & i)))
.Range("L" & i) = DateSerial(Year(.Range("L" & i)), Month(.Range("L" & i)), Day(.Range("L" & i)))Une fois cette colonne L également transformée - d'une date à une date !!!!!!!! - la macro pour la suppression des lignes fonctionne différemment.
J'aurais donc dû renommer mon bouton ''Dates sans heures'' en ''Dates sans heures en colonne AH et traitement de la colonne L'', mais je préfère te laisser choisir le nom de ce bouton
Amicalement.
Je constate à l'instant que tu n'as pas été très courageux ou très courageuse en ce qui concerne l'utilisation des OR
Voici le code ainsi simplifié et qui fonctionne tout aussi bien que celui de la version 3 :
Sub Supprimer_lignes()
Dim i As Integer
With Sheets("Export")
For i = .Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
If .Range("AH" & i) = .Range("L" & i) Or .Range("AH" & i) < .Range("M" & i) Or .Range("AH" & i) < .Range("L" & i) Or .Range("M" & i) <= Date Then .Range("A" & i).EntireRow.Delete
Next i
End With
End Sub
Hello,
Alors il ne faut pas critiquer les exports. Ils viennent de nos informaticiens adorés !
Je plaisante, j'ai abandonné. La logique est parfois relative.
Concernant la suppression des lignes, si, j'insiste, j'avais essayé avec OR et AND mais je sautais une ligne pour placer la nouvelle
condition. De ce fait cela j'affichais le mot de liaison en rouge avec un message d'erreur et un débogage..
Un grand merci pour la réalisation des trois macros ! je vais tester cela au boulot demain, et ensuite je viendrai cloturer le topic (si j'arrive à faire quelque chose de mes dix doigts) lol.
Un bon dimanche à toi,
Cordialement,
Tesla
Bonjour Yvouille,
Bonne année à toi !
Bon, le fichier marche parfaitement ! Je clos donc le topic.
Merci pour ton aide et le temps passer sur mon fichier !
Cordialement,
Tesla