Nom propre excel VBA [Résolu/Fermé]

Signaler
Messages postés
72
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
25 octobre 2018
-
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
-
Bonjour à toutes et tous,

Je voudrais pouvoir appliquer le format nom propre à la cellule B3 et majuscules à la cellule B4 de ma feuille nommée "Saisie 12-13".
J'ai déjà des codes existants dans cette feuille :
Private Sub Worksheet_Change(ByVal Target 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

Dim V As Range
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


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


J'ai trouvé la macro suivante qui fonctionne mais seulement dans une classeur différent. Je ne sais pas où la placer avec celle du dessus car ça bug complètement. Je ne dois surtout pas supprimer la macro du dessus car elle est utilisée.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("B3")) Is Nothing Then
Target.Value = UCase(CStr(Target.Value))
Else:
If Not Intersect(Target, Range("B4")) Is Nothing Then
Target.Value = Application.Proper(CStr(Target.Value))
End If
End If
End Sub

Merci de bien vouloir m'aider à résoudre mon problème.
Cela fait très longtemps que je cherche et je commence à desespérer.
Dans l'attente d'une solution, je continue à me creuser la tête.
Merci d'avance.
Evelyne






2 réponses

Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 672
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
Messages postés
72
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
25 octobre 2018

Merci Patrice,
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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 672
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

Messages postés
72
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
25 octobre 2018

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
Messages postés
8536
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
8 mai 2021
1 672
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