Coller des valeurs automatiquement

Accueil – Le CFO masqué Forums Excel Coller des valeurs automatiquement

10 sujets de 1 à 10 (sur un total de 10)
  • Auteur
    Articles
  • #8023
    monarc
    Participant

    Bonjour,

    Je travaille sur un fichier dans lequel des % doivent être entrés. Les % entrés dans les cellules sont mis à jour à quelques reprises. Je dois garder une “trace” dans une autre cellule de la feuille si le % entré baisse en bas de 50%. Je ne peux pas utiliser une formule puisqu’elle se mettra à jour lorsqu’un autre % sera entré dans la même cellule. Ce fichier sera utilisé par plusieurs personnes sur des ordinateurs différents.

    J’ai essayé d’utiliser la macro intégrée dans Excel 2013 Private Sub Worksheet_Change(ByVal Target As Range) pour copier/coller la valeur de la cellule si elle baisse en bas de 50% :

    If ActiveCell > 0 And ActiveCell < 0.5 Then
    ActiveCell.Copy
    ActiveCell.Offset(0, 3).Select
    ActiveCell.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Application.CutCopyMode = False
    End If

    Quand l’utilisateur entre un % en bas de 50%, ça doit copier/coller la valeur dans une autre cellule sur la même ligne, 3 colonnes plus à droite que la cellule active (Offset (0, 3)).

    Le problème c’est que ça fonctionne seulement si on clique sur le crochet pour terminer l’opération; quand on fait Enter ou Tab ou Clic dans une autre cellule, rien ne se copie ou ça copie la mauvaise donnée, puisque la cellule active n’est plus la même! Comme il y a une multitude de cellule un peu partout qui doivent contenir un %, je ne peux pas mettre toutes les adresses des cellules dans les codes.

    Est-ce qu’il y a quelqu’un qui peut me proposer une solution afin que ce code s’exécute peu importe si on fait Enter, Tab, Clic?

    Merci!

    #8024
    guillaume
    Participant

    Bonjour,

     

    Te serait il possible de télécharger le fichier ?

     

    Cordialement

    #8025
    Marc
    Participant

    Bonjour,

    Lorsque vous faites Enter, Tab ou un clic dans une autre cellule, ActiveCell correspond à la cellule dans laquelle vous êtes positionné et non plus celle ou la saisie a été effectuée.

    Essayez de remplacer ActiveCell par Cells(Target.Row, Target.Column).

    Par ailleurs il faut désactiver le Worksheet_Change avant de copier la valeur, sinon le traitement va rentrer dans une boucle infinie. Vous trouverez ci-dessous un exemple de code :

    Application.EnableEvents = False

    If Cells(Target.Row, Target.Column) > 0 And Cells(Target.Row, Target.Column) < 0.5 Then

    Cells(Target.Row, Target.Column + 3) = Cells(Target.Row, Target.Column)

    End If

    Application.EnableEvents = True

    #8027
    monarc
    Participant

    Merci Marc pour la solution que vous me proposez. Ça fonctionne bien avec ces codes. C’est super!

    Par contre, il semble qu’à un moment donné, ça ne fonctionne plus et je dois fermer et rouvrir Excel pour que ça recommence à fonctionner. Peut-être parce que je fais des tests dans les codes et lorsque je fais une erreur de code, le débogueur m’affiche la fenêtre d’erreur et ça arrête de fonctionner???

    Je vais continuer à tester mon fichier original avant de le distribuer puisqu’il faut qu’il soit fonctionnel et sans erreur!!!

    J’ai joins le fichier que j’ai monté pour faire des tests. Ceci en réponse à Guillaume. Il est tout simple mais représente ce que je veux comme résultat.

    Merci encore!

    Attachments:
    You must be logged in to view attached files.
    #8029
    guillaume
    Participant

    Bonjour,

    Merci d’avoir mis le fichier, j’aurai fait exactement pareil Marc, peut être pas avec la même syntaxe (je débute…) mais dans le même esprit

    J’ai juste ajouté une condition que le changement ai eu lieu dans la première colonne dans ton fichier, pour ne pas qu’il colle des infos partout

    :

    Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Target.Column = 1 Then

    If Cells(Target.Row, Target.Column) > 0 And Cells(Target.Row, Target.Column) < 0.5 Then

    Cells(Target.Row, Target.Column + 3) = Cells(Target.Row, Target.Column)

    End If

    End If

    Application.EnableEvents = True

    End Sub

    Attachments:
    You must be logged in to view attached files.
    #8093
    monarc
    Participant

    Merci Guillaume!

    Ce fichier est seulement un petit exemple, les données sont réparties un peu partout dans mon fichier original. Je garde quand même en mémoire ta solution qui pourra peut-être me servir dans un autre fichier semblable.

    Merci encore!

    #8096
    Marc
    Participant

    Bonjour,

    Concernant votre remarque “ça ne fonctionne plus et je dois fermer et rouvrir Excel” :

    Dans le code VBA, les instructions “Application.EnableEvents = False” (désactivation des événements) et “Application.EnableEvents = True” (réactivation des événements) ont été rajoutées. En effet, si nous ne l’avions pas fait, en saisissant un taux < à 50 % dans une première cellule, la macro aurait collé cette valeur dans une seconde cellule. Mais comme cette seconde cellule est alors également modifiée, la macro aurait collé la valeur de la seconde cellule dans une troisième cellule… La macro serait rentrée dans une boucle infinie.

    Lorsque vous avez eu un plantage (le debogueur s’étant ouvert), je pense que le plantage s’est produit entre ces deux instructions. Les événements ont été désactivés, mais n’ont pas dû être réactivés (traitement de la macro s’étant s’arrêté avant d’arriver à l’instruction “Application.EnableEvents = True”).

    Ainsi, même en réinitialisant la macro après le bug, la feuille excel ne va plus détecter les événements, du moins jusqu’à ce que Application.EnableEvents soit repassée à True. Pour corriger cela, il faut soit fermer et réouvrir excel, soit prévoir une macro de secours comportant uniquement cette instruction “Application.EnableEvents = True” (cette macro de secours devant être lancée à la main lorsqu’il y a un plantage).

    En espérant avoir été clair 🙂

    • Cette réponse a été modifiée le il y a 6 années et 4 mois par Marc.
    • Cette réponse a été modifiée le il y a 6 années et 4 mois par Marc.
    #8100
    monarc
    Participant

    Si je modifiais les codes comme ci-dessous, Est-ce que ça pourrait empêcher l’arrêt de l’exécution du IF?

    Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    On Error GoTo Erreur

    If Cells(Target.Row, Target.Column) > 0 And Cells(Target.Row, Target.Column) < 0.6 Then

    Cells(Target.Row, Target.Column + 3) = Cells(Target.Row, Target.Column)

    End If

    Erreur:

    Application.EnableEvents = True

    End Sub

    #8103
    Marc
    Participant

    Effectivement, en rajoutant l’instruction “On Erreur Go To Erreur”, en cas de plantage, la macro ne s’arrête pas et les événements vont être réactivés.

    On peut faire le test en changeant la ligne “Cells(Target.Row, Target.Column + 3)= …” : en mettant -3 au lieu de +3. Si on modifie une cellule de la première colonne, le traitement plante, car la colonne -2 n’existe pas.

    Avec l’instruction “On erreur…”, le traitement ne s’arrête plus et à la saisie suivante, la macro continue à s’exécuter.

    • Cette réponse a été modifiée le il y a 6 années et 4 mois par Marc.
    #8105
    monarc
    Participant

    Bonjour Marc!

    J’ai fait le test et effectivement si je mets -3 dans les codes, rien ne bloque et quand je le remets à +3 tout fonctionne à nouveau.

    Merci beaucoup de ton aide très précieuse.

    Je peux donc considérer ma question comme Résolue!

10 sujets de 1 à 10 (sur un total de 10)
  • Vous devez être connecté pour répondre à ce sujet.