Modification d'un code VBA
Bonjour,
Avec l’aide de Dan_de_pic, j’ai placé un code qui contrôle - lors de la modification du sexe en C4-D4 - si la cellule C5 est vide et si le montant en CN352 est égal à zéro ou s’il n’est pas modifié par ce changement. Dans un tel cas, rien ne se passe.
Par contre, si les conditions ci-dessus ne sont pas remplies et que la modification du sexe entraine une modification du chiffre en CN352, une MsgBox informe l’utilisateur du nouveau montant calculé en CN352 et lui demande s’il veut remplacer ou non le chiffre présent en C5 par cette nouvelle valeur.
A l’utilisation, je me suis rendu compte qu’il faudrait que cette MsgBox apparaisse en plus - toujours à condition que la cellule C5 ne soit pas vide, que le montant en CN352 ne soit pas zéro et que le chiffre en CN352 serait ainsi changé - lorsque les cellules C2 ou C3 sont modifiées.
Pouvez-vous m’aider à modifier ce code à cet effet ?
https://www.excel-pratique.com/~files/doc2/Demo20091007.zip
Bonne journée.
Au format 2003 t'aurait peut-être plus de réponses...
A+
Mais bon sang, mais c'est bien sûr ! Voici mon fichier au format xls.
https://www.excel-pratique.com/~files/doc2/c1QYTDemo20091007.zip
bonjour,
Peux-tu tester ça :
''Option Explicit
Dim Flag As Byte
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("C2, C3, C6, C7")) Is Nothing Then
Z = Target.Address
Application.EnableEvents = False
Select Case Z
Case "$C$2": Flag = 1
Case "$C$3": Flag = 2
Case "$C$6": Range("C7").Formula = "=IF(YEAR(R8C3)<=2004,IF(R6C3<=R9C3,0,MIN(MAX(R9C3/8,R6C3-R9C3),2*R9C3)),IF(R6C3<3*R9C3/4,0,MIN(MAX(R9C3/8,R6C3-(7*R9C3/8)),17*R9C3/8)))"
Case "$C$7": Range("C6") = ""
End Select
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Calculate()
' Proposition de Dan_de_pic
' Cette macro est activée dans les conditions ci-dessous :
' "Cet événement se produit après le recalcul de la feuille de calcul, pour l'objet Worksheet."
Static memo As Variant ' Définition de la variable avec mémorisation permanente
If memo = Empty Then ' Si la variable n'a pas encore été initialisée ...
memo = Range("C4").Value ' ... on mémorise le sexe en C4.
ElseIf memo <> Range("C4").Value Then ' Si le sexe a changé, on va voir ce qui est inscrit en C5 et en CN352.
memo = Range("C4") ' On mémorise d'abord le sexe.
If Range("C5").Value <> "" And Range("CN352").Value <> 0 And Range("C5").Value <> Range("CN352").Value Then
''''' On contrôle que les cellules C5 et CN352 ne soient pas vides ni identiques l'une et l'autre
''''' Dans ce cas on demande s'il faut faire le remplacement.
Réponse = MsgBox("Comme le sexe a été changé, le capital lors de l'invalidité" _
& vbNewLine & "en CN352 a été recalculé et se monte à CHF " & Format(Range("CN352").Value, "#'###.00") _
& vbNewLine & "" & vbNewLine & "Voulez-vous remplacer le montant en C5 par ce nouveau montant ? ", _
vbYesNo, "Capital lors de l'invalidité")
' En cas de réponse positive, on effectue le remplacement.
If Réponse = vbYes Then Range("C5").Value = Range("CN352").Value
End If
ElseIf Flag > 0 Then
If Range("C5").Value <> "" And Range("CN352").Value <> 0 And Range("C5").Value <> Range("CN352").Value Then
Flag = 0
Réponse = MsgBox("blabla")
If Réponse = vbYes Then Range("C5").Value = Range("CN352").Value
End If
End If
End SubNota : Il manque quelques sécurités au niveau de la saisie en C2,C3 il faudrait peut-être vérifier la cohérence de la saisie, que la cellule n'est pas vide, etc... mais d'une manière générale est-ce que ma construction fonctionne comme tu l'attendais ?
A+
Salut Galopin,
Merci infiniment pour ton aide. Je pense que ta solution s’approche du résultat voulu, mais il y a encore quelques problèmes.
1) Tout d’abord je n’ai pas pensé d’expliquer que mon message d’erreur doit encore être modifié en fonction des corrections désirées pour ce code, mais qu’il ne doit y en avoir qu’un seul qui apparaisse dans tous les cas, alors que tu en proposes un deuxième « blabla ».
Le seul texte qui devrait être affiché serait quelque chose du genre : « Comme vous avez modifié les données nécessaires au calcul du capital lors de l'invalidité en CN352, celui-ci a été recalculé et se monte actuellement à CHF xxxxxx. Voulez-vous remplacer le montant en C5 par ce nouveau montant ? ».
Autrement il me semble que ton message d’erreur « blabla » est apparu à chaque fois que c’était nécessaire, à une exception près :
2) Si je vide au préalable toutes les cellules en jaune et en vert (C2, C3, C5 à C7, CD299 à CD302, CF300 à CF302) à l’exception de l’indication du sexe en C4 (en fait comme se présente le fichier à disposition des utilisateurs et comme je le présente ci-dessous) et que je commence à remplir les cellules C2 (J’indique entre parenthèse des exemples, puisque tout n’est pas possible, alors en C2 inscrivons le 01.01.2005), C3 (1.1.1958), C5 (10'000) puis que je clique - d'une manière illogique, puisque le capital lors de l'invalidité a déjà été indiqué en C5 - sur le bouton "Si nécessaire, calcul du capital lors de l’invalidité" et que je continue à remplir CD299 (01.01.1985), CD300 (50'000) et CF300 (1987), ton message « blabla » apparaît, apparemment car le chiffre en CN352 a été modifié.
Mais alors pourquoi ton message n’apparaît plus si je modifie par exemple CD300 (100'000) alors que CN352 a également été modifié dans ce cas ?
https://www.excel-pratique.com/~files/doc2/Demo20091010.zip
En fait la situation décrite au point 2 ci-dessus n’avait pas été ni prévue, ni indiquée dans mon premier exposé et le fait de trouver une solution m’importe moins – puisque c’est en utilisant ce fichier d’une manière presque illogique que cette situation apparait - que d’en trouver une au problème indiqué au point 1. J’en parle uniquement car j’ai constaté ce fait et que je ne sais pas si la solution est toute simple. MAIS NE PERD SURTOUT PAS TON CALME RESOUDRE LE POINT 2.
Bonne soirée.
bonjour,
Mais alors pourquoi ton message n’apparaît plus si je modifie par exemple CD300
Ben... parce que tu ne l'as pas demandé !
la situation décrite au point 2 ci-dessus n’avait pas été ni prévue, ni indiquée...
La solution avec message unique et CD300
''Option Explicit
Dim Flag As Byte
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("C2, C3, C6, C7")) Is Nothing Then
Z = Target.Address
Application.EnableEvents = False
Select Case Z
Case "$C$2": Flag = 1
Case "$C$3": Flag = 1
Case "$C$4": Flag = 1
Case "$CD$300": Flag = 1
Case "$C$6": Range("C7").Formula = "=IF(YEAR(R8C3)<=2004,IF(R6C3<=R9C3,0,MIN(MAX(R9C3/8,R6C3-R9C3),2*R9C3)),IF(R6C3<3*R9C3/4,0,MIN(MAX(R9C3/8,R6C3-(7*R9C3/8)),17*R9C3/8)))"
Case "$C$7": Range("C6") = ""
End Select
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Calculate()
' Proposition de Dan_de_pic
' Cette macro est activée dans les conditions ci-dessous :
' "Cet événement se produit après le recalcul de la feuille de calcul, pour l'objet Worksheet."
Static memo As Variant ' Définition de la variable avec mémorisation permanente
Dim Yif As Boolean, msg$
Yif = Flag > 0 And Range("C5").Value <> "" And Range("CN352").Value <> 0 And Range("C5").Value <> Range("CN352").Value
Flag = 0
msg = "Comme le sexe a été changé, le capital lors de l'invalidité" _
& vbNewLine & "en CN352 a été recalculé et se monte à CHF " & Format(Range("CN352").Value, "#'###.00") _
& vbNewLine & "" & vbNewLine & "Voulez-vous remplacer le montant en C5 par ce nouveau montant ? "
If memo = Empty Then ' Si la variable n'a pas encore été initialisée ...
memo = Range("C4").Value ' ... on mémorise le sexe en C4.
ElseIf memo <> Range("C4").Value Then ' Si le sexe a changé, on va voir ce qui est inscrit en C5 et en CN352.
memo = Range("C4") ' On mémorise d'abord le sexe.
End If
If Yif Then Reponse = MsgBox(msg, vbYesNo, "Capital lors de l'invalidité")
'En cas de réponse positive, on effectue le remplacement.
If Reponse = vbYes Then Range("C5").Value = Range("CN352").Value
End SubA+
Bonjour Galopin,
Merci encore une fois pour ton aide …. qui pour une fois est arrivée un peu trop vite. Pendant la nuit j’ai réfléchi que je devais modifier ma demande dès le lever.
Je t’ai dit que ton code lançait le message d’erreur lorsque les cellules à partir de CD299 étaient modifiées mais que j’étais surpris que ça n’arrive pas dans toutes les situations. J’ai maintenant pensé que je ne te l’avais pas demandé car ce n’est pas très logique que le message soit lancé dans une telle situation. Je m’explique : mes deux calculs – le premier dès A1 et le second dès D299 peuvent être utilisés en complément l’un de l’autre ou complètement séparément. Désolé si je n’y ai pas pensé hier.
Il faudrait donc que ce code ne fasse que ce qui est demandé dans ma toute première demande et rien de plus :
Avec l’aide de Dan_de_pic, j’ai placé un code qui contrôle - lors de la modification du sexe en C4-D4 - si la cellule C5 est vide et si le montant en CN352 est égal à zéro ou s’il n’est pas modifié par ce changement. Dans un tel cas, rien ne se passe.
Par contre, si les conditions ci-dessus ne sont pas remplies et que la modification du sexe entraine une modification du chiffre en CN352, une MsgBox informe l’utilisateur du nouveau montant calculé en CN352 et lui demande s’il veut remplacer ou non le chiffre présent en C5 par cette nouvelle valeur.
A l’utilisation, je me suis rendu compte qu’il faudrait que cette MsgBox apparaisse en plus - toujours à condition que la cellule C5 ne soit pas vide, que le montant en CN352 ne soit pas zéro et que le chiffre en CN352 serait ainsi changé - lorsque les cellules C2 ou C3 sont modifiées.
Actuellement, le message n’est pas lancé dans toutes les situations décrites dans ma première demande reprise ci-dessus. J’ai l’impression qu’il ne l’est que lors de la première modification d’une des cellules concernées (par exemple uniquement la première fois que je change le sexe) alors qu’il devrait l’être à chaque fois.
Acceptes-tu malgré tout de continuer à m’aider ??
Ci-joint, le fichier en l’état actuel, avec le message finalement désiré.
https://www.excel-pratique.com/~files/doc2/Demo20091011.zip
Bonne journée
bonjour,
essaie :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("C2, C3, C4, C6, C7")) Is Nothing Then
Z = Target.Address
Application.EnableEvents = False
Select Case Z
Case "$C$2": Flag = 1
Case "$C$3": Flag = 1
Case "$C$4": Flag = 1
Case "$C$6": Range("C7").Formula = "=IF(YEAR(R8C3)<=2004,IF(R6C3<=R9C3,0,MIN(MAX(R9C3/8,R6C3-R9C3),2*R9C3)),IF(R6C3<3*R9C3/4,0,MIN(MAX(R9C3/8,R6C3-(7*R9C3/8)),17*R9C3/8)))"
Case "$C$7": Range("C6") = ""
End Select
End If
Application.EnableEvents = True
End SubL'autre macro sans changement.
A+
Salut Galopin,
Merci pour ta nouvelle proposition. Lorsque je travaille sur le calcul lors de l'invalidité - dès CD299 - le message d'erreur n'apparaît plus ; c'est très bien.
Par contre il y a toujours un problème au niveau des cellules C2, C3 ainsi qu'avec les cases à cocher en C4 et C5 :
Si je modifie la cellule C2 - et bien que le calcul en CN352 soit ainsi modifié tant qu'il n'est pas égal à 0.00 - le message n'apparaît apparemment jamais, alors qu'il devrait toujours apparaître lorsque CN352 est modifié et différent de 0.
Si je modifie les cases à cocher en C4 et C5 (influençant la cellule C4), le message apparaît lors du premier changement de sexe, mais plus lors de changements ultérieurs du sexe, bien que la cellule CN352 est à chaque fois modifiée.
Si je modifie la cellule C3, dans la plupart des cas le message apparaît. Par contre si je modifie d'abord au minimum deux fois le sexe - en confirmant la première fois que je veux modifier le montant selon proposition dans la MsgBox - puis que je modifie à la suite la cellule C3, le message n'apparaît plus !
Je joins un nouveau fichier avec ta dernière macro ainsi qu'un report de la cellule CN352 en F2 afin de simplifier les contrôles. Si tu veux faire des essais par rapport à mes indications ci-dessus, indique en C2 des dates au premier d'un mois entre le 01.01.2000 et le 01.12.2009 et en C3 des dates quelconque entre le 01.01.1950 et le 31.12.1959.
https://www.excel-pratique.com/~files/doc2/Demo20091011bis.zip
bonsoir,
C'est vrai que ça va mieux quand on sait quoi modifier et avec quelle valeur... Je me suis rendu compte que je faisais fausse route en travaillant en aveugle... Je n'ai pas de solution satisfaisante.
Revoir peut-être Dan_de_pic s'il est toujours disponible ?
A+
Merci quand même infiniment Galopin pour ton aide.
J'espère que quelqu'un reprenne le flambeau.
Bonnes soirée à toi et au Forum.
Bonjour,
Selon le conseil de Dan sur le fil https://www.excel-pratique.com/forum/viewtopic.php?t=13981&start=0&postdays=0&postorder=asc&highlight=, j'ai réactivé l'historique de ma première demande (ce fil ici) et j'ai encore une fois essayé de préciser ma demande (voir les informations directement dans le fichier joint).
https://www.excel-pratique.com/~files/doc2/Demo20091107.zip
Pouvez-vous m'aider ?
Bonnes salutations.
Bonjour Yves,
Face à ta demande, je comprends qu'il faut contrôler que la valeur de CN352 varie il te faut un message. en gros :
- Si CN352 = 0, pas de message d'avertissement
- Si CN352 > 0, pas de message d'avertissement si la valeur précédente de CN352 était égale à 0
- Si CN352 était > 0 et que cette valeur change, il te faut le message d'avertissement.
On pourrait peut être ajouter que si CN352 est >0, C5 doit être à 0
Peux-tu confirmer ?
Amicalement
Dan
Salut Dan,
Afin d'essayer de bien se comprendre, je vais compléter ou commenter ton texte :
- Si CN352 = 0, pas de message d'avertissement Oui
- Si CN352 > 0, pas de message d'avertissement si la valeur précédente de CN352 était égale à 0 Oui
- Si CN352 était > 0 et que cette valeur change suite à la modification de C2. C3 ou C4, il te faut le message d'avertissement.
On pourrait peut être ajouter que si CN352 est >0, C5 doit être à 0 Non, ce n'est pas absolument nécessaire
Mais à force de tourner ce problème dans tous les sens, je me rends compte que je pourrais aussi exprimer mon souhait de la manière suivante :
Si la valeur de la cellule CN352 est modifiée suite au changement de l'une des cellules C2, C3 ou C4, le message d'avertissement est nécessaire.
A te relire