Modification automatique d'une cellule
Bonjour le forum,
J’aurai besoin d’un petit coup de main ou plutôt d’un petit coup de « VBA »
Exemple. Dans le fichier joins ou j’ai mis dans la colonne « AM » une date à chaque ligne que comporte le tableau (situation de départ).
Cas 1 : Si je modifie la date de début et/ou de fin de la formation SH63 (par exemple) il faudrait que les informations de la colonne AM correspondant aux lignes de cette formation s’effacent.
Cas 2 : Si je fais une modification dans l’une des colonnes de L à M que les informations de la colonne « AM » correspondant aux lignes de ces modifications s’effacent.
Cas 3 : Si dans la colonne « BA » j’écris « NON » comme aux lignes 18, 19 et 25 du fichier joint, il faudrait que dans la colonne AM ce qui est écrit s’efface.
La finalité de cette procédure est de pouvoir me permettre d’une manière automatique de supprimer les informations de la colonne « AM » des lignes pour lesquelles une modifications est intervenue de façon à pouvoir les reprendre (par un filtre par exemple) pour y ajouter de nouvelles informations.
Cordialement.
Bonjour,
A premièe vue, il me semble qu' à cause des cellules fusionnées ... tu te prépares des soucis de taille ...
surtout si chaque colonne a ses propres règles de fusion ...
Bonsoir,
il est vrai que les cellules fusionnées dans un tableau...
Voir fichier joint, si cela peut convenir :
@ bientôt
LouReeD
Bonjour,
une idée :
Dim celModif As Range
Set celModif = [G3] 'cellule détectée modifiée
' raz AM
Intersect(Columns("AM"), Cells(celModif.Row, 2).MergeArea.EntireRow).ClearContents
à intégrer là où tu détectes une modif, et dans la mesure où la fusion en B correspond toujours aux lignes concernée.
eric
Merci pour toutes ces réponses.
Pour LouReeD ta macro bug avec "Application.Undo".
Si les cellules fusionnées posent problèmes on peut adapter la macro pour quelle ne prenne pas les colonnes G et H c'est à dire sans le cas 1 de départ. Je ferais manuellement la modif dans la colonne "AM".
Pour eriiic, je ne comprends pas pourquoi tu me parles de la colonne B et je ne vois pas où j'intègre tes lignes de commandes. Je dois la mettre au début de la procédure ?
Cordialement.
Oui en effet, après le undo il faut remettre la nouvelle en place...(en surligné)
Dim r As Range, d, t, i&, derln&, Nouv_valeur, Anci_valeur, Modif As Boolean
derln = Range("A" & Rows.Count).End(xlUp).Row
Application.EnableEvents = False
' on récupère la nouvelle valeur
Nouv_valeur = Cells(Target.Row, Target.Column).Value
' on effectue un UNDO afin de récupérer l'ancienne valeur
Application.Undo
' on récupère l'ancienn valeur
Anci_valeur = Cells(Target.Row, Target.Column).Value
' si la nouvelle valeur est différente avec l'ancienne valeur, il y a eu modification, ou suppression de la valeur, on efface la valeur colonne AM
If Nouv_valeur <> Anci_valeur Then Modif = True
Target.Value = Nouv_valeur
'premier cas
If Not Intersect(Target, Range("G3:H" & derln)) Is Nothing And Modif = True Then
Range("AM" & Target.Row & ":AM" & Target.Row + Target.Rows.Count - 1).Value = ""
' deuxième cas
ElseIf Not Intersect(Target, Range("G3:H" & derln)) Is Nothing And Modif = True Then
Range("AM" & Target.Row & ":AM" & Target.Row + Target.Rows.Count - 1).Value = ""
' troisième cas
ElseIf Not Intersect(Target, Range("BA3:BA" & derln)) Is Nothing Then
If Nouv_valeur = "NON" Then Range("AM" & Target.Row & ":AM" & Target.Row + Target.Rows.Count - 1).Value = ""
End If
Application.EnableEvents = True
@ bientôt
LouReeD
Pour eriiic, je ne comprends pas pourquoi tu me parles de la colonne B
j'ai pris B comme j'aurais pu prendre G ou H qui présentent la même fusion.
J'avais compris que si tu avais une modif qui impactait un groupe de lignes (fusionnées dans une de ces colonnes) il fallait vider les même lignes en AM.
Si j'ai mal compris ce qui doit être le cas oublie.
et je ne vois pas où j'intègre tes lignes de commandes. Je dois la mettre au début de la procédure ?
Ben là où tu as détecté une modif comme j'ai dit.
Je n'ai pas regardé ton code, j'avais la flemme (et puis quelle idée de mettre une photo ?!? L'étape suivante c'est un microfilm ?
Comme loureed a l'air bien avancé je le laisse, c'était juste pour soumettre l'idée en passant et comme je pense être à coté...
eric
Bonjour,
Pour LouReeD :
Deux points :
1er point : J'ai ajouté la ligne de commande mais j'ai toujours le même bug (cf fichier joint) si je veux changer ou ajouter un nom par exemple. Par contre si je modifie la date de début ou de fin ça marche
2e point : Pourquoi tu as désactivé les lignes de commande ci-dessous ? Ces dernières (qui fonctionne correctement) me sont utile pour contrôler les dates de début et de fin surtout si je mets une date de début supérieur à une date de fin. Est-ce qui il y a un incident sur tes lignes de macro et ces dernières ?
Pour eriiic :
Oui tu avais bien compris quand tu dis "J'avais compris que si tu avais une modif qui impactait un groupe de lignes (fusionnées dans une de ces colonnes) il fallait vider les même lignes en AM".
Cordialement
Bonjour,
Oui tu avais bien compris quand tu dis "J'avais compris que si tu avais une modif qui impactait un groupe de lignes (fusionnées dans une de ces colonnes) il fallait vider les même lignes en AM".
reste que tu n'as pas dit ce que tu voulais si une modif a lieu sur une seule ligne du groupe (en L par exemple) et non sur une fusion (en G par exemple).
Raz de tous les AM de la fusion ou juste celui de la ligne ?
Si c'est juste celui de la ligne alors je vois le truc comme ça :
'G et/ou H et/ou de L à M et/ou lorsque dans la colonne « BA » j’écris « NON ».
If Not Intersect(Target, Union([G:H], [L:M])) Is Nothing Or (Target.Column = 53 And UCase(Target) = "NON") Then
Application.EnableEvents = False
Intersect(Columns("AM"), Target.MergeArea.EntireRow).ClearContents
Application.EnableEvents = True
End If
Sinon tu remplaces le ClearContents par la ligne que je te t'avais mise.
A mettre avant ou après tes autres tests selon le fonctionnement que tu veux.
eric
PS : je ne m'embête pas à contrôler si c'est une vraie modif ou une revalidation de la même valeur comme louread bien courageux
Salut eriic,
Pour répondre à ta question c’est les deux. Si la modif à lieu sur une ligne ou sur la date en G, les infos de AM doivent être RAZ et ce que font tes lignes de codes donc c’est super
1er problème : Lorsque je copie sur plusieurs lignes en L, M ou AM la macro bug
2e problème : le module « FusionsEtClassement » qui est lancé avec le bouton « Classement des dates débuts » fait buguer. Son rôle est de simplement classer les formations par ordre croissant de dates de début si éventuellement j’ai fait un changement.
3e problème : Après avoir réinitialisé la macro suite au bug ce qui marchait avant le bug ne fonctionne plus
Je te joins le nouveau fichier avec tes lignes de macros intégrées pour que tu puisses voir par toi-même.
Cordialement
Le pb c'est que je n'ai pas le temps de tout te faire...
Si tu as plusieurs traitements il faut les faire séparément
Je t'avais marqué : A mettre avant ou après tes autres tests selon le fonctionnement que tu veux.
Si tu les imbriques n'importe comment comme tu as fait et bien ça fait n'importe quoi.
1er problème : Lorsque je copie sur plusieurs lignes en L, M ou AM la macro bug
C'est normal.
Une macro prévue pour traiter une cellule n'est pas prévue pour en traiter plusieurs.
Si tu ne le signales pas on ne va pas faire le plus compliqué (ce qui serait sans fin de prévoir tout ce que tu n'as pas dit...)
2e problème : le module « FusionsEtClassement » qui est lancé avec le bouton « Classement des dates débuts » fait buguer. Son rôle est de simplement classer les formations par ordre croissant de dates de début si éventuellement j’ai fait un changement.
Pas anormal.
Si tu fais un tri il est inutile de contrôler les saisies puisqu'il n'y en a pas eu. Il faut désactiver les événements avant et rétablir ensuite (ou contrôler l'exécution ou non de la portion de macro avec une variable booléenne).
3e problème : Après avoir réinitialisé la macro suite au bug ce qui marchait avant le bug ne fonctionne plus
Plus lié au fait que tu ne maitrise pas tout qu'au 5 lignes que je t'ai fournies.
Et vu la précision : ce qui marchait avant que veux-tu que je te dise ? C'est faux, mon micro-onde marche toujours.
Vite fait une adaptation pour traiter toutes les cellules d'un collé :
Dim razAM As Boolean, c As Range
'G et/ou H et/ou de L à M et/ou lorsque dans la colonne « BA » j’écris « NON ».
For Each c In Target
razAM = Not Intersect(c, Union([G:H], [L:M])) Is Nothing
razAM = razAM Or (c.Column = 53 And UCase(c) = "NON")
If razAM Then
Application.EnableEvents = False
Intersect(Columns("AM"), c.MergeArea.EntireRow).ClearContents
Application.EnableEvents = True
End If
Next c
Je ne me suis préoccupé que de ta question. Alors stp ne tu testes que ça en désactivant tes autres lignes de code pour ne pas mélanger les problèmes.
Tu les réintègreras (mais avant ou après, pas au milieu) après avoir terminé tes tests et débogué cette partie.
Pas eu le temps de tester, je dois aller sur d'autres activités, désolé.
eric
Merci pour ta réponse. J'ai intégré tes nouvelles lignes de codes (correctement j'espère). Mais le problème est toujours là. Je te mets une copie des lignes au cas où. J'essayerai de nouveau plus tard.....on sait jamais. Enfin merci de tes réponses.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, d, t, i&, derln&
Dim razAM As Boolean, c As Range
derln = Range("A" & Rows.Count).End(xlUp).Row
'If Not Intersect(Target, Range("G3:H" & derln)) Is Nothing Then
'G et/ou H et/ou de L à M et/ou lorsque dans la colonne " BA " j'écris " NON ".
For Each c In Target
razAM = Not Intersect(c, Union([G:H], [L:M])) Is Nothing
razAM = razAM Or (c.Column = 53 And UCase(c) = "NON")
If razAM Then
Application.EnableEvents = False
Intersect(Columns("AM"), c.MergeArea.EntireRow).ClearContents
Application.EnableEvents = True
End If
Next c
If Not Intersect(Target, Union([G:H], [L:M])) Is Nothing Or (Target.Column = 53 And UCase(Target) = "NON") Then
Application.EnableEvents = False
Intersect(Columns("AM"), Target.MergeArea.EntireRow).ClearContents
For i = 3 To derln
If Range("G" & i) <> "" Then
If Not IsDate(Range("G" & i)) Or Not IsDate(Range("H" & i) + 1) Then
MsgBox "Date incorrecte à la ligne " & i, 16
Range("G" & i & ":H" & i).Select
Exit Sub
ElseIf Year(Range("G" & i)) < 1900 Or Year(Range("H" & i)) < 1900 Then
MsgBox "Saisie de date incorrecte à la ligne " & i, 16
Range("G" & i & ":H" & i).Select
Exit Sub
ElseIf Range("G" & i) > Range("H" & i) Then
MsgBox "Erreur de saisie à la ligne " & i & Chr(13) & _
"La date de début ne peut pas être postérieure à celle de fin.", 16
Range("G" & i & ":H" & i).Select
Exit Sub
End If
End If
Next i
Application.EnableEvents = True
End If
If Not Intersect(Target, Union([G:H], [L:M])) Is Nothing Or (Target.Column = 53 And UCase(Target) = "NON") Then
Application.EnableEvents = False
Intersect(Columns("AM"), Target.MergeArea.EntireRow).ClearContents
If Target.Row < 3 Or Target.Column < 11 Or (Target.Column > 14 And Target.Column < 19) Or Target.Column > 19 Then Exit Sub
d = Date: t = Time
For Each r In Target.Rows
If Me.Cells(r.Row, 12) <> "" Or Me.Cells(r.Row, 13) <> "" Or Me.Cells(r.Row, 14) <> "" Or Me.Cells(r.Row, 19) <> "" Then
Me.Cells(r.Row, 33).Value = d
Me.Cells(r.Row, 34).Value = t
Else
Me.Cells(r.Row, 33).Resize(, 2).ClearContents
End If
Next r
Application.EnableEvents = True
End If
End Sub
Cordialement.
Mais le problème est toujours là
Lequel ? il y en avait tellement de cités
Et n'oublie pas de désactiver les événements quand ce n'est pas nécessaire de superviser les modifs.
Comme je l'ai fait avec Application.EnableEvents = False juste avant d'effacer AM, et à rétablir tout de suite après.
Si ta macro modifie la feuille (tris, écritures), elle n'est pas sensée y apporter des bêtises ou alors c'est que tu t'es trompé dans le code. Donc tu désactives le temps de l'opération. Ca te fera toujours des anomalies en moins à chercher.