En testant notre fichier de travail, je viens de m'apercevoir d'une chose importante !
Généralement, on ne sélectionne q'une 1 seule cellule à la fois.
Pourtant, pris dans nos actions pour lesquelles nous avons besoin de rapidité pour être performants, il peut nous arriver par erreur de sélectionner plusieurs cellules, en même temps, vers la gauche, la droite ou vers le bas.
Le message d'erreur suivant s'affiche :
Nous cliquons alors sur "Fin" pour en sortir mais les macros se trouvent désactivées.
J'ai prévu ce cas avec un bouton qui réactive les macros :
VB:
Sub activeMacros()
Application.EnableEvents = True
Application.Calculation = xlAutomatic
End Sub
Mais souvent mes collègues oublient de cliquer sur le bouton est travaillent macros désactivées jusqu'à cliquer sur un autre bouton dont elles ont besoin.
Dans ce cas, certaines saisies ne sont pas enregistrées et cela pose problème.
J'ai cherché des solutions mais je n'en ai pas trouvé et je me tourne vers vous pour savoir s'il y aurait une possibilité de code qui ferait en sorte que si sélection de plusieurs cellules vers la droite (même vers la gauche) ou vers le bas, rien ne se passe ?
Et affiche un msg du genre 'vous avez cliqué sur plusieurs cellules !
Ce serait super car je cherche depuis longtemps ce qui pouvait provoquer la désactivation des macros et je pense que cela vient de ça.
Avec mes remerciements,
je vous souhaite une belle fin de journée
lionel,
L'idéal, serait que le code de Gérard ne s'exécute que "If Application.EnableEvents = False Then"
Mais je ne réussi pas à le faire fonctionner avec la condition
Parce que tu as mal placé cette condition, il faut bien sûr que le processus continue donc utilise :
VB:
Sub ReactiveMacros()
On Error Resume Next
Application.OnTime t, "ReactiveMacros", , False
t = Now + 1 / 86400 'délai de 1 seconde
Application.OnTime t, "ReactiveMacros"
If Application.EnableEvents Then Exit Sub
ActiveSheet.Protect Password:="", UserInterfaceOnly:=True
[g13] = "Macros Réactivées"
[g14] = "code Gérard"
ActiveSheet.EnableSelection = xlNoRestrictions
[a2].Select
protege
Application.EnableEvents = True 'réactive les évènements
End...
Ok.
Donc te faire des propositions et même te faire un fichier de test, à partir du moment où ce n'est pas d'une de tes idoles, c'est du temps de perdu. Le tout c'est de le savoir.
0 défaut contre au moins 3 ce n'est pas intéressant, soit.
Mais pourquoi dire " j regarderai " comme il y a 9 mois alors que tu n'en as pas la moindre intention ?
En attendant j'aimerais bien ne pas mourir idiot et savoir pourquoi 'c'est mieux' de ne même pas pouvoir déplacer un bouton sur feuille en phase développement en plus du clignotement car une macro se lance en permanence.
En quoi 'c'est mieux' de monopoliser des ressources toutes les x secondes si on peut s'en passer.
En quoi 'c'est mieux' de risquer une non mise à jour suite à saisie car un Change ne s'est pas effectué.
Désolé mais ça me démangeait trop
Sur ce, bonne nuit à tous
eric
D'accord qu'il vaudrait mieux que ça soit écrit correctement pour que ça n'arrive pas.
Mais je maintiens qu'utiliser l'effet de rétablissement (non prévu) suite au lancement d'une macro est une fausse bonne idée.
Déjà parce qu'on ne lit pas ensuite EnableEvents = True et on peut se demander ce qu'il y a d'autre qui n'a pas été réalisé, en plus des désagréments.
Et parce qu'une saisie ne sera pas traitée si elle faite entre le moment où c'est tombé et celui où ça a été rétabli.
Quel impact potentiel lorsqu'il s'agit d'un fichier utilisé au travail ? Ca peut chiffrer vite...
Tous ces effets négatifs ne peuvent pas arriver avec l'emploi d'une bascule qui est une façon propre de se passer de
Application.EnableEvents = False
Tout plaide en sa faveur.
Mais bon, ce n'est pas mon fichier, et ce n'est pas ma réputation au travail en cas de gros dégâts...
eric
Bonjour Gérard, eriiiic, JM, jmfmarques, Le Forum;
@Gérard : "Le problème c'est que Lionel n'est pas en mesure d'appliquer cette méthode sur ses codes"
Merci d'avoir compris (et depuis longtemps) que je suis "Barbatruc" qu'au nombre de messages ... je ne parle même pas anglais ...
@ jmfmarques : J'aurais "plussoyé " également
@eriiiic : Je comprends ta réaction mais comme je l'ai écrit au #Post23 :
"Je ne suis pas un ténor en vba ... et de loin et je ne spik pas l'anglisse (tu l'a compris lol )
Mon "usine à gaz" est bourrée de codes qui doivent être désactivés quand d'autres s'exécutent.
ça craint "grave" ... mais dès que j'aurai un moment, j'essaierai de tester sur un fichier "
Et, je confirme : Mais promis, je vais tester sur un fichier.
Je vous souhaite un très bon dimanche à toutes et à tous,
lionel,
@eriiiic :
Dans ma feuille j'utilise les codes suivants :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean),
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean),
Private Sub Worksheet_SelectionChange(ByVal r As Range),
Private Sub Worksheet_Change(ByVal Target As Range) Tout ça dans le code de la même feuille
J'ai une tripotée de :
Application.EnableEvents = true et Application.EnableEvents = False
que j'ai également dans les Feuilles, les macros, UserForm, combobox, textbox)
Si je comprends bien ton fichier :
1 - dans le code de ma feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
' la suite du code n'est exécuté que si je le veux
' comme si j'avais mis EnableEvents = False
If b_noEvents Then Exit Sub ' ajouter cette ligne sur les événements qui doivent être supervisés
MsgBox "Change déclenché"
End Sub
2 - dans un module:
Code:
Option Explicit
Public b_noEvents As Boolean
Je Remplace tous les Application.EnableEvents = true par b_noEvents = True
Je Remplace tous les Application.EnableEvents = False par b_noEvents = False
et "If b_noEvents Then Exit Sub", ' ajouter cette ligne sur les événements qui doivent être supervisés
je le mets où ?
lionel,
C'est ça sauf que c'est l'inverse ;-)
Remplacer tous les Application.EnableEvents = False par b_noEvents = True
et tous les Application.EnableEvents = True par b_noEvents = False
puisqu'à l'ouverture elle est à False par défaut (noEvents = 'pas d'événements' en français )
Pour simplifier, faire Ctrl+h (Remplacer) en ayant coché 'Projet en cours' fera l'ensemble de toutes les modifs partout où c'est nécessaire. 2 à faire donc
et "If b_noEvents Then Exit Sub", ' ajouter cette ligne sur les événements qui doivent être supervisés
je le mets où ?