VBA-Renseignement automatique de date de création d'1 ligne

Bonjour, bonjour,

Je travaille sur l’automatisation d’un fichier Excel grâce à VBA sous Excel 2010. Je precise être novice.^^ Ce fichier compile des sujets (lignes) avec différents critères (colonnes) dont certains évoluent dans le temps. Ce fichier est utilisé par plusieurs usagers spécialistes.

Ma problématique est la suivante : je voudrais qu'en colonne A soit implémentée automatiquement les dates de dernière modification de lignes, et en colonne B, les dates de creation de lignes, quelque soit la cellule de la ligne renseignée en premier lieu.

Ci-dessous, mon code actuel qui fonctionne très bien pour la colonne A de date de mise à jour, mais moins bien pour la colonne B de date de creation... Je m'explique: quand je fais "insérer" une nouvelle ligne, la date de creation et la date de MàJ aussi se update, et c'est très bien ! Par contre si j'ajoute en dessous de ma dernière ligne remplie ma nouvelle ligne donc, la date de modif se met à jour en A mais pas la date de creation en B... Je voudrais que dans cette 2ème façon d'ajouter une ligne, ma cellule en colonne B renseigne aussi la date du jour.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

'Column B is autofilled with date of addition of a new row
Dim changement As Boolean
    If Target.Rows(1).Cells.Count = Columns.Count Then changement = True
    If Target.Columns(1).Cells.Count = Rows.Count Then changement = True
    If changement = True Then
Range("B" & Target.Row).Value = Date
    End If
'Column A is autofilled with the date of the row last update
    If Target.Row > 2 Then
Application.EnableEvents = False
Cells(Target.Row, "A").Value = Date
Application.EnableEvents = True
    End If
End Sub

Pour plus de clarté, je vous joins un printscreen du rendu sur le feuillet concerné. Sont surlignées en jaune les 2 lignes ajoutées.

Merci par avance !

Dianex87

automatic dates

Bonjour,

Suggestion :

Sub Annuler()
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim chg As Boolean, nw As Boolean, n%
    If Target.Row < 3 Then Exit Sub
    If Not Intersect(Target, Me.Columns("A:B")) Is Nothing Then Annuler: Exit Sub
    If Target.Rows.Count > 1 Then Annuler: Exit Sub
    n = Target.Row
    If Me.Range("B" & n) = "" Then nw = True
    If Me.Range("A" & n) <> Date Then chg = True
    If chg Or nw Then
        Application.EnableEvents = False
        If chg Then Me.Range("A" & n) = Date
        If nw Then Me.Range("B" & n) = Date
        Application.EnableEvents = True
    End If
End Sub

Cordialement.

Bonjour MFerrand,

Merci de votre aide.

Je viens de l'essayer: désormais ça fonctionne si creation d'une ligne en toute fin du listing, en colonnes A (modification) et B (creation) la date du jour est renseignée mais "Insert" ne marche plus du tout. La ligne est créée et apparait très brièvement à l'écran puis elle disparait...

Sauriez-vous SVP ce qui bloque?

Bon à coté de ça, je dois avouer que ce code m'est assez difficile à comprendre... Si vous pouviez me l'expliciter, ce serait top!

Merci encore!

OUI !

Relis ma macro !

J'ai trouvé que la tienne avait quelques aspects alambiqués et avait des trous de sécurité par rapport à tes spécifications...

Donc elle simplifie les choses :

Une seule ligne doit être concernée, et on ne peut toucher aux colonnes A et B...

Et en même temps on teste pour ne pas multiplier les inscriptions identiques : la date de création n'est inscrite qu'une seule fois, définitivement, la date de modif peut l'être une fois par jour...

Evidemment, si tu insères une ligne, tu touches aux colonnes A et B et ton opération est annulée !

Je déconseille de toucher à ce verrou car c'est ce qui garantit qu'on ne peut bricoler les dates...

Il faut savoir ce que tu entends précisément par insérer :

  • Insertion d'une ligne vide au milieu des données existantes
  • Insertion à la fin
  • Insertion d'une ligne préremplie
...

Il faudra simplement prévoir une procédure d'insertion, qui fera ce que tu souhaites exactement faire.

De même certaines opérérations sur tes données risquent de nécessiter des procédures.

(Les procédures interrompront l'interception des évènements durant la réalisation des opérations...)

Cordialement.

MFerrand a écrit :

OUI !

Relis ma macro !

Oui, d'accord mais moi quand meme pas bien la comprendre. je suis une novice ++

J'ai trouvé que la tienne avait quelques aspects alambiqués et avait des trous de sécurité par rapport à tes spécifications...

Donc elle simplifie les choses :

Une seule ligne doit être concernée, et on ne peut toucher aux colonnes A et B...

Et en même temps on teste pour ne pas multiplier les inscriptions identiques : la date de création n'est inscrite qu'une seule fois, définitivement, la date de modif peut l'être une fois par jour...

Oui, exact. Même si le spécialiste peut revenir plusieurs fois sur son sujet dans la meme journée. Mais effectivement la date de last update en colonne A ne changera pas sur le meme jour. Obviously

Evidemment, si tu insères une ligne, tu touches aux colonnes A et B et ton opération est annulée !

Je déconseille de toucher à ce verrou car c'est ce qui garantit qu'on ne peut bricoler les dates...

Il faut savoir ce que tu entends précisément par insérer :

- Insertion d'une ligne vide au milieu des données existantes

  • Insertion à la fin
  • Insertion d'une ligne préremplie
...

Le fichier est rempli par plusieurs personnes, et je n'ai aucun moyen de savoir si en ajoutant un nouveau sujet/ligne ils vont faire "Insert" CAD insérer une ligne vide au milieu de données existantes ou ajouter une ligne à la fin. C'est pour cela que je souhaite que l'ajout de la date de creation en colonne B se fasse dans les 2 cas.

Il faudra simplement prévoir une procédure d'insertion, qui fera ce que tu souhaites exactement faire.

De même certaines opérérations sur tes données risquent de nécessiter des procédures.

(Les procédures interrompront l'interception des évènements durant la réalisation des opérations...)

Cordialement.

Bonjour,

Voilà une procédure d'insertion. Elle insèrera une ligne sur la position du curseur.

Sub InserLigne()
    Dim n%
    n = ActiveCell.Row
    If n < 3 Then Exit Sub
    Application.EnableEvents = False
    ActiveSheet.Rows(n).Insert
    Application.EnableEvents = True
End Sub

Il te suffit de la rattacher à un bouton...

Cordialement.

Nickel, merci bcp !

Rechercher des sujets similaires à "vba renseignement automatique date creation ligne"