Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Déclencher un evenement pas VBA

12 réponses
Avatar
Apitos
Bonsoir,

De quelle fa=E7on peut-on d=E9clencher l'=E9venement Worksheet_OnChange dans=

l'=E9venement lui m=EAme ?

http://cjoint.com/?bmtEuPBETh

Merci.

10 réponses

1 2
Avatar
LSteph
Bonsoir,

Tu as vu ces instructions,
Application.EnableEvents
Il y a faux au debut et on remet à vrai à la fin

C'est précisément pour que l'évènement ne se déclenche pas lui même!

Sans quoi cela bouclerait indéfiniment.

;-)

Cordialement.

--
lSteph



Bonsoir,

De quelle façon peut-on déclencher l'évenement Worksheet_OnChange dans
l'évenement lui même ?

http://cjoint.com/?bmtEuPBETh

Merci.


Avatar
Apitos
Bonjour LSteph,

Alors il n'y a pas de solution à mon problème ?
Avatar
LSteph
Bonjour Apitos,

Mais si justement!

Pas de pb ...je n'entrevois que des solutions et plus précisément
C'est à cela que sert enableevents. Ta question ne me donnait pas
d'éléments suffisants pour savoir que tu voulais exactement et
elle exprime une assertion contradictoire avec la pratique normale de
désactivation des évenements sans préciser l'objectif réel.
C'est pourquoi je t'ai donné cette piste large comme une autoroute, afin
que tu puisses adapter selon ce qui te sied!

Il faut donc toutefois réfléchir à partir de cet élément et ainsi :

Si tu prévois de redéclancher l'évènement , il se redéclanchera, comme
je te l'ai expliqué mais comme il est prévu de le déclancher chaque fois
qu'il se déclanche donc il se redéclanchera à chaque fois ...etc...
C'est à cela que sert enableevents
selon qu'il est à true ou false.

Et c'est cela (false ou true) que tu peux règler lors de l'execution

Par exemple si mavariablequejaideclareepubliquedansunmodulestandard
prend 1 de + à chaque fois je peux décider qu'à trois on arrête de
répèter et avant de changer ma valeur (action qui ne manquerait de
redéclancher) je mets enableevents à false
une fois la modif faite je remets à true et mavariable à zéro.

ou alors .. donnes plus de précisions sur ce que tu cherches à faire.

Cordialement.

--
lSteph




Bonjour LSteph,

Alors il n'y a pas de solution à mon problème ?





Avatar
LSteph
.... voici un exemple (c'est le end tout court qui réinitialise la
variable à rien donc zero)

'''dans Module1
Public mavar As Integer

'''dans le code de Feuil1

Private Sub Worksheet_Change(ByVal Target As Range)

Dim isect As Range
Set isect = Intersect(Target, [b2])
If isect Is Nothing Then Exit Sub
If mavar < 3 Then
mavar = mavar + 1
[b2].Value = [b2].Value * 2
Else
Application.EnableEvents = False
[b2].Value = [b2].Value * 2
Application.EnableEvents = True
End
End If
End Sub

';-)
'@+

'--
'lSteph

Bonjour LSteph,

Alors il n'y a pas de solution à mon problème ?





Avatar
Apitos
Bonsoir LSteph,

Le problème est que :

Application.EnableEvents = False

Je l'ai déclaré au début de la procédure.

Alors comment faire pour de telles actions, au milieu de la
procédure ?

Merci.
Avatar
Apitos
Voilà un exemple :

http://cjoint.com/?bntHQp1cOL
Avatar
LSteph
Bonjour,

regarde dans l'exemple que je t'ai donné...
ce n'est pas précisément l'endroit où je l'ai mis!

Le but est prioritairement que tu adaptes toi même cela à ton objectif
et ainsi utiliser un truc dont tu as maitrisé le fonctionnement.
Il faut créer une variable publique comme proposé, ensuite tu as
l'explication et l'exemple. Sinon dis moi ce qui n'est pas clair.


Cordialement.

--
lSteph

Bonsoir LSteph,

Le problème est que :

