Coller une formule dans une cellule quand modification d'une autre cellule

Signaler
Messages postés
4
Date d'inscription
vendredi 7 janvier 2011
Statut
Membre
Dernière intervention
8 janvier 2011
-
Messages postés
4
Date d'inscription
vendredi 7 janvier 2011
Statut
Membre
Dernière intervention
8 janvier 2011
-
Etant complètement débutant en VBA et programmation en général, je fais appel aux membres de ce forum qui me semblent être très opérationnel.

J'explique mon cas :

J'ai conçu un tableau permettant d'organiser son temps de travail, dont vous verrez une partie dans l'image ci-dessous.



Chaque cellule de la plage D12:D42 contient une liste déroulante comme celle que vous voyez en D31. Si l'utilisateur fait appel à cette liste pour motiver son absence, la cellule de la même ligne dans la colonne M (qui contient une formule dont une copie est faite en M4) affichera une valeur correspondant au nombre d'heure travaillée (ex: 0 pour "Maladie", 10 pour "Mission>100km", 0 pour jour "Férié", etc...)

Si l'utilistateur du tableau compte travailler le 4 janvier par exemple, il rentre manuellement en M15 le nombre d'heure qu'il effectuera. Par contre cela écrase la formule.

Si il décide pour une raison quelconque (erreur, ou changement dans la planification) de modifier la cellule D15 pour renseigner un motif d'absence, M15 n'affichera plus le nombre correct d'heure puisque la formule aura été écrasée.

La macro que je souhaiterais utiliser, devrait copier automatiquement la formule sauvegardée en $M$4 dès qu'une modification intervient sur une cellule de la plage D12:D42 et la coller (uniquement la formule, pas le format) dans la cellule correspondante de la plage M12:M42.


J'ai cherché avec google, sur les forums, si des cas de figures similaires avait déjà été traité et si je pouvais m'inspirer des solutions proposées, mais je n'ai rien trouvé qui m'a aider.

Le genre de macro que je recherche est-elle réalisable et si oui, auriez-vous une solution à me proposer ?

Je m'occuperai ensuite de reproduire cette macro pour l'adapter aux 11 autres mois de l'année qui sont à la suite sur la même feuille.

Merci beaucoup d'avance pour votre aide.

Pour info, la formule sauvegardée en M4 est :

SI(OU(C47;C4=6;D4="Férié";D4="MALADIE";D4="CP";D4="RTT";D4="RTT Mois";D4="Décès");0;SI(D4="Form Pro";7;SI(D4="Mission>100km";10;"")))

5 réponses

Messages postés
31506
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
344
Bonjour,

1 - Pour detecter la modification d'une cellule, regardes du côtes de :
Worksheet_Change
Par exemple: dans le VBE, sur l'un de tes objets feuil, entre le code :
Private Sub Worksheet_Change(ByVal Target As Range)
'Se declenche quand une feuille est modifiée.
'Target contient les coordonnées et la valeur de la cellule modifiée
'------------------------
'Exemple :
MsgBox "La cellule : " & Target.Address & " a désormais la valeur : " & Target.Value

End Sub



2 - Pour recopier une formule, je te laisse un peu chercher.. mais regardes du côté de :
FormulaLocal, ou encore FormulaR1C1
Exemple :
Range("B1").FormulaLocal = "=SOMME(A1:A2)"


Sinon tu peux aussi passer par l'enregistrement d'une Macro en copiant puis collage spécial de ta cellule M4 (en choisissant formule). Cela te donnera le code à utiliser.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
4
Date d'inscription
vendredi 7 janvier 2011
Statut
Membre
Dernière intervention
8 janvier 2011

Merci pour ta réponse super rapide jordane45. Je comprend certaines parties de ta réponse (comme le fait d'utiliser Private Sub Worksheet_Change(ByVal Target As Range) puisqu'une modification de la feuille initialise la macro) mais appraît de je comprend pas trop.

Est-il possible d'éviter la msgbox et de procéder de manière "automatique et invisible" au copier($M$4)/coller vers cellule concerné ?

Sur une échelle du débutant à l'expert, le débutant étant à 0 et l'expert à 10, je suis à -1. Je vais chercher comment je peux utiliser ta réponse, mais un coup de main supplémentaire serait très apprécié.
Messages postés
31506
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
344
Bonjour,
La MSGBOX n'est là qu'à titre d'exemple pour te montrer ce que l'on peut récuperer avec le "Target".
(il existe d'autres possibilités.. tu n'as qu'à taper 'Target.' et regarder ce qu'il te propose.
Par exemple: target.row te donnera le N° de ligne du changement.. .column, le N° de colonne.. etc..

pour commencer à apprendre le VBA, tu peux regarder ce site : Scribd.com
Il en existe d'autres... recherches sur le net.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
4
Date d'inscription
vendredi 7 janvier 2011
Statut
Membre
Dernière intervention
8 janvier 2011

Merci pour ton aide Jordan, c'est très intéressant et grâce à tes conseils et au lien que tu m'as fourni j'ai réussi à créer une macro qui fonctionnent. Peut-être peut-elle est améliorée. Quoiqu'il en soit ça marche !

La voici :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 4 Then

Range("m4").Copy

ActiveCell.Offset(0, 9).PasteSpecial (xlPasteFormulas)
ActiveCell.Offset(0, -9).Select

Application.CutCopyMode = False

End If

End Sub

Maintenant ce que je cherche à faire c'est une macro qui verrouillerait les cellules du weekend de la colonne M pour empêcher la saisie d'heures dans ces cellules. Pour info, la colonne C qui est masquée, contient une formule qui affiche le numéro de la semaine, soit 6 pour le samedi et 7 pour le dimanche. Cela peut-il aider pour la conception de la macro.

Comment vous y prendriez-vous ?

Merci
Messages postés
4
Date d'inscription
vendredi 7 janvier 2011
Statut
Membre
Dernière intervention
8 janvier 2011

J'ai oublié de préciser également que la feuille est protégée, par mot de passe, dans sa version distribuée aux utilisateurs, que les cellules de la colonne M se colore en jaune quand weekend ou jour férié (en utilisant la mise en forme conditionnelle)