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 :
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.
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.
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.
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.
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 ?
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 :
Dans le module Transaction ou un autre, juste en première ligne (donc avant tous les codes !). Mettre cette ligne → Public stpevt As Boolean
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 ?
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 »)
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.
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.
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 !