Application.EnableEvents = False

Je l'ai déclaré au début de la procédure.

Alors comment faire pour de telles actions, au milieu de la
procédure ?

Merci.





Avatar
Apitos
Bonjour LSteph,

Il y'a un petit soucis

Le WorSheet_OnChange repose sur la cible (Target) pour traiter une
entrée (Ici le traitement d'une entréee="x" doit démarrer si la
colonne cible = 5 et sa valeur = "x").

Mais pour le deuxieme cas, la colonne cible et outre que 5 et l'entrée
est imposée par code (il n'y a pas de saisie).

Comment résoudre ce problème à ton avis ?

Merci.
Avatar
LSteph
Bonjour,

J'étais un peu absent mais ne te laisse pas tomber, toutefois j'ai un
souci avec ton sujet, voilà:

Je ne vois pas cela précisément, dans la mesure où tes deux exemples de
code chez moi plantent et que tu ne m'as toujours pas dit ce que tu
cherches à faire avec cela.

Déjà ce type de syntaxe est "plantard"

If Target.Column = 5 And Target.Count = 1 Then


si l'utilisateur veut et il le peut entrer "e" ou x dans plusieurs
cellules ça ne marchera pas commme voulu puisque le .count est limité à
1! Tu te retrouves avec ton x qui est qd même entré et l'action voulue
non executée

Dans un change il faut toujours définir une intersection avec la plage
souhaitée par rapport à la cible (target) visée par l'utilisateur

Dim iSect as range , c as range

set iSect=intersect(target,[e:e])

if iSect is nothing then exit sub

..

Par suite on pourra traiter toutes les cellules de cette intersection
uniquement
For each c in iSect.cells

...etc..

Pour en revenir à ton objectif réel si tu l'expliques on pourra voir
comment contourner ce que tu tentes et qui visiblement ne convient pas.
Le fait que tu cherches à redéclancher quelquechose ça j'ai bien
compris, le problème c'est qu'est ce que c'est sensé faire exactement
entre le tableau de gauche et de droite car vu les éléments en présence
dans les deux exemples , je ne vois pas la logique.

Cordialement.

--
lSteph


Bonjour LSteph,

Il y'a un petit soucis

Le WorSheet_OnChange repose sur la cible (Target) pour traiter une
entrée (Ici le traitement d'une entréee="x" doit démarrer si la
colonne cible = 5 et sa valeur = "x").

Mais pour le deuxieme cas, la colonne cible et outre que 5 et l'entrée
est imposée par code (il n'y a pas de saisie).

Comment résoudre ce problème à ton avis ?

Merci.


Avatar
Apitos
Bonsoir LSteph,

C'est très généreux de ta part de t'intéresser à mon problème :

J'utilise ce code pour mes besoins personnels.

Le tableau Crédits (A1:A9) contient les dates des crédits avec les
noms des créditeurs.
Le tableau Rem-Crédits (I1:L4) contient les infos des crédits
remboursés.

Il y'a trois cas :

1 - Si le crédit est remboursé en une seule fois, on mettra un "x"
devant l'intitulé dans la colonne E
Les informations nécessaires sont copies dans le deuxième tableau Rem-
Crédit.

2 - Si le crédit sera remboursé par échéanciers, on mettre un "e" da ns
la colonne E, et un tableau avec tous les infos vient s'ajouter au
dessus du tableau Crédits, pour pouvoir suivre les payements.

Une fois la totalité du crédit est remboursé, on mettra
automatiquement un "x" dans la colonne E, pour voir cette personne
figuré dans le tableau Rem-Crédit (on relance le Onchange pour traiter
le cas ou la cible est égal un "x" dans la colonne E).

3 - Cas où on pourra insérer une ligne vide supplémentaire dans le
tableau Crédit pour saisir les informations d'un nouveau crédit.



Pour le count, je m'en sert pour dire à Excel, que je travail dans une
seule cellule, et que ce n'est pas une sélection de plage par exemple


Maintenant la question posée c'est autour du deuxième partie du point
2)


Bon voilà !

Merci d'avance.
1 2