Bizarrerie VBA - Message d'erreur incompréhensible
Bonsoir,
Dans le fichier ci-joint, j'ai une macro à l'ouverture qui permet le travail sur les feuilles protégées. Et j'ai aussi une macro qui se déclenche lors d'un double-clic sur certaines cellules de l'une ou l'autre des feuilles du fichier.
Bizarrement, lors de ce double-clic, la macro se déroule tout d'abord normalement - malgré la protection de la feuille, mais c'est bien normal - mais ça coince tout à la fin de la macro, le message ci-dessous apparait :
Si je place un point d'arrêt sur ''End Sub'' de la macro "Workbook_SheetBeforeDoubleClick", tout se déroule normalement jusqu'à cette dernière instruction !?
Savez-vous comment remédier à ce problème ?
Cordialement.
Bonsoir,
L'instruction Userinterface est assez peu compréhensible. Elle autorise l'utilisateur à exécuter des macros mais cela n'empêche pas de déprotéger les feuilles où le code doit faire quelque chose.
Donc solution est de faire un Unprotect puis un Protect à la fin
Dans les codes j'aurais plutôt fait ceci
1- Code ouverture
Private Sub Workbook_Open()
Dim i As Byte
For i = 1 To Sheets.Count
If Sheets(i).Name <> "Infos" Then Sheets(i).Protect , UserInterfaceOnly:=True
Next i
End Sub2. Code Workbook_SheetBeforeDoubleClick,
- Mettre juste en dessous de la ligne Reponse = MsgBox......
ActiveSheet.Unprotect- Mettre juste avant le END SUB
ActiveSheet.protect- Supprimer tous les Applications.events. Elles ne servent pas dans le processus.
D'ailleurs j'évite toujours de l'utiliser car il suffit d'un bug ou une annulation en cours de process pour que plus rien ne fonctionne au niveau des macros événementielles.
Cordialement
Salut Dan,
Merci beaucoup pour ton intervention. Cependant ça ne fonctionne toujours pas.
Dans mon fichier réel, qui est assez complexe, j'ai besoin de ces instructions "Applications.Events" afin d'éviter que d'autres macros événementielles se déclenchent lors de la modification de la feuille.
Bonsoir Yvouille, Dan
Attention !
Quand on met un "Application.EnableEvents = False", il faut être certain qu'il soit remis à True avant de sortir de la procédure
De plus avec un évènement "SheetBeforeDoubleClick" il faut annuler le mode édition surtout sur des cellules protégées
D'où le message d'erreur
Donc
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim DerLig As Byte, Réponse As String
Application.EnableEvents = False
Cancel = True
If ActiveSheet.Name = "Infos" Or ActiveSheet.Name = "Equipes" Or ActiveSheet.Name = "Classement" Or ActiveSheet.Name = "Récapitulatif" Then
Application.EnableEvents = True
Exit Sub
End IfOu mieux, car inutile en début de procédure
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim DerLig As Byte, Réponse As String
If ActiveSheet.Name = "Infos" Or ActiveSheet.Name = "Equipes" Or ActiveSheet.Name = "Classement" Or ActiveSheet.Name = "Récapitulatif" Then Exit Sub
' Désactiver les évènements ICI
Application.EnableEvents = False
' Annuler le mode edit
Cancel = TrueA+
re
@Bruno : Bien vu, j'avais zappé cette instruction CANCEL lors des essais
@Yvouille :
Dans mon fichier réel, qui est assez complexe, j'ai besoin de ces instructions "Applications.Events" afin d'éviter que d'autres macros événementielles se déclenchent lors de la modification de la feuille.
Il faudrait voir les autres macros événementielles pour mieux donner un avis
Concernant l'instruction enableevents, un ami (mDF - myDearFriend - Didier Fourgeot) a donné sur son site une belle explication sur les soucis que l'on peut rencontrer avec cette instruction. De son coté il utilisait plutôt la variable Boolean ou la fonction Static. Il faudrait que je retrouve cette explication...
Dans ton cas cela pourrait donner ceci
en dessous d'option explicit rajouter --> Dim encours as boolean
dans le code mettre encours = true
dans le code qui s'exécute en modification de la feuille mettre If encours then exit sub
Puis remettre à false avant le end sub du code doubleclick concerné ici
Si tu veux conserver tel quel et tenant compte de ce que Bruno a écrit, ton code pourrait être ceci plutôt
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim DerLig As Byte, Réponse As String
If ActiveSheet.Name = "Infos" Or ActiveSheet.Name = "Equipes" Or ActiveSheet.Name = "Classement" Or ActiveSheet.Name = "Récapitulatif" Then Exit Sub
DerLig = Range("B" & Rows.Count).End(xlUp).Row
If Not Intersect(Target, Range("B5:B" & DerLig)) Is Nothing Then
Application.EnableEvents = False
Cancel = True
If MsgBox("Veux-tu vraiment supprimer cette équipe ?", vbYesNo) = vbYes Then
If Range("M5") <> "" Then
MsgBox "Un classement a déjà été effectué ; il faut supprimer cette équipe en colonne M !"
Application.EnableEvents = True
Exit Sub
ElseIf Range("A" & Target.Row) <> "" Then
'......Bonjour Dan, bonjour Bruno,
Merci pour tous vos conseils
Effectivement que l'instruction "Cancel = True" résout tous mes problèmes.
Quant à l'instruction oubliée ''Application.EnableEvents = True" avant "Exit Sub", c'est une erreur dont on se rend assez rapidement compte, lors d'un prochain essai
Bonne continuation à vous deux.