1ère lettre en Majuscule

domeli

XLDnaute Junior
Bonjour

Dans une feuille j'ai ce code que force les Majuscules dans une plage dans une plage de B3 à B29 :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3:B29")) Is Nothing Then Target = UCase(Target)
End Sub

Je souhaiterai la même chose dans la plage de C3 à C29 mais seulement la 1ère lettre en Majuscule en prenant en compte les noms composés.
J'ai essayé d'ajouter :
If Not Intersect(Target, Range("C3:C29")) Is Nothing Then Target = Proper(Target)

Mais évidemment ça ne fonctionne pas.

Un petit coup de main ne serait pas de refus.
Merci
 

domeli

XLDnaute Junior
Bon autant pour moi, j'ai trouvé mon bonheur dans une autre discussion.
Merci à thebenoit59 qui m'a apporté la solution. J'ai adapté son code en changeant juste le n° de colonne et c'est bon :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3:D29")) Is Nothing Then
If Target.Column = 2 Then
Target.Value = UCase(Target.Value)
Else: Target.Value = Application.Proper(Target.Value)
End If
End If
End Sub
 

job75

XLDnaute Barbatruc
Bonjour domeli, Bruno,
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, i&
With [C3:C29] 'modifiable
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        tablo(i, 1) = Application.Proper(tablo(i, 1))
    Next
    Application.EnableEvents = False
    .Value = tablo
    Application.EnableEvents = True
End With
End Sub
A+
 

job75

XLDnaute Barbatruc
Bien sûr sur 2 colonnes :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, i&
With [B3:C29] 'modifiable
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        tablo(i, 1) = UCase(tablo(i, 1))
        tablo(i, 2) = Application.Proper(tablo(i, 2))
    Next
    Application.EnableEvents = False
    .Value = tablo
    Application.EnableEvents = True
End With
End Sub
 

domeli

XLDnaute Junior
Bonsoir Job75

Effectivement c'est bien plus rapide et de plus je n'ai plus le bug quand j'efface 2 cellules en même temps. Merci bien !
J'ai un petit challenge toutefois. Dans ma colonne C (donc avec la 1ère lettre en Majuscule), il se peut que j'ai des sigles comme DT4 ou DT5.
Pour le moment, je n'ai que de DT1 à DT5, mais il se peut que d'autres viennent par la suite.
Un moyen pour qu'ils soient en Majuscules et non seulement la première lettre ?
 

job75

XLDnaute Barbatruc
Dans ma macro précédente vous pouvez par exemple modifier ainsi :
VB:
    For i = 1 To UBound(tablo)
        tablo(i, 1) = UCase(tablo(i, 1))
        If Not tablo(i, 2) Like "DT*" Then tablo(i, 2) = Application.Proper(tablo(i, 2))
    Next
 

job75

XLDnaute Barbatruc
mais si je rentre dt5 on a Dt5.
Tout à fait, il faut donc entrer DT5 pour éviter Application.Proper...

Mais si l'on a à faire à des utilisateurs stupides ou distraits on utilisera :
VB:
    For i = 1 To UBound(tablo)
        tablo(i, 1) = UCase(tablo(i, 1))
        tablo(i, 2) = UCase(tablo(i, 2))
        If Not tablo(i, 2) Like "DT*" Then tablo(i, 2) = Application.Proper(tablo(i, 2))
    Next
 

Pièces jointes

  • Majuscules(2).xlsm
    20.2 KB · Affichages: 7

job75

XLDnaute Barbatruc
Non, il faudra utiliser :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, i&, x$
With [B3:C29] 'modifiable
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        tablo(i, 1) = UCase(tablo(i, 1))
        tablo(i, 2) = UCase(tablo(i, 2))
        x = tablo(i, 2)
        If Not (x Like "DT*" Or x Like "DADA" Or x Like "DODO") Then tablo(i, 2) = Application.Proper(x)
    Next
    Application.EnableEvents = False
    .Value = tablo
    Application.EnableEvents = True
End With
End Sub
 

Pièces jointes

  • Majuscules(3).xlsm
    20.5 KB · Affichages: 5

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260