Msgbox ou pas selon valeur d'une autre cellule

Résolu
Bonjour,

J'ai mis au point un MsgBox qui lors de la modification du contenu d'une cellule, demande si OUI ou NON on souhaite mettre à jour la date de modification de la ligne dans la colonne prévue à cet effet.

En gros quand je modifie le renseignement de la colonne "I", un MsgBox apparait me demandant si je veux bien mettre à jour la date de modification. Si je fais "OUI", la date du jour sera insérée dans la colonne "J" de cette ligne courante, et si je met "NON", rien ne se passe !

Jusqu'à là c'est parfait !!!

Cependant, il m'arrive de devoir modifier plusieurs fois les renseignements d'une ligne contenant déjà la date du jour, et j'aimerai que lorsque la date de modification est déjà celle du jour, le Msgbox ne propose pas de modifier la date (étant donné qu'elle l'est déjà).....

Ci-dessous, mon code VBA :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("I2:I20")) Is Nothing Then
If MsgBox("Voulez-vous mettre à jour la date?", vbYesNo + vbInformation, "Confirmer SVP...") = vbYes Then
Target.Activate
Range("J" & (ActiveCell.Row)) = Cells(1, 1).Value
End If
End If
End Sub


Le problème c'est que je ne sais pas trop où et comment je dois formuler mon code... afin qu'avant de me proposer le MsgBox après édition de la cellule à renseigner il analyse la donnée courante dans la cellule de la date pour voir qu'elle est déjà celle du jour et dans ce cas là, ne me propose plus de modifier la date.

Un peu tordu comme explication, désolé ;-)

...Pourtant ca m'a pas l'air sorcier comme macro mais je n'y parviens pas.... =(

Merci d'avance de votre aide et vos conseils

meaurysse

4 réponses

  1. Bonjour,

    Si j'ai bien compris (si la date en J est différente de celle en A1 on propose la modification, sinon non ), essaie :

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("I2:I20")) Is Nothing and Range("J" & (ActiveCell.Row)) <> Cells(1, 1).Value Then
    ' le reste sans changement


    Cdlmnt
    Via
    1
    1. Bonjour

      Peut être comme ça

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim li As Long
      If Not Intersect(Target, Range("I2:I20")) Is Nothing Then
      li = Target.Row
      If Range("J" & li).Value <> Date Then
      If MsgBox("Voulez-vous mettre à jour la date?", vbYesNo + vbInformation, "Confirmer SVP...") = vbYes Then
      Range("J" & li) = Date
      End If
      End If
      End If
      End Sub

      Cdlmnt
      1
      1. Salut ccm81

        Merci c'est EXACTEMENT ce que je voulais !!! =D Par contre, je n'aurai jamais su comment faire... sans ton aide =/

        Pourrais-tu m'expliquer l'histoire des "DIM"? Et à quoi cela sert exactement?
        0
    2. Re,

      Dim est une instruction qui sert à déclarer les variables utilisées et à leur attribuer un type.
      Ici, j'ai déclaré la variable li de type long (entier de -2 147 483 648 à -2 147 483 647) qui va récupérer la ligne de la cellule cliquée
      C'est une bonne habitude à prendre, ça peut éviter pas mal d'erreurs, en particulier dues à des fautes de frappe.
      Si en début de module du mets la directive
      Option explicit
      ça t'oblige à déclarer toutes les variables utilisées dans ce module.

      PS. Si c'est fini, peux tu mettre le sujet à résolu (en dessous du titre de ton premier message)

      Bonne suite
      1
      1. Ok alors en gros tu défini un mot genre "cc" "li" ou "zz" (peu importe en fait) et tu défini ce que c'est pour ensuite n'avoir plus qu'à indiquer le "zz" qui est reconnu par sa signification dans la formule? :)

        C'est un raccourci simplement?

        Sinon, où et comment avez-vous appris tout ça?

        Moi je découvre petit à petit et commence un peu à comprendre comment ca marche le VBA mais c'est quand même super complexe quand on veut faire quelque chose... Je veux dire, on y arrive pas par intuition... il faut le savoir.
        0
    3. Une variable est définie par un identifiant (un nom si tu veux), si possible qui évoque le rôle joué par cette variable (j'ai mis li pour ligne) et un type de donnée (entier, texte, booléen, date, tableau, .... Elle va recevoir une valeur (li = Target.Row) qui pourra être utilisé une ou plusieurs fois par la suite ( Range("J" & li).Value ...)
      La notion de variable est incontournable en programmation, tu as de nombreux sites dans lesquels tu pourras trouver des tutos. (par exemple https://vb.developpez.com/cours/?page=vba

      Bon courage
      0