Nom propre excel VBA
Résolu
Evedll
Messages postés
74
Date d'inscription
Statut
Membre
Dernière intervention
-
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Nom propre excel VBA
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
2 réponses
Peut-être :
Private Sub Worksheet_Change(ByVal Target As Range) Dim V As Range If Not Intersect([A6:A11], Target) Is Nothing Then Target.Offset(0, 1) = Empty Target.Offset(0, 2) = Empty End If If Not Intersect([B6:B11], Target) Is Nothing Then Target.Offset(0, 1) = Empty Target.Offset(0, 2) = Empty Target.Offset(0, 3) = Empty End If If Not Intersect([B6:B11], Target) Is Nothing Then Target.Offset(0, 7) = Empty End If For Each V In Range("R6:R11") If UCase(V) = "E" Then MsgBox "Attention, séances gratuites seulement pour GEA, Gym Douce et Tonic !" Exit Sub End If Next V If Not Intersect(Target, Range("B3")) Is Nothing Then Target.Value = UCase(CStr(Target.Value)) ElseIf Not Intersect(Target, Range("B4")) Is Nothing Then Target.Value = Application.Proper(CStr(Target.Value)) End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect([A6:E11,I6:I11,B1:B2,D1:D2,F16:F25], Target) Is Nothing Then SendKeys "%{down}" End If End Sub
Effectivement c'est un problème d'évènnement :
Private Sub Worksheet_Change(ByVal Target As Range) Dim V As Range Application.EnableEvents = False If Not Intersect([A6:A11], Target) Is Nothing Then Target.Offset(0, 1) = Empty Target.Offset(0, 2) = Empty End If If Not Intersect([B6:B11], Target) Is Nothing Then Target.Offset(0, 1) = Empty Target.Offset(0, 2) = Empty Target.Offset(0, 3) = Empty Target.Offset(0, 7) = Empty End If For Each V In Range("R6:R11") If UCase(V) = "E" Then MsgBox "Attention, séances gratuites seulement pour GEA, Gym Douce et Tonic !" Application.EnableEvents = True Exit Sub End If Next V If Not Intersect(Target, Range("B3")) Is Nothing Then Target.Value = UCase(CStr(Target.Value)) ElseIf Not Intersect(Target, Range("B4")) Is Nothing Then Target.Value = Application.Proper(CStr(Target.Value)) End If Application.EnableEvents = True End Sub
Salut Patrice,
J'ai vu que tu as ajouté des lignes de code :
Application.EnableEvents = False (en début)
Application.EnableEvents = True (en milieu et fin)
Je suis étonnée qu'il de voir une seule False et deux fois True dans ces lignes (je pensais qu'il fallait 2 lignes au total, une pour annuler l'autre). J'ai testé et ça marche !!!
Je ne comprends pas à quoi ça correspond mais je ferai une recherche à ce sujet pour mieux comprendre mon erreur.
En attendant, ça fonctionne.
Encore merci de ton aide.
Bonne continuation
Evelyne
J'ai vu que tu as ajouté des lignes de code :
Application.EnableEvents = False (en début)
Application.EnableEvents = True (en milieu et fin)
Je suis étonnée qu'il de voir une seule False et deux fois True dans ces lignes (je pensais qu'il fallait 2 lignes au total, une pour annuler l'autre). J'ai testé et ça marche !!!
Je ne comprends pas à quoi ça correspond mais je ferai une recherche à ce sujet pour mieux comprendre mon erreur.
En attendant, ça fonctionne.
Encore merci de ton aide.
Bonne continuation
Evelyne
Private Sub Worksheet_Change(ByVal Target As Range) est une procédure évènementielle qui s'exécute automatiquement chaque fois que le contenu d'une ou plusieurs cellules est modifié (évènement Change).
Hors, il se trouve que ta procédure modifie le contenu d'une ou plusieurs cellules, ce qui provoque l'évènement change et donc un appel récursif à cette même procédure qui en modifiant la cellule provoque un autre appel ... ainsi de suite jusqu'à ce que la pile soit pleine et provoque l'erreur.
Pour éviter ce phénomène, il suffit d'interdire la survenue des évènements pendant l'exécution de la procédure (d'où Application.EnableEvents = False).
Il faut aussi penser à rétablir les évènements avant de quitter la procédure, car Excel ne le fait pas automatiquement, d'où les deux Application.EnableEvents = True : un avant l'Exit Sub et l'autre avant le End Sub
Hors, il se trouve que ta procédure modifie le contenu d'une ou plusieurs cellules, ce qui provoque l'évènement change et donc un appel récursif à cette même procédure qui en modifiant la cellule provoque un autre appel ... ainsi de suite jusqu'à ce que la pile soit pleine et provoque l'erreur.
Pour éviter ce phénomène, il suffit d'interdire la survenue des évènements pendant l'exécution de la procédure (d'où Application.EnableEvents = False).
Il faut aussi penser à rétablir les évènements avant de quitter la procédure, car Excel ne le fait pas automatiquement, d'où les deux Application.EnableEvents = True : un avant l'Exit Sub et l'autre avant le End Sub
J'ai essayé ta macro mais ça fait exactement comme pour moi, dès qu'il met en majuscule, il ouvre la macro et ensuite il bug et ferme excel.
Je n'arrive toujours pas à comprendre pourquoi.
J'ai même essayé sur un nouveau classeur au cas ou ce serait mon classeur qui aurait un problème mais en vain.
Je te remercie quand même de ton aide. Je continue mes recherches malgré mes faibles connaissances en ce domaine.
Cordialement
Evelyne