Macro évènement effacer contenu de cellules après saisi d'une cellule
Bonjour,
Dans un tableau que j'utilise, je souhaiterai effacer le contenu des cellules des colonnes B, C et D puis F, G et H lorsqu'une valeur ("ok" par exemple) est saisie dans la colonne I.
Parallèlement, j'aimerai pouvoir trier la colonne E de manière croissante, soit tous les jours (quand la valeur de =aujourdhui() change), soit à l'enregistrement...
Je n'ai jamais utilisé les macros évènements, je comprends bien le principe mais je bloque sur la mise en place et l'utilisation des bons arguments.
Merci ;-)
Bonjour et bienvenue
Pour ta première question, il faudrait quelque chose comme
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [I2:I200]) Is Nothing Then
If UCase(Target) = "OK" Then
Cells(Target.Row, 2).Resize(1, 3).ClearContents
Cells(Target.Row, 6).Resize(1, 3).ClearContents
End If
End If
End Sub... en tout cas, si j'ai compris la demande.
Pour la seconde question, l'objet ThisWorkbook dispose de procédures événementielles ... mais avant de t'en préoccuper, peut-être faut-il t'interroger sur ce que donnera un tri sur les valeurs de la colonne E : une cellule vide, deux contenant du texte et les autres contenant des données numériques
Merci beaucoup !
C'est exactement ça... Etape 1 réalisée avec succès (et U.Milité
Pour le tri, en effet, pour l'instant il y a des cellules vides et / ou du texte sur certaines cellules mais je peux imaginer autre chose. Mettre "0" au lieu de Vide et un code couleur au lieu d'un texte
Re-bonjour
U.Militéj'aime beaucoup ce pseudo)
Moi aussi
Pour le tri, en effet, pour l'instant il y a des cellules vides et / ou du texte sur certaines cellules mais je peux imaginer autre chose. Mettre "0" au lieu de Vide et un code couleur au lieu d'un texte
C'est un peu tiré par les cheveux
Si tu veux voir les délais dépassés en premier, puis les 0, puis les valeurs supérieures à 0 en ordre croissant, il y a peut-être une autre solution.
Si c'est autre chose, je préfère passer mon tour
Bonsoir,
les délais dépassés en premier, puis les 0, puis les valeurs supérieures à 0 en ordre croissant, serait en effet l'idéal.
Je me suis mal exprimée pour mon histoire de code couleur
Bonne soirée !
Je me suis mal exprimée pour mon histoire de code couleur, c'est qu'au lieu d'écrire DELAI DEPASSE je peux mettre un 0 mais qui apparait sur un fond rouge par exemple. Et dans ce cas on trie juste des valeurs numériques....
Tu auras alors des '0' dans deux cas différents !?
Je propose dès lors d'afficher '-1' au lieu de "délai dépassé". C'est donc un tri croissant tout simple sur des valeurs numériques.
En colonne E, on applique un format personnalisé : 0;"délai dépassé"; De cette manière, les nombres positifs s'affichent normalement ; les valeurs négatives sont remplacées par le texte et les '0' ne sont pas visibles.
La MFC teste simplement les valeurs <0
Regarde dans la pièce jointe, la formule, le format personnalisé et la règle de la MFC.
Qu'en dis-tu ?
Bonne nuit
Merci, super l'idée du format personnalisé avec lequel on peut remplacer un chiffre par un texte, je ne connaissais pas !
Je vais avoir plusieurs feuilles dans mon fichier, est-ce que je peux imaginer un tri automatique quand je passe de l'une à l'autre sur cette fameuse colonne E ?
Peut-être quelque chose avec Private Sub Worksheet_Activate() ?
Mais à l'intérieur j'ai un doute, je dois mettre un xlAscending quelque part et indiquer que c'est sur la colonne E avec Columns("E:E").Select peut-être mais est-ce que je dois définir la plage de tri ?
Encore merci pour toute ton aide
Salut,
Quand tu tries une liste de données ... tu sélectionnes une colonne !?
Dans un cas comme celui-ci, utilise l'enregistreur de macro, puis examine (et adapte, si besoin) le code qui aura été généré. N'hésite pas à revenir si tu as des questions.
En utilisant un tableau (Insertion > Tableau), tu te faciliterais sans doute un peu l'existence : à chaque ajout de données dans une ligne sous le tableau, celui-ci se redimensionne et toutes les formules, Validations de données et MFC se recopient dans cette nouvelle ligne.
en effet, quand je trie je ne sélectionne pas la colonne...
Je vais faire avec l'enregistreur de Macro et creuser la piste du tableau.
Merci pour tout !
Bonne journée
Re bonjour,
j'aurai besoin d'une petite précision stp...
Si je veux rajouter une seconde macro évènement du même type (Worksheet_Change) sur cette même feuille. La saisie d'un "ok" dans la colonne J = fin de TTT par exemple, j'ajoute le code dans le même bloc ?
/* J'essaie de supprimer toutes les données de la ligne sauf la colonne E, si je saisis "ok" dans la colonne J */
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [I2:I200]) Is Nothing Then
If UCase(Target) = "OK" Then
Cells(Target.Row, 2).Resize(1, 3).ClearContents
Cells(Target.Row, 6).Resize(1, 3).ClearContents
End If
End If
If Not Intersect(Target, [j2:j200]) Is Nothing Then
If UCase(Target) = "OK" Then
Cells(Target.Row, 1).Resize(1, 4).ClearContents
Cells(Target.Row, 6).Resize(1, 5).ClearContents
End If
End If
End Sub
J'ai un problème d'execution 13 dans ce cas... il faut que je renomme la variable dans la seconde peut-être ? je suis un peu perdue...
Si je fais deux
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub ?
Ca ne marche pas non plus...
Je suis désolée mais je ne maitrise pas encore vraiment le code VBA
Encore MERCI !
Salut,
Tu ne peux pas, dans le même module de feuille, avoir deux Sub Worksheet_Change distinctes.
Donc le code que tu proposes est correct ... SAUF QUE en effaçant la seconde plage de la ligne (de F à J), tu modifies le contenu de la colonne I, ce qui appelle la même procédure (à l'intérieur du premier appel à cette même procédure, si tu arrives à me suivre
La solution est donc de suspendre la gestion des événements, pendant qu'on efface des données :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [I2:I200]) Is Nothing Then
If UCase(Target) = "OK" Then
Application.EnableEvents = False
Cells(Target.Row, 2).Resize(1, 3).ClearContents
Cells(Target.Row, 6).Resize(1, 3).ClearContents
Application.EnableEvents = True
End If
End If
If Not Intersect(Target, [j2:j200]) Is Nothing Then
If UCase(Target) = "OK" Then
Application.EnableEvents = False
Cells(Target.Row, 1).Resize(1, 4).ClearContents
Cells(Target.Row, 6).Resize(1, 5).ClearContents
Application.EnableEvents = True
End If
End If
End SubLa propriété "EnableEvents" est à False, avant d'effacer et elle repasse à True, ensuite.
PS : Utilise les balises, quand tu insères du code dans un message (le bouton </> en haut de la fenêtre où tu rédiges), c'est plus lisible
Ah oui ! merci, j'ai compris le Enable.Events
et merci aussi pour les balises je ne comprenais pas comment faire pour mettre le code différemment (comme tout le monde
Bonne soirée