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

  1. #1
    Candidat au Club
    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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  3. #3
    Candidat au Club
    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
    Expert éminent sénior
    Citation Envoyé par isamur Voir le message

    Pouvez-vous mettre un exemple en ligne ?
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  5. #5
    Candidat au Club
    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
    Expert éminent sénior
    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 ?
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  7. #7
    Candidat au Club
    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
    Expert éminent sénior
    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) & "$".
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  9. #9
    Candidat au Club
    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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  11. #11
    Candidat au Club
    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
    Expert éminent sénior
    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.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  13. #13
    Candidat au Club
    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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  15. #15
    Candidat au Club
    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
    Expert éminent sénior
    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.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  17. #17
    Candidat au Club
    Merci beaucoup !

  18. #18
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  19. #19
    Candidat au Club
    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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

###raw>template_hook.ano_emploi###