Microsoft 365 Créer une macro qui fonctionne avec un Copié Collé

Pernin

XLDnaute Nouveau
Bonjour,
j'ai une macro qui me permet d'incrémenter une clé unique en utilisant la date et l'heure du moment où une cellule est remplie.

Voici le code :

Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next
If Not Intersect(Target, [C1:C1000]) Is Nothing Then
Target(1, 0) = Format(Now(), "#,##0.00000")
Target(1, 19) = "Nouveau"
End If
End Sub

Il fonctionne parfaitement, sauf lorsque je réalise un copié collé de plusieurs lignes. Il ne s'active que sur la première ligne.

J'aimerai savoir si vous aviez une inspiration pour appliquer la macro sur toutes les lignes, et non pas juste la première en cas de copié collé de ligne s'il vous plaît.

Merci pour votre temps.

Passez une excellente journée.

CRDLT

Pernin Grégoire
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Oui, sans doute une boucle sur chaque cellule contenue dans TARGET si c'est réellement ce que vous voulez, car lorsque vous copiez/collez normalement vos lignes devraient déjà avoir leur identifiant.

Target représente la plage de cellules modifiées.

N'oubliez pas non plus d’inhiber l'évènement Change à bon escient lorsque vous CHANGEZ quelque chose dans la feuille qui contient l'évènement. Sinon l'évènement s'appelle lui-même en boucle.

De plus le On Error resume next n'est pas d'une utilité flagrante ici mis à part celle de cacher des erreurs de programmation.

Si vous ne produisez pas plus d'un élément à la seconde vous pouvez pour des raisons de lisisbilité et de praticité de l'identifiant mettre un format tel que Format(Now(),"YYYYmmddhhnnss") qui vous donne un texte comme : "20220628163951" 4 chiffres pour l'année et 2 pour mois, 2 pour jours, 2 pour heure, 2 pour minute et 2 pour seconde. Vous pouvez rajouter des tirets égalements.

Code:
  Application.EnableEvents = False 'Inhiber la gestion des évènements

   For each c in Target.Columns(1) 'Pour chaque cellule de la première colonne de target.
        'Je fais ici ce qu'il y a à faire

   Next c

Application.EnableEvents = True

Cordialement

Oups! pas vu la venue du fichier...arf
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voici une proposition :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

  Dim c As Range, t As Double
    If Not Intersect(Target, [C1:C1000]) Is Nothing Then
    Application.EnableEvents = False
        t = Now
        For Each c In Target
            t = t + 1 / 10000 ' Peut être placé après la ligne ci-dessous
            c(1, 0) = Format(t, "#,##0.00000")
         c(1, 2) = "Nouveau"
        Next c
    Application.EnableEvents = True
    End If
End Sub
Cordialement
 

Pièces jointes

  • XLDL 28.06.2022.xlsm
    21.4 KB · Affichages: 3

Pernin

XLDnaute Nouveau
Re,

Voici une proposition :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

  Dim c As Range, t As Double
    If Not Intersect(Target, [C1:C1000]) Is Nothing Then
    Application.EnableEvents = False
        t = Now
        For Each c In Target
            t = t + 1 / 10000 ' Peut être placé après la ligne ci-dessous
            c(1, 0) = Format(t, "#,##0.00000")

[/QUOTE]
Salut, je te remercie sincèrement pour cette solution, tu m'enlèves une belle épine du pied ! :) 
je te souhaite de passer une très agréable journée !
 

Discussions similaires

Statistiques des forums

Discussions
312 182
Messages
2 086 001
Membres
103 084
dernier inscrit
Hervé30120