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 » . Je n’arrive pas à trouver comment modifier la macro « Private Sub Worksheet_Change(ByVal Target As Range) » située dans « Feuil2 (liste AF à compléter par DATES) du fichier joint pour qu’elle m’efface ce qui est écrit dans la colonne « AM » lorsque j’effectue un changement dans les colonnes G et/ou H et/ou de L à M et/ou lorsque dans la colonne « BA » j’écris « NON ».

worksheet change

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 ? ) , mais j'ai supposé que vu le paquet de lignes que tu as dans Change c'est ce que tu y fais...

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

msg erreur

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 ?

sans titre3

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 Si c'est ton besoin faire une compile des deux.

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 . Cependant je rencontre trois « petits » problèmes surement liés.

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

msg erreur eriic

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.

Rechercher des sujets similaires à "modification automatique"