Macro casse Excel

Résolu/Fermé
bececoste - 2 déc. 2009 à 11:36
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010 - 4 déc. 2009 à 07:01
Bonjour,

J'ai toute une colonne contenant du texte avec certains mots en majuscule.

J'aimerais que chaque cellule commence par une majuscule mais en conservant la majuscule existant déjà sur les mots saisis auparavant.

Quel serait le texte de la macro à appliquer pour obtenir ce résultat ?

Merci d'avance pour votre aide.
A voir également:

18 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
2 déc. 2009 à 12:30
Bonjour,

On peut faire une macro mais avec les fonctions Excel c'est possible aussi.
si la colonne de texte est en A par exemple en créant une nouvelle colonne avec la formule suivante :

=MAJUSCULE(GAUCHE(A1;1))&DROITE(A1;NBCAR(A1)-1)

à recopier vers le bas puis en copiant et collage spécial "valeur" de cette colonne dans la colonne A

A+
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
2 déc. 2009 à 12:42
Re bonjour,

Pour répondre exactement à la question, voici quand même le code de la macro qui fait directement la même chose sur la colonne A:
Sub MAJ1()
For Ilig = 1 To Columns("A").Find("*", , , , , xlPrevious).Row
    Cells(Ilig, 1) = StrConv(Cells(Ilig, 1), vbProperCase)
Next Ilig
End Sub


A+
0
Je te remercie infiniment de m'avoir répondu et je suis ravie car la première solution (par la formule) fonctionne à merveille.

Par contre, j'ai pourtant fait un copier-coller de la macro mais je ne peux l'appliquer car le bouton Exécuter, comme les autres d'ailleurs sauf le bouton créer, sont grisés.

Peux-tu me dire où est l'erreur...??

D'autre part, si ce n'est pas trop te demander, pourrais-tu m'expliquer à quoi correspondent les différents éléments de la formule.

Merci beaucoup de ton aide et très bonne nuit
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2009 à 11:34
Bonjour,

Pour le problème du bouton grisé, il s'agit peut-être des options sur la sécurité des macros qui t'empêchent l'éxécution.

Pour l'explication de la formule voici :
GAUCHE(A1;1) prendre le 1° caractère en partant de la gauche de la cellule A1
MAJUSCULE () le mettre en majuscule
DROITE(A1;NBCAR(A1)-1) NBCAR est le nombre de caractères de la chaine en A1 donc cette fonction prend tous les caractères de la chaine en partant de la droite sauf le 1° (d'où le NBCAR-1)

l'opérateur & est la "concaténation" c'est à dire la mise bout à bout de deux chaines de caratères

Donc en résumé on met bout à bout le 1° caratére mis en majuscule avec le reste de la chaine ...

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 12:47
Bonjour pilas31

et merci de ta gentillesse et de ta patience.

Voici une capture du module que j'ai inséré avec le texte de ta macro :

http://img248.imageshack.us/img248/6581/20091203123349.png

Le réglage de mes macros est bien sur "Exécuter toutes les macros".

Pour exécuter la macro (en admettant que la liste à modifier se trouve dans la colonne A), il faut bien sélectionner les éléments de cette colonne et ensuite exécuter la macro. C'est bien cette colonne qui est alors modifiée (alors que pour la formule la modification s'opère sur une colonne vierge).

Ma façon de procéder est-elle exacte ?

Je vais maintenant étudier les informations que tu m'as données sur le code de la formule.

En espérant que tu accepteras de prendre encore de ton temps pour m'aider, je te souhaite un très bon après-midi.
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2009 à 14:09
Attention parceque la fonction comme la formule supposent que l'on travaille sur la colonne A de la feuille active.
Pour travailler sur une colonne quelconque selectionnée on peut modifier la fonction comme cela :

Sub MAJ1()
For Ilig = 1 To Columns(Selection.Column).Find("*", , , , , xlPrevious).Row
    Cells(Ilig, Selection.Column) = StrConv(Cells(Ilig, Selection.Column), vbProperCase)
Next Ilig
End Sub


A+
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 14:16
Suite à mon post de tout à l'heure, je viens de m'apercevoir que lorsque je clique sur la macro, je suis renvoyée à la cellule MAJ ; voir capture :

http://img37.imageshack.us/img37/849/20091203140931.png


J'ai "décortiqué" tes explications concernant la formule et j'ai parfaitement compris. Merci beaucoup. J'ai essayé pour tester de l'appliquer en mettant les 2 premières lettres en majuscules et c'est parfait.
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 14:19
Je viens de voir que nos messages se sont croisés et pour te répondre, je confirme bien que les cellules de texte sont bien sur la colonne A.
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2009 à 14:37
Ok c'est parceque Excel 2007 permet d'utiliser les noms des entêtes de colonnes au lieu des références de cellules ! je n'ai pas trop l'habitude de Excel 2007.
Donc tu as raison il y a un conflit de nom entre la référence "MAJ1" la cellule 1 de la colonne "MAJ". Il suffit sans doute de changer le nom de la macro.

