IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Word - macro pour passer de majuscules à minuscules


Sujet :

VBA Word

  1. #1
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut Word - macro pour passer de majuscules à minuscules
    Bonjour,

    Dans des documents word, je dois sélectionner des mots (compris entre deux $) qui sont en majuscules et les faire passer en minuscules (avec la première lettre de chaque mot en majuscules).
    J'ai enregistré une macro en utilisant la fonction "rechercher tout" puis les touches maj F3. Cela marche quand je le fais manuellement, mais avec la macro rien ne se passe, probablement parce que la sélection ne se fait pas correctement.

    Voici la macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub Macro2()
     
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "$*$"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchKashida = False
            .MatchDiacritics = False
            .MatchAlefHamza = False
            .MatchControl = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With
        Selection.Range.Case = wdNextCase
        Selection.Range.Case = wdNextCase
    End Sub
    Que faut-il changer pour que ça marche ?

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Bonjour,

    Il faut que Selection corresponde au document :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Sub Macro2()
     
        ActiveDocument.Select
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "$*$"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchKashida = False
            .MatchDiacritics = False
            .MatchAlefHamza = False
            .MatchControl = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With
        Selection.Range.Case = wdNextCase
        Selection.Range.Case = wdNextCase
    End Sub

  3. #3
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut Problème de sélection
    Merci, malheureusement ça ne marche pas. Cela sélectionne tout le document et ça transforme tout le texte (et pas seulement les mots compris entre deux $). D'autres suggestions peut-être ?

    Merci d'avance !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Pouvez-vous mettre un exemple en ligne ?

  5. #5
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Un exemple de texte ?
    Et bien, par exemple, ce sont des textes comme ça :

    $ALLEMAGNE$ Total des ventes : 154 066 ; Nombre d’articles : 57.
    Chiffre d'affaires en baisse depuis trois ans.
    $ETATS-UNIS$ Total des ventes : 350 040; Nombre d’articles : 30. ; 3 agences
    $CANADA$ Total des ventes : 75 609 ; Nombre d’articles : 5 ; Recrutement d’un chef d’agence en cours. Prévoir ensuite un renforcement des effectifs au cours du second semestre.
    $COSTA RICA$ Agence en cours de création.

    Je dois transformer tous les noms des pays (qui sont entre deux $) en minuscules (avec une majuscule pour la première lettre). Ensuite, j'enlève les $.

    J'espère que cela vous inspirera. Merci d'avance !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Le copier coller de votre exemple sur un document Word s'inscrit dans un seul paragraphe, est-ce bien ainsi dans votre document ? Pour le savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Sub Test()
     
    Dim DocEnCours As Document
    Dim I As Integer, J As Integer, K As Integer, NbCaracteres As Integer
    Dim TableauDeValeurs As Variant
     
        Set DocEnCours = ActiveDocument
        With DocEnCours
             For I = 1 To .Paragraphs.Count
                 With .Paragraphs(I).Range
                      Debug.Print I & " : " & .Text                        ' Debug.print 1
                      If InStr(1, .Text, "$", vbTextCompare) > 0 Then
                         TableauDeValeurs = Split(.Text, "$")
                         For J = LBound(TableauDeValeurs) To UBound(TableauDeValeurs)
                             NbCaracteres = 0
                             For K = 1 To Len(TableauDeValeurs(J))
                                 Select Case Mid(TableauDeValeurs(J), K, 1)
                                        Case "-", " "
                                             NbCaracteres = NbCaracteres + 1
                                 End Select
                             Next K
     
                             If NbCaracteres <= 1 And TableauDeValeurs(J) <> "" And TableauDeValeurs(J) <> Chr(13) Then
                               ' Debug.Print TableauDeValeurs(J)             ' Debug.print 2
                             End If
     
                         Next J
                      End If
     
                 End With
             Next I
        End With
        Set DocEnCours = Nothing
     
    End Sub
    Sinon, lorsque vous neutralisez le Debug.Print 1 et déneutralisez le Debug.print 2, obtenez-vous tous vos pays dans la fenêtre exécution ? (Alt-G)
    La question est donc, y a-t-il un seul pays par paragraphe ?

  7. #7
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Le nom du pays est toujours en tête de paragraphe et il y a un seul nom de pays par paragraphe.
    Par contre, il y a des paragraphes sans noms de pays.
    J'espère que cela répond à votre question...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Si vous avez vérifié le résultat du code sur votre fichier, vous devriez pouvoir ensuite appliquer votre méthode Find sur le range du paragraphe en cours avec en recherche "$" & TableauDeValeurs(J) & "$".

  9. #9
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Je n'ai pas vraiment tout compris...
    Faut-il remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With Selection.Find
            .Text = "$*$"
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With Selection.Find
            .Text = "$" & TableauDeValeurs(J) & "$"
    Et puis insérer ça dans le code que vous m'avez donné ? Mais à quel endroit ? Avant le premier "End with" ? Ou après ?

    J'ai essayé comme ça, mais ça bute sur la ligne .Text = "$" & TableauDeValeurs(J) & "$".
    ça me dit:
    l'indice n'appartient pas à la sélection.
    Vous dites: "Si vous avez vérifié le résultat du code sur votre fichier", mais si je lance votre code, il ne se passe absolument rien.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Vous dites: "Si vous avez vérifié le résultat du code sur votre fichier", mais si je lance votre code, il ne se passe absolument rien.
    Il faut ouvrir la fenêtre exécution Ctrl-G

  11. #11
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Ok. Je viens de le faire: j'ai la fenêtre exécution qui s'ouvre et dans la fenêtre, j'ai cette ligne:
    1 : $ALLEMAGNE$ Total des ventes : 154 066 ; Nombre d’articles : 57.
    Cela correspond à la première ligne de mon document.

    Que faut-il faire ensuite?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    Relisez le message 6. Neutralisez le Debug.print 1 et déneutrealisez le 2. Vous allez récupérer normalement tous les pays.
    Dès lors que vous avez vos pays, si vous appliquez votre premier code en tant que texte à rechercher, vous obtenir votre résultat, non ?
    Si oui, il faut rendre paramétrique votre premier code pour y passer la sélection (le paragraphe) et le pays.

  13. #13
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Désolée, pour moi c'est du chinois ! Je ne suis pas informaticienne. Je fais des macros sur Word et Excel pour accélérer des traitements répétitifs que je dois faire et j'ai des notions de Visual Basic, c'est tout.

    Je ne comprends pas que ce soit si compliqué alors que la fonction "rechercher tout" de Word me permet précisément d'isoler les mots compris entre deux $. Pourquoi faire intervenir la notion de paragraphe ?

    Merci d'avance pour vos lumières !

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message

    Ok. Relisez le message 6. Neutralisez le Debug.print 1 et déneutrealisez le 2. Vous allez récupérer normalement tous les pays. Qu'est ce que cela donne ?

    Déneutraliser, cela veut dire plus d'apostrophe devant Debug.Print :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                             If NbCaracteres <= 1 And TableauDeValeurs(J) <> "" And TableauDeValeurs(J) <> Chr(13) Then
                                Debug.Print TableauDeValeurs(J)             ' Debug.print 2
                             End If
    Dernière modification par Invité ; 30/07/2020 à 13h27.

  15. #15
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Merci, j'ai (enfin) compris.
    Dans la fenêtre exécution, j'ai maintenant les quatre noms de pays. Comment les faire passer en minuscules dans le document ? Si je comprends bien, la fonction "Rechercher tout" ne sert plus à rien, puisque vous avez isolé ces mots autrement.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    OK !

    Puisqu'on a les mêmes résultats, plutôt que de supprimer votre ancienne procédure, il serait plus judicieux de s'en servir pour faire ce changement sur les valeurs contenues dans la matrice. Pour cela, on va devoir rendre paramétrique votre ancienne procédure pour lui dire que Selection correspond au range du paragraphe en cours, et que la chaîne correspond au pays trouvé.

    Je vous tiens au courant.

  17. #17
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup !

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    A tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Sub MettreEnFormeLesNomsDePays()
     
    Dim DocEnCours As Document
    Dim I As Integer, J As Integer, K As Integer, NbCaracteres As Integer
    Dim TableauDeValeurs As Variant
     
        Set DocEnCours = ActiveDocument
        With DocEnCours
             For I = 1 To .Paragraphs.Count
                 With .Paragraphs(I).Range
                     ' Debug.Print I & " : " & .Text
                      If InStr(1, .Text, "$", vbTextCompare) > 0 Then
                         TableauDeValeurs = Split(.Text, "$")
                         For J = LBound(TableauDeValeurs) To UBound(TableauDeValeurs)
                             NbCaracteres = 0
                             For K = 1 To Len(TableauDeValeurs(J))
                                 Select Case Mid(TableauDeValeurs(J), K, 1)
                                        Case "-", " "
                                             NbCaracteres = NbCaracteres + 1
                                 End Select
                             Next K
     
                             If NbCaracteres <= 1 And TableauDeValeurs(J) <> "" And TableauDeValeurs(J) <> Chr(13) Then
                                .Select
                                MajChaine Selection, TableauDeValeurs(J)
                               ' Debug.Print TableauDeValeurs(J)
                             End If
     
                         Next J
                      End If
     
                 End With
             Next I
        End With
        Set DocEnCours = Nothing
     
    End Sub
     
    Sub MajChaine(ByVal Selection2 As Selection, ByVal TableauValeurs2 As String)
     
    Dim MotFormate As String
     
        MotFormate = UCase(Mid(TableauValeurs2, 1, 1)) & LCase(Mid(TableauValeurs2, 2))
        With Selection2
             With .Find
                 .ClearFormatting
                 .Text = TableauValeurs2
                 .Replacement.Text = MotFormate
                 .ClearFormatting
                 .Execute Replace:=wdReplaceOne, Forward:=True
            End With
        End With
     
    End Sub

  19. #19
    Futur Membre du Club
    Femme Profil pro
    !
    Inscrit en
    Juillet 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : !

    Informations forums :
    Inscription : Juillet 2020
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Merci pour ce nouveau code. J'ai testé: à la fin de l'exécution, le dernier nom de pays "COSTA RICA" est sélectionné. C'est tout, aucune modification du texte.
    En pas à pas détaillé: d'abord, on a la première ligne qui est entièrement sélectionnée, le code renvoie alors à la Sub MajChaine. A l'issue de celle-ci, seul le nom du pays est sélectionné. Puis même chose avec la ligne suivante, etc.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par isamur Voir le message
    OK, c'est le MatchCase = True qui manque dans la procédure MajChaine. J'ai dû le supprimer sans revérifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Sub MajChaine(ByVal Selection2 As Selection, ByVal TableauValeurs2 As String)
     
    Dim MotFormate As String
     
        MotFormate = UCase(Mid(TableauValeurs2, 1, 1)) & LCase(Mid(TableauValeurs2, 2))
        With Selection2
             With .Find
                 .ClearFormatting
                 .Text = TableauValeurs2
                 .MatchCase = True
                 .Replacement.Text = MotFormate
                 .ClearFormatting
                 .Execute Replace:=wdReplaceOne, Forward:=True
            End With
        End With
     
    End Sub
    Sinon, une autre façon de faire avec une seule procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Sub MettreEnFormeLesNomsDePays()
     
    Dim DocEnCours As Document
    Dim I As Integer, J As Integer, K As Integer, NbCaracteres As Integer, IndexMatrice As Integer
    Dim TableauDeValeurs As Variant, TableauPays() As Variant
    Dim MotFormate As String
    Dim MonRange As Range
     
        IndexMatrice = 0
        Set DocEnCours = ActiveDocument
        With DocEnCours
             For I = 1 To .Paragraphs.Count
                 With .Paragraphs(I).Range
                     ' Debug.Print I & " : " & .Text
                      If InStr(1, .Text, "$", vbTextCompare) > 0 Then
                         TableauDeValeurs = Split(.Text, "$")
                         For J = LBound(TableauDeValeurs) To UBound(TableauDeValeurs)
                             NbCaracteres = 0
                             For K = 1 To Len(TableauDeValeurs(J))
                                 Select Case Mid(TableauDeValeurs(J), K, 1)
                                        Case "-", " "
                                             NbCaracteres = NbCaracteres + 1
                                 End Select
                             Next K
     
                             If NbCaracteres <= 1 And TableauDeValeurs(J) <> "" And TableauDeValeurs(J) <> Chr(13) Then
                                .Select
                               ' Debug.Print Selection.Text
                                 ReDim Preserve TableauPays(IndexMatrice)
                                 'MajChaine Selection, TableauDeValeurs(J)
                                 TableauPays(IndexMatrice) = TableauDeValeurs(J)
                                 IndexMatrice = IndexMatrice + 1
                               ' Debug.Print TableauDeValeurs(J)
                             End If
     
                         Next J
                      End If
     
                 End With
             Next I
     
            Selection.HomeKey unit:=wdStory
            Set MonRange = .Content
     
            For IndexMatrice = LBound(TableauPays) To UBound(TableauPays)
                MotFormate = UCase(Mid(TableauPays(IndexMatrice), 1, 1)) & LCase(Mid(TableauPays(IndexMatrice), 2))
                Debug.Print MotFormate
                MonRange.Find.Execute FindText:=TableauPays(IndexMatrice), MatchCase:=True, ReplaceWith:=MotFormate, Replace:=wdReplaceAll
             Next IndexMatrice
     
        End With
     
        Set MonRange = Nothing
        Set DocEnCours = Nothing
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Toutes versions] Macro pour passer la ligne 2 à la suite de la ligne 1
    Par guileo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2017, 12h00
  2. Réponses: 2
    Dernier message: 06/07/2016, 13h35
  3. Réponses: 2
    Dernier message: 07/05/2016, 16h42
  4. Shell - Problème pour gérer les majuscules et minuscules
    Par claralavraie dans le forum Linux
    Réponses: 6
    Dernier message: 11/01/2006, 17h17
  5. Commande pour passer en minuscules ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 09/11/2004, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo