XL 2013 Formulaire de contrôle et événement _change qui ne se déclenche pas

IxeX

XLDnaute Nouveau
Bonsoir la communauté !

J'ai un souci concernant la modification d'une cellule (A4) et son événement associé où A4 correspond à la formule suivante : =SI(F4=1;((A2*B2)*2);((A2*B2)*4))

Cf. fichier joint 🙌

J'aimerais que l’événement _Change se déclenche lorsque la valeur en A4 est modifiée.

Mais...

L’événement _Change ne se déclenche pas lorsque je coche une option depuis mon formulaire de contrôle (multiplication par 2, multiplication par 4..... dans mon exemple)...

Par contre...

L’événement _Change se déclenche bien lorsque je modifie A2 ou B2 !

Comment cela se fesse-t-il ? 😕 Merci d'avance
 

Pièces jointes

  • exemple_02.xlsm
    17.1 KB · Affichages: 10

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

C'est normal, votre cellule n'est pas changée, elle est calculée, ce qui n'est pas la même chose pour excel.

Soit vous interceptez l'évènement Calculate de la feuille, éventuellement en comparant la valeur de A4 avec son ancienne valeur retenue dans une variable.

Cette solution peut entraîner un recalcul en boucle de la feuille ou du classeur suivant ce que vous faîtes dans cet évènement.

Sinon vous interceptez dans l'évènement change les changements intervenus dans les cellules et dont dépend le calcul de A4.

Dans l'exemple joint ici la première solution est appliquée. La valeur de A4 est conservée dans une variable 'Static' d'un appel à l'autre de l'évènement Calculate, le calcul automatique est arrêté pour éviter les appels en boucle puis remis à 'calcul automatique'.


Cordialement
 

Pièces jointes

  • exemple_02.xlsm
    26.6 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Bonjour IxeX, Roblochon,

c'est normal que l'événement _Change() ne se déclenche pas quand tu cliques sur un des 2 boutons d'option, car même si ça change la valeur de ta cellule liée F4 ainsi que A4, c'est par une formule de calcul que la valeur de A4 est modifiée ; l'événement _Change() est appelé uniquement en cas d'une modification de cellule si tu y saisis quelque chose, ou si tu effaces la valeur avec la touche Suppression.



ton fichier en retour. :)

* ne cherche pas "Feuil2" et "Feuil3" : comme elles étaient vides, je les ai supprimées.

* ne cherche pas ta cellule liée F4 : comme elle était inutile, je l'ai supprimée ! 😁

* ne cherche pas ta formule de A4 : elle aussi était inutile, donc supprimée aussi ! 😛

* ne cherche pas tes 2 anciennes cases d'option 1 et 2 : je les ai supprimées toutes les deux ; à la place, j'ai commencé par mettre un groupe ; puis dans ce groupe, j'ai mis 2 cases d'option sans cellule liée ; ensuite, j'ai affecté une macro à chaque case d'option ; enfin, j'ai groupé le tout : le groupe et les 2 cases d'options.

* à toi de faire tous les tests nécessaires : choix d'une des 2 options, et changement des valeurs de A2 et B2 ; regarde aussi ce qui se passe quand tu effaces A2 ou B2 avec la touche Suppression ; note qu'un résultat nul n'est pas inscrit en A4 : la cellule est alors vide au lieu de contenir 0 ; si tu préfères voir le 0 :​

* remplace la 2ème ligne de la sub Calcul() par : [A4] = Val([A2]) * Val([B2]) * k

* puis comme la variable r n'est plus utilisée, supprime la ligne du dessus Dim r&

si tu te demandes pourquoi j'ai utilisé Val() : c'est tout simplement pour éviter un plantage au cas où tu aurais un utilisateur analphabète qui taperait des valeurs non numériques en A2 ou B2 ; tu peux saisir des valeurs négatives (avec un signe moins devant) ; le résultat sera négatif avec par exemple -10 et 5 ; il sera positif avec -10 et -5 car (-10) × (-5) = +50 = 50 ; le code VBA est prévu que pour des nombres entiers : si tu saisis des nombres fractionnaires, ça ne plantera pas, mais les décimales seront ignorées.​



code VBA du module de "Feuil1" :

VB:
Option Explicit

Private Sub Calcul(k As Byte)
  Dim r&
  r = Val([A2]) * Val([B2]) * k: If r <> 0 Then [A4] = r
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.CountLarge > 1 Then Exit Sub
  If Intersect(Target, [A2:B2]) Is Nothing Then Exit Sub
  If Val(Target) = 0 Then [A4] = Empty: Exit Sub
  Calcul 4 + 2 * (OptionButton1)
End Sub

Private Sub OptionButton1_Click()
  Calcul 2
End Sub

Private Sub OptionButton2_Click()
  Calcul 4
End Sub

à te lire pour avoir ton avis. 😉

soan
 

Pièces jointes

  • exemple_02.xlsm
    22.6 KB · Affichages: 4

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote