Se connecter avec
S'enregistrer | Connectez-vous

Forcer la saisie en majuscules sur feuille Excel 2007

Dernière réponse : dans Programmation

Bonjour,

Je souhaiterais que certaines colonnes de ma feuille excel (NOM, VILLE, PAYS, etc.) se mettent automatiquement en majuscule, quelque soit la casse qu'on avait utiliser pour entrer la donnée. J'avais réussi à mettre ça en place sur un autre fichier Excel mais 2003 et mon code ne fonctionne pas sur mon fichier Excel 2007.
J'ai regardé dans le forum et je ne vois pas de réponde à ce problème précis.

Un coup de main svp?

Merci,
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Oki, donc ça marche : la fonction est bien appelée. (Quand on copie des macros d'une feuille à l'autre, ce n'est pas évident).

Par contre, est-ce que l'un des "Et hop !" est affiché ?

Maintenant, réfléchissons. Worksheet_Change est appelée à chaque fois qu'une modification dans la feuille est faite. Or, Worksheet_Change fait elle même des modifications dans la feuille. Donc indirectement la fonction s'appelle elle-même. Il faut donc, comme dans tout code récursif, avoir une condition d'arrêt.

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub
  3. Select Case Target.Column
  4. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  5. If Target.Value <> UCase$(Target.Value) Then
  6. Target.Value = UCase$(Target.Value)
  7. Msgbox "Et hop, un UCASE sur la colonne " & Target.Column
  8. End If
  9. Case 14
  10. If Target.Value <> StrConv(Target.Value, vbProperCase) Then
  11. Target.Value = StrConv(Target.Value, vbProperCase)
  12. Msgbox "Et hop, un STRCONV sur la colonne " & Target.Column
  13. End If
  14. End Select
  15. End Sub
Expert Programmation

Non mais quel pédant ce modo "programmation" !

duncan2idaho, va dans les propriétés de la cellule concernée, dans police, trouve l'attribut majuscule. C'est tout ;) 
Expert Programmation

Arfff, je retire ce que j'ai fais alors. Tu veux vraiment une macro en VB pour faire ça ?
Alors là, faut que le modo Windows me renvoie ton topic, et on va rapidement arranger ton affaire.

En attendant, donne nous ton code VB ancienne version.

Voici l'ancien code:

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub '<-- pour éviter que ça coince si on sélectionne plusieurs cellules
  3. Select Case Target.Column
  4. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  5. Target.Value = UCase$(Target.Value)
  6. Case 14
  7. Target.Value = StrConv(Target.Value, vbProperCase)
  8. End Select
  9. End Sub


Merci :) 
Expert Programmation

Ben si tu te retrouves à ne pas mettre ton code entre balise [code] sur le forum programmation, tu vas te faire engueuler par le modo. Mais là, on est en Windows, alors c'est cool :sol: 