A tester
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 14:55
Invraisemblable !!!

1er cas : je n'ai qu'un module avec ta 1ère macro :

http://img529.imageshack.us/img529/2081/68962275.png

2ème cas : je crée un 2ème module avec ta 2ème macro :

http://img529.imageshack.us/img529/8749/45421848.png


Comme tu peux le constater, si je n'ai qu'une macro, rien ne fonctionne et tout est grisé. Si j'ai les deux macros avec un module pour chacune, les deux macros fonctionnent car rien n'est grisé. As-tu une explication à cela ???



En outre, j'ai tout supprimé et suis repartie de zéro et n'ai pu reproduire ce qui s'est produit sur ma capture jointe à 16 h 17 ??!!
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 15:09
Je découvre ton post de 14 h 37 et comme tu le suggères, j'ai changé le nom de la macro et elle fonctionne à merveille ! Tu avais donc raison, il s'agissait bien d'un conflit avec les noms des en-têtes de colonnes. A ce propos, je suis en train de tester Office 2010...

Par contre, il y a un autre petit souci, c'est que ce sont tous les mots de la cellule qui ont leur première lettre en majuscule....

J'abuse vraiment de ton temps et s'il en est ainsi, dis-le moi et je comprendrai tout à fait. Mais je cherche toujours à m'améliorer...
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2009 à 17:41
Bonsoir,

Je viens de me pencher sur l'idée de mettre en majuscule la première lettre de chaque mot.
Je te propose la macro suivante :

Sub Mettre_en_Majuscule()
For Ilig = 1 To Columns(Selection.Column).Find("*", , , , , xlPrevious).Row
    MaListe = Split(Cells(Ilig, Selection.Column))
    For MonMot = 0 To UBound(MaListe)
        MaListe(MonMot) = StrConv(MaListe(MonMot), vbProperCase)
    Next MonMot
    Cells(Ilig, Selection.Column) = Join(MaListe)
Next Ilig
End Sub


C'est un peu plus complexe mais ça fonctionne chez moi

A+
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 17:45
Non, justement, je ne veux pas mettre chaque mot avec une majuscule mais simplement le premier de la cellule...
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2009 à 17:52
Oui au temps pour moi j'ai été trop rapide j'ai fais une macro plus complexe qui fait la même chose !!!
Voila une macro qui ressemble plus à ton souhait:

Sub Mettre_en_Majuscule()
For Ilig = 1 To Columns(Selection.Column).Find("*", , , , , xlPrevious).Row
    If Cells(Ilig, Selection.Column) <> "" Then
        MaListe = Split(Cells(Ilig, Selection.Column))
        MaListe(0) = StrConv(MaListe(0), vbProperCase)
        Cells(Ilig, Selection.Column) = Join(MaListe)
    End If
Next Ilig
End Sub


Enfin je crois ...
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 22:54
Génial !!!

C'est exactement ce que je voulais. Macro créée et mise en icône dans la barre d'outils accès rapide afin de rejoindre ses "petites soeurs".

Merci beaucoup de toutes tes explications qui ont été d'une grande clarté. Peut-être à très bientôt car je sais que j'avais besoin d'un autre renseignement concernant Office mais il m'est complètement sorti de l'esprit présentement...

Très bonne nuit.
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
3 déc. 2009 à 23:30
Je n'aurai pas tarder à revenir à la charge !

La macro s'applique à toute la colonne même si l'on clique dans une seule cellule. N'y aurait-il pas possibilité qu'elle ne s'applique qu'à une sélection précise.

Je remarque également qu'il n'y a pas possibilité d'annuler une manip faite par macro. Je n'avais jamais remarqué cela auparavant. Est-ce normal ou est-ce un bug de la version 2010 ?
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
4 déc. 2009 à 01:01
Bonsoir,

Pour le Undo ce n'est pas possible car le Undo ne peut annuler que les frappes de l'utilisateur
Pour travailler sur la selection seulement voila une possibilité :

Sub Mettre_en_Majuscule2()
For Each MaCell In Selection
    If MaCell.Value <> "" Then
        MaListe = Split(MaCell.Value)
        MaListe(0) = StrConv(MaListe(0), vbProperCase)
        MaCell.Value = Join(MaListe)
    End If
Next MaCell
End Sub


A+
0
bececoste Messages postés 60 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 juin 2010
4 déc. 2009 à 07:01
Bonjour

Parfait, cette fois, je crois que je ne peux avoir mieux.

Pour le Undo, si j'ai bien compris, à moins d'avoir une autre macro qui annule l'action de celle que l'on vient d'exécuter (ce que j'ai pour certaines macros), la seule solution pour revenir en arrière est d'avoir sauvegardé le classeur auparavant.

Bonne journée et merci encore.
0