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 :

image

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.

14demo-01-08.xlsm (19.20 Ko)

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 Sub

2. 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.

13demo-01-08-v2.xlsm (20.33 Ko)

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 If

Ou 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 = True

A+

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.

Rechercher des sujets similaires à "bizarrerie vba message erreur incomprehensible"