(C'est pas une raison pour ne pas le faire quand même.)

Ben qu'est-ce qui ne marche pas ?
Qu'est-ce qu'il dit comme erreur (numéro, message, ligne) ?
As-tu pris la précaution de mettre Option Explicit en haut de ton code ?

Ouh la la, tout ça c'est du chinois pour moi lol.

Alors, le code ne fonctionne simplement pas. Pour la colonne 3 à 13, par exemple, les mots sont sensés se mettre en majuscules et ça ne le fait pas. Pas de message d'erreur. C'est aussi simple et embêtant que ça :( 
C quoi "option explicit"?

Citation :
Ouh la la, tout ça c'est du chinois pour moi lol.

Alors, le code ne fonctionne simplement pas. Pour la colonne 3 à 13, par exemple, les mots sont sensés se mettre en majuscules et ça ne le fait pas. Pas de message d'erreur. C'est aussi simple et embêtant que ça :( 
C quoi "option explicit"?

Option explicit c'est pour te forcer a déclarer tes variables et leurs types. C'est une façon d'arranger un peu le coté "sale" du vb en générale ^^
Expert Programmation

Citation :
Ah ok, et comment on fait ça? Ca va rêgler mon problème de code qui ne marche pas?

Non... Mais cela t'obligera à faire du code propre pour ne pas te faire crier dessus par VB, ce qui ne peut pas faire de mal et pourrait te permettre de localiser des erreurs. :D 
Expert Programmation

On est de retour chez le grand zeb! :lol: 

Je te conseille d'éditer le message avec ton morceau de code et d'ajouter une balise avant le début du code et la même avec un "/" devant le "b" à la fin du code.

Comme cela ton code sera plus clair... et tu seras en édéquation avec les règles de la rubrique programmation... ;) 
Expert Programmation

:heink: 

Je suis une andouille!!! (c'est le comble pour un cochon! [:storos:6])

Excuse-moi, je t'ai dit n'importe quoi: il faut mettre "code" à la place de "b" dans tes balises! ("b" c'est pour mettre en gras...). ;) 

EDIT: J'vais aller grignoter quelque chose, je dois manquer d'énergie... :miam: 
Expert Programmation

duncan2idaho: En fait, c'est [code], pas . Mais je vais le faire pour toi. Tu vas voir le résultat est très beau :) 

Storos, un petit smiley rien que pour toi :

Expert Programmation

Bon, alors mon cher Duncan to Idaho, voyons un peu mieux ton problème.

Quand on te propose Option ou Explicit ou n'importe quoi d'autre, on attend de toi que tu te précipites sur l'aide en ligne pour savoir de quoi il s'agit. On ne sait jamais : on trouve bien des cochons pour te dire [ b ] à la place de [ code ], alors pourquoi pas des salauds pour te faire faire ShellExecute("Format C:") (<--- ne pas le faire, hein :o  !)

Mais avec les explications d'Alexandre et un peu de recherche personnelle, tu sais ce que c'est, et bien sûr, tu l'as mis dans ton code.

---------------------------------------

Maintenant, cherchons d'où vient ton erreur. C'est l'art délicat du débogage. J'ai fait un topo là-dessus. VB est facile à mal écrire, en revanche, il est facile à déboguer.

On ajoute des MsgBox partout et on change une valeur dans votre feuille :

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.  
  3. MsgBox "On entre dans la procédure"
  4.  
  5. If Target.Count > 1 Then Exit Sub '<-- pour éviter que ça coince si on sélectionne plusieurs cellules
  6.  
  7. MsgBox "La zone ne contient qu'une cellule"
  8. Msgbox "Voici son adresse " & Target.Address
  9. Msgbox "Voici sa colonne " & Target.Column
  10.  
  11. Select Case Target.Column
  12. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  13. Target.Value = UCase$(Target.Value)
  14.  
  15. Msgbox "Et hop, un UCASE"
  16.  
  17. Case 14
  18. Target.Value = StrConv(Target.Value, vbProperCase)
  19.  
  20. Msgbox "Et hop, un StrConv"
  21.  
  22. End Select
  23. End Sub


Quels sont les messages ?

Salut, désolé pour hier, mais c'est sur un fichier du boulot.
Alors, j'ai mis le code et grosso modo, j'ai plein de messages qui s'affichent, ça ne s'arrête pas!
"on entre dans la procédure"
"la zone ne contient qu'une cellule"
"voici son adresse $$15043"
"voici sa colonne 4"
et hop, ça recommence avec "on entre dans la procédure"


Expert Programmation

Pas de Hop avec le nouveau code ?

Ajoute ceci à la fin du Select :
  1. ...
  2. Case 14
  3. ...
  4. Case Else
  5. MsgBox "Pas hop. On est sur la colonne " & Target.Column.
  6. End Select
Relance le tout.

---------------------------------------------------

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub ' // <-- pour éviter que ça coince si on sélectionne plusieurs cellules
Mais n'importe quoi, quoi !

Si plusieurs cellules sont à changer, il faut toutes les changer :spamafote: 
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. Dim Cellule As Range
  3. If Target.Count > 1 Then
  4. For Each Cellule In Target
  5. Worksheet_Change Cellule
  6. Next
  7. End If
  8. ...

Avec ce code ça marche, j'ai les "Eh hop" et les infos qui se mettent en majsucule!

  1. 1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. 2. If Target.Count > 1 Then Exit Sub
  3. 3. Select Case Target.Column
  4. 4. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  5. 5. If Target.Value <> UCase$(Target.Value) Then
  6. 6. Target.Value = UCase$(Target.Value)
  7. 7. Msgbox "Et hop, un UCASE sur la colonne " & Target.Column
  8. 8. End If
  9. 9. Case 14
  10. 10. If Target.Value <> StrConv(Target.Value, vbProperCase) Then
  11. 11. Target.Value = StrConv(Target.Value, vbProperCase)
  12. 12. Msgbox "Et hop, un STRCONV sur la colonne " & Target.Column
  13. 13. End If
  14. 14. End Select
  15. 15. End Sub
Expert Programmation

Ben t'as plus qu'à changer le code pour le Target.Count > 1 ( cf. mon dernier message), à virer toutes les MsgBox inutiles, puis à mettre en résolu ce topic.
Expert Programmation

Non - désol'. Je te demande juste de faire ce petit effort toi-même en espérant que cela participe à ta compréhension de l'ensemble. A la rigueur, publie ton résultat, et on te dirait "Roooooménon, pas comme ça !!!" à telle ligne ;) 

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then# For Each Cellule In Target
  3. Worksheet_Change Cellule
  4. Next
  5. End If
  6. Select Case Target.Column
  7. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  8. If Target.Value <> UCase$(Target.Value) Then
  9. Target.Value = UCase$(Target.Value)
  10. End If
  11. Case 14
  12. If Target.Value <> StrConv(Target.Value, vbProperCase) Then
  13. Target.Value = StrConv(Target.Value, vbProperCase)
  14. End If
  15. End Select
  16. End Sub
Expert Programmation

Ben ligne 2, je ne sais pas pourquoi, il y a un # qui traîne. A la place je verrai bien un saut de ligne. Sinon, ça me paraît bon... Y'a encore un petit effort à faire du côté de l'indentation pour prétendre au titre de développeur de l'année ;) 

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then For Each Cellule In Target
  3. Worksheet_Change Cellule
  4. Next
  5. Exit Sub
  6. End If
  7. Select Case Target.Column
  8. Case 3 To 13, 15, 27, 28, 32, 33, 36, 37, 39
  9. If Target.Value <> UCase$(Target.Value) Then
  10. Target.Value = UCase$(Target.Value)
  11. End If
  12. Case 14
  13. If Target.Value <> StrConv(Target.Value, vbProperCase) Then
  14. Target.Value = StrConv(Target.Value, vbProperCase)
  15. End If
  16. End Select
  17. End Sub


Yeah!! J'ai réussi :) !!

Merci, sans vous, je n'y serais jamais arrivé !!
Expert Programmation

Félicitations :sol: 

Ligne 2, tu vas me mettre un retour à la ligne entre Then et For, oui ou [:zeb:4] ?
Pour l'indentation, on ne va pas se formaliser :lol: 

Tu m'élis une meilleure réponse, steuplé ? C'est pour mettre le topic en [résolu].
Lassé par la pub ? Créez un compte