Erreur "EnableEvents" avec une liste de validation dynamique

Bonjour à tous,

Je rencontre un problème lorsque je sélectionne un élément dans une liste de validation située dans la colonne G d’un tableau structuré. Cette liste utilise la formule suivante :

=SI(G11<>"";DECALER(SousCategories;EQUIV(G11&"*";SousCategories;0)-1;;NB.SI(SousCategories;G11&"*");1);SousCategories)

Dès que je fais un choix dans la liste, j’obtiens l’erreur suivante :
« Une erreur s’est produite : La méthode ‹ EnableEvents › de l’objet ‹ _Application › a échoué. »

Le code VBA utilisé dans l’événement Worksheet_Change() est le suivant :

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
    
    If Target.Count > 1 Then Exit Sub
    
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    
    Select Case Target.Column
    Case COL_STATUT_DETTE
        Call UpdateDebtStatus(Target)
            
    Case COL_PAIEMENT
        Dim ws As Worksheet
        Dim description As String
            
        Set ws = ThisWorkbook.Worksheets("Paramètres")
        On Error Resume Next
        description = Application.WorksheetFunction.VLookup(Target.value, _
                                                            ws.Range("TbPaiement"), 2, False)
        On Error GoTo ErrorHandler
            
        If description <> "" Then
            With Target.Validation
                .InputTitle = "Mode de paiement"
                .InputMessage = description
                .ShowInput = True
            End With
        End If
    End Select

ExitSub:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
    
ErrorHandler:
    MsgBox "Une erreur s'est produite : " & Err.description
    Resume ExitSub
End Sub

Le problème persiste quel que soit le nombre de clics sur le bouton « OK » de la boîte de dialogue d’erreur, et l’erreur continue de s’afficher en boucle, m’obligeant à redémarrer Excel.

Comment pourrais-je résoudre ce problème ?

Merci d’avance pour votre aide !

Erreurs_EnableEvents.xlsm (39,6 Ko)

je ne sais pas reproduire cette erreur,vous faites quoi exactement ?

Bonjour Cow18,

En fait, l’erreur ne se produit pas à chaque utilisation de la liste en colonne G. Je pense qu’elle pourrait être liée à la désactivation/réactivation de l’événement EnableEvents. Sinon, il faudrait peut-être revoir la gestion des erreurs pour mieux comprendre ce qui se passe.

Je ne comprends pas le but final, ne pensez-vous pas trop difficile ? Pouvez-vous vous expliquer ?

Parfois, la sélection d’un élément dans la liste de validation de la colonne G fonctionne sans problème, mais à d’autres moments, l’erreur :

Une erreur s’est produite : La méthode ‹ EnableEvents › de l’objet ‹ _Application › a échoué

survient immédiatement après la sélection.
Comment peut-on résoudre ce problème ?

Bonjour

En regardant votre souci et la date de votre dernier post, pourriez-vous me dire si votre problème est solutionné ou pas

Si oui, une question : vous mentionnez une feuille Paramètres dans le code mais elle n’est pas dans votre fichier.

Bonsoir djn,

J’ai effectué un nettoyage de certains tableaux créés dans la feuille Transactions, et l’erreur a disparu pour le moment. Cependant, je ne sais pas si elle réapparaîtra à l’avenir.

Concernant la feuille Paramètres, elle est bien présente dans le classeur d’origine, mais elle n’a pas été incluse dans cette copie de test.

Bonjour,

Dites moi si vous voulez que je regarde tout de même.

En premier j’aurais peut être supprimé la ligne On error goto errorhandler en première ligne ou alors la supprimer après la ligne description =…
ou la déplacer juste après la ligne Case COL_STATUT_DETTE
Tel quel la mettre après description est inutile

A vrai dire j’aurais écrit le code un peu autrement

Autre point : vos variables sont déclarées en LONG. C’est inutile vous pouvez les mettre toutes en BYTE.

Crdlt

Bonjour djn, le forum,

Peux-tu m’expliquer comment tu structurerais le code ?

Merci d’avance.

Bonjour

Je suis en train de voir cela.

Une question vu que je n’ai pas le fichier complet : Mettons que vous videz la cellule J11 dans la colonne Paiement, actuellement si je vois bien cela va vous renvoyer une erreur.
Idem en colonne 18 pour R11 par exemple
Correct ?

Edit : autre question : votre code UpdateDebtStatus(Target) se trouve dans un module ?

Bonjour djn,

Mettons que vous videz la cellule J11 dans la colonne Paiement, actuellement si je vois bien cela va vous renvoyer une erreur.

Dans le classeur d’origine, j’ai eu cette erreur :

Valeur non reconnue dans la colonne paiement. Veuillez vérifier votre saisie.

Idem en colonne 18 pour R11 par exemple

Pas d’erreur dans la colonne 18 (R)

votre code UpdateDebtStatus(Target) se trouve dans un module ?

Dans la feuille « Transactions »

Re
Ok pour le module Transaction mais il ne se trouve pas dans le fichier posté

Dans le classeur d’origine, j’ai eu cette erreur :
Valeur non reconnue dans la colonne paiement. Veuillez vérifier votre saisie*.

Je ne sais pas vous dire si cela peut avoir avec votre erreur mais derrière le mot Espèces vous avez un caractère vide

Peux-tu m’expliquer comment tu structurerais le code ?

Pour le code j’aurais fait ceci :

  1. Dans le module Transaction ou un autre, juste en première ligne (donc avant tous les codes !). Mettre cette ligne → Public stpevt As Boolean
  2. Dans la feuille Transaction :
  • Supprimer toutes les déclarations de variable en haut (private const…)
  • remplacer le code par celui ci-dessous
Private Sub Worksheet_Change(ByVal Target As Range)
    
If Target.Count > 1 Then Exit Sub
If stpevt = True Then Exit Sub

Application.ScreenUpdating = False

If Not Intersect(Target, Range("TbTransactions").ListObject.ListColumns(17).DataBodyRange) Is Nothing Then
    If Target = vbNullString Then Resume ExitSub
    On Error GoTo ErrorHandler
    stpevt = True
    Call UpdateDebtStatus(Target)
End If

If Not Intersect(Target, Range("TbTransactions").ListObject.ListColumns(9).DataBodyRange) Is Nothing Then

    If Target = vbNullString Then Resume ExitSub
    
    Dim ws As Worksheet
    Dim description As String
    
    Set ws = ThisWorkbook.Worksheets("Paramètres")
    
    On Error GoTo ErrorHandler
    description = Application.WorksheetFunction.VLookup(Target.Value, ws.Range("TbPaiement"), 2, False)
        
    If description <> "" Then
        stpevt = True
        With Target.Validation
            .InputTitle = "Mode de paiement"
            .InputMessage = description
            .ShowInput = True
        End With
    End If
    
End If

ExitSub:
    Application.ScreenUpdating = True
    stpevt = False
    Exit Sub
    
ErrorHandler:
    MsgBox "Une erreur s'est produite : " & vbCrLf & Err.description, vbCritical, "Erreur"
    Resume ExitSub
End Sub

c’est un fichier assez vague et je pense qu’on sait faire tout cela sans ces validations, avec des formules et put-être une fonction personnalisée. Si on voit « café au lait », c’est toujours « repas à l’exterieur » ?
Mais je pense qu’il faut commencer avec supprimer ces 2 noms, c’est surtout ce « tag » que je ne comprends pas. Qu’est-ce qu’il fait ?

Bonjour Cow18,

voici une nouvelle version du fichier corrigé :

Erreurs_EnableEvents_v002.xlsm (48,6 Ko)

il y a plusieurs listes de validation différentes dans votre colonne J du TS. Vous prenez le premier J11 et CTRL-C (ou copier) et puis vous sélectionnez le reste cad J11:J13 et puis « coller spécial validation ». Bon, maintenant la colonne J ne contient qu’une validation et quand vous ajoutez une nouvelle ligne, le TS fait tout cela sans intervention, donc supprimez cette (partie de la ) macro.
Et comme je lis vos questions précédentes, pourquoi plusieurs feuilles, une par mois, une feuille suffit et ajoutez autrement une colonne avec une formule qui calcule le mois ou ajoutez cela manuellement (=TEXTE(TbTransactions[@Date]+6;« aaaa-mmm »)

Dans mon classeur, il y a une seule feuille dédiée aux saisies de transactions pour les 12 mois de l’année en cours.

bon, mais maintenant, vous ne devez plus créer/modifier la validation de la colonne J. Et ces colonnes G:I, il faut les remplacer par quelque chose plus malin, surtout G, H&I peuvent rester comme ça.

Bonjour Cow18,

D’accord, je ne toucherai plus à la validation de la colonne J.

Pour la colonne G (Sous-Catégorie), elle utilise actuellement une liste de validation basée sur la formule suivante :

=SI(G11<>"";DECALER(SousCategories;EQUIV(G11&"*";SousCategories;0)-1;;NB.SI(SousCategories;G11&"*");1);SousCategories)

Cela me permet de choisir une sous-catégorie en fonction du produit saisi dans la colonne Description, malgré qu’elle est moins interactive et moins flexible.

Que voulez-vous dire exactement par « remplacer par quelque chose de plus malin » ? Auriez-vous une suggestion pour optimiser cette validation et la rendre plus dynamique ?

un essai pour vous expliquer, c’est la création d’une système d’auto-apprentissage. En colonne C vous tapez une description et en colonne A (et s’il n’y a rien en colonne G) on cherche le plus semblable que possible entre colonne H:I de « data validation ». Je sais, au début, il faut presque ajouter chaque partie du texte dans ce tableau, mais après un certain temps, la formule trouvera de plus en plus des correspondances.
eventuellement, on peut encore améliorer la formule par une fonction prsonnalisée.
Le problème avec cette formule est qu’elle est matricielle, donc assez « gourmant » pour le processeur (une dizaine/centaine,de cette formule est okay, mais pas des milliers. C’est pourquoi, on ne cherche plus quand la colonne G n’est plus vide.

Erreurs_EnableEvents (2).xlsm (43,0 Ko)

En fait, je peux voir que les formules matricielles ralentissent Excel, surtout lorsqu’elles sont utilisées en grande quantité.

De plus, cela me rappelle un autre problème avec mon classeur. Il contient de nombreuses formules matricielles, notamment dans les feuilles « BA Prévisionnel » et « BA Réalisé » et les feuilles des mois (janvier, février, etc.). Ce grand nombre de calculs ralentit considérablement le fichier.

Dans la feuille Transactions, la colonne A de TbTransactions est utilisée pour marquer les lignes à l’aide d’indicateurs, tels que « e » pour indiquer les transactions électroniques. Je me demande également comment remplir efficacement la table de description Table3.

Étant donné que ces questions sont un peu différentes, j’ai ouvert un nouveau fil pour parler davantage de l’optimisation des formules et de l’organisation des données :

Si vous avez des idées ou des conseils sur ces points, n’hésitez pas à m’en faire part !

Budget_Familial_v001.xlsm (509,0 Ko)