Partage
  • Partager sur Facebook
  • Partager sur Twitter

Débutante VBA : comprendre instructions du code

Selection.Find.ClearFormatting ?

    5 mars 2019 à 16:59:19

    Bonjour,

    Je suis en train de suivre le tuto VBA pour Microsoft Word et je ne comprends pas vraiment les instructions de l'ordi.

    Le code marche mais je cherche à savoir ce que fait exactement l'ordi.

    Par exemple j'ai cette macro (elle remplace les 5 premiers Titres 2 en Titre 3) :

    Sub Titre_2_vers_Titre_3()
    '
    ' Titre_2_vers_Titre_3 Macro
    ' Change les 3 premiers Titre 2 en Titre 3
    '
    
    '
    '_______________________________________________
    '  Caractéristiques de la recherche
    '_______________________________________________
    '
    Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("Titre 2")
        Selection.Find.Replacement.ClearFormatting
        Selection.Find.Replacement.Style = ActiveDocument.Styles("Titre 3")
        
        With Selection.Find
            .Text = ""
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        
        Selection.Find.Execute
        
    '
    '_______________________________________________
    '  Remplacement Titres 1 à 5
    '_______________________________________________
    '
        For Number = 1 To 5
        
        With Selection
            If .Find.Forward = True Then
                .Collapse Direction:=wdCollapseStart
            Else
                .Collapse Direction:=wdCollapseEnd
            End If
            .Find.Execute Replace:=wdReplaceOne
            If .Find.Forward = True Then
                .Collapse Direction:=wdCollapseEnd
            Else
                .Collapse Direction:=wdCollapseStart
            End If
            
            .Find.Execute
        End With
        
        Next Number
        
    '
    '_______________________________________________
    '  FIN
    '_______________________________________________
    '
    End Sub
    Sub Tous_les_Titres_2_vers_Titres_3()
    '
    ' Tous_les_Titres_2_vers_Titres_3 Macro
    ' Tous les T2 en T3
    '
        Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("Titre 2")
        Selection.Find.Replacement.ClearFormatting
        Selection.Find.Replacement.Style = ActiveDocument.Styles("Titre 3")
        With Selection.Find
            .Text = ""
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub

    J'aimerais par exemple savoir ce que signifie Selection.Find.ClearFormatting.

    Si je traduis mot à mot en anglais ça veut dire "Sélection - trouver - Effacer la mise en forme".
    Mais je ne comprends pas vraiment ce que ça vient faire là.
    Pourquoi est-ce que la macro commence par une sélection? Pourquoi ça n'est pas plutôt Find.Selection ?

    Que signifie wdFindContinue (Word Find Continue? Mot - trouver - continuer ?)

    Que signifie la syntaxe exactement? Par exemple le point (.).

    Parfois j'ai Selection.Find.Execute et parfois j'ai .Find.Execute


    Je sais que je cherche peut-être à couper des cheveux en 4 mais à partir du moment où je ne comprends pas exactement les instructions, je pense que je n'arriverai pas à avancer de manière autonome et que je ferai toujours des macros un peu à tâtons.

    • Partager sur Facebook
    • Partager sur Twitter
      5 mars 2019 à 18:08:22

      Salut,

      Je vais pas répondre aux questions dans l'ordre ^^

      • Pour commencer sur la signification du point '.'

      Il faudrait que tu lises cette page pour comprendre ce qu'est la programmation objet, tu devrais ainsi comprendre à quoi sert le point.

      Hésite pas si tu as encore des questions.

      • Pour "Selection.Find.ClearFormatting"

      L'objet Selection représente ce qui est sélectionné dans le texte, c'est-à-dire le texte qui est surligné ou l'emplacement du curseur si rien n'est surligné.

      L'objet Find permet d'effectuer des opérations de Rechercher & Remplacer exactement comme si tu utilisais la boîte de dialogue (Ctrl+H). Tu peux chercher du texte en fonction de sa mise en forme, utiliser .ClearFormatting permet de remettre à zéro la mise en forme que tu cherches.

      Tu peux faire le test, à la main dans la boîte de dialogue recherche du texte en gras puis ferme la, dans une macro fais tourner uniquement la ligne Selection.Find.ClearFormatting puis ouvre à nouveau la boîte de dialogue, la recherche en gras devrait être absente.

      Ca permet de faire une recherche sans que les recherches précédentes ne viennent intérférer.

      • "Selection.Find" plutôt que "Find.Selection"

      Il faut utiliser la première façon car ça permet de donner un point de départ à la recherche, quand tu fais la recherche à la main, ton curseur est forcément quelque part dans le document.

      • wdFindContinue

      C'est une valeur par défaut de VBA Word, en elle-même elle ne sert pas à grand chose, c'est juste une valeur, par contre suivant par qui elle est utilisée elle va pouvoir définir un comportement, par exemple dans ce cas-là elle est utilisée avec la propriété Wrap de Find. On indique donc qu'on veut continuer si on touche la fin du document (on revient au début) plutôt que d'arrêter la recherche.

      • Parfois j'ai Selection.Find.Execute et parfois j'ai .Find.Execute

      C'est à cause du bloc With ... End With.

      C'est pour éviter d'écrire plusieurs fois la même chose, par exemple lignes 72 à 83 il y a une autre utilisation avec With Selection.Find, si on enlève le bloc With ... End With on devrait écrire :

      Selection.Find.Text = ""
      Selection.Find.Replacement.Text = ""
      Selection.Find.Forward = True
      Selection.Find.Wrap = wdFindContinue
      Selection.Find.Format = True
      Selection.Find.MatchCase = False
      Selection.Find.MatchWholeWord = False
      Selection.Find.MatchWildcards = False
      Selection.Find.MatchSoundsLike = False
      Selection.Find.MatchAllWordForms = False

      Et c'est plutôt chiant à écrire (et ça pique un peu les yeux :) ).

      -
      Edité par Stormweaker 5 mars 2019 à 18:08:54

      • Partager sur Facebook
      • Partager sur Twitter
        6 mars 2019 à 12:42:14

        Ouah merci d'avoir pris le temps de tout m'expliquer pas à pas !

        Alors pour .Find je ne savais pas que c'était un "objet". Vu que je fais le lien avec l'anglais et le verbe "find" je le vois comme une "méthode" même si dans la liste déroulante de l'édition de macros il apparaît en vert avec la petite brique verte.

        Comme par exemple ActiveDocument.PrintOut 

        Il y un moyen de se souvenir des méthodes/objets? J'essayais de faire le lien avec des verbes d'action mais visiblement ça ne marche pas à tous les coups


        D'ailleurs les personnes qui écrivent du VBA elles connaissent par cœur toutes les valeurs? Ou elles utilisent une sorte d'index? Question bête, il y a des gens qui rédigent du VBA à la main?

        Pour .clearformatting c'est une formalité nécessaire donc?

        J'ai fait un test avec une recherche de mots en gras uniquement (j'ai enregistré la macro correspondante à cette recherche) et j'ai bien en premier :

        Selection.Find.Clearformatting
        Selection.Find.Font.Bold = True

        Du coup il efface tous les paramètres de recherche (comme s'il décochait toutes les cases de la fenêtre de recherche), puis il ajoute le paramètre de recherche Police > Gras ?

        Si je supprime Selection.Find.Clearformatting et que je laisse que Selection.Find.Font.Bold = True ça n'impacte en rien la macro?


        Mais pourquoi il ne le met pas dans les infos .Font.Bold dans le bloc WITH vu que c'est des paramètres de recherche?

        J'ai remarqué que dans mon cas précis (la recherche de mots en gras), je pouvais supprimer carrément le bloc WITH. J'ai pensé que d'enlever la propriété Wrap arrêterait la recherche à la fin du document mais ça continue à chercher au début.

        EDIT : j'ai ajouté 

            Selection.Find.Font.Bold = True
            
            With Selection.Find
                .Forward = True
                .Wrap = wdFindStop
            End With
        
            Selection.Find.Execute
        
            MsgBox "Recherche terminée"
        
        End Sub

        Et ça m'affiche la fenêtre d'alerte après chaque recherche.

        Alors que j'aimerais que ça ne s'affiche qu'à la fin du document (une fois qu'il a trouvé tous les mots en gras).

        Je vais regarder le cours VBA pour Excel que tu m'as filé. J'ai peur que ce soit bien plus dur, surtout que je ne maîtrise pas du tout Excel. Mais ça pourrait m'expliquer les (.) dans la programmation objet. :)



        -
        Edité par Tsarina 6 mars 2019 à 12:45:22

        • Partager sur Facebook
        • Partager sur Twitter
          6 mars 2019 à 15:45:18

          • Il y un moyen de se souvenir des méthodes/objets?

          Pas vraiment, ça vient avec l'habitude pour les trucs les plus utilisés, tu peux aussi utiliser l'enregistreur de macros pour voir ce qui est utilisé, et sinon il y a Google :)

          • D'ailleurs les personnes qui écrivent du VBA elles connaissent par cœur toutes les valeurs?Ou elles utilisent une sorte d'index?

          Seulement celles qui sont utilisées le plus souvent. Quand j'ai besoin d'un truc que je ne connais pas, soit j'utilise l'enregistreur de macros pour connaître et ensuite chercher sur Google, soit je demande à Google directement.

          • Question bête, il y a des gens qui rédigent du VBA à la main?

          Oui, moi par exemple :)

          • Pour .clearformatting c'est une formalité nécessaire donc?

          C'est pas nécessaire en soit, la macro tournera si tu ne le mets pas, par contre tu n'as aucune garantie sur les critères de recherche qui sont déjà considérés, si une macro ou un utilisateur a recherché des mots écrits en Arial 12 pts bleu italique, ces critères seront encore utilisés en plus des conditions que tu rajoutes.

          Donc il vaut mieux le mettre à chaque fois.

          • Du coup il efface tous les paramètres de recherche (comme s'il décochait toutes les cases de la fenêtre de recherche), puis il ajoute le paramètre de recherche Police > Gras ?

          C'est ça.

          • Si je supprime Selection.Find.Clearformatting et que je laisse que Selection.Find.Font.Bold= True ça n'impacte en rien la macro?

          Voir ce que j'ai dit au-dessus.

          • Mais pourquoi il ne le met pas dans les infos .Font.Bold dans le bloc WITH vu que c'est des paramètres de recherche?

          A quel endroit ? Dans le code de ton premier message ? Si on veut garder la valeur par défaut ça ne sert à rien de l'écrire.

          • J'ai pensé que d'enlever la propriété Wrap arrêterait la recherche à la fin du document mais ça continue à chercher au début.

          Là je sais pas, c'est peut-être que la valeur par défaut est répétée pour plus de clarté à la lecture du code.

          • Et ça m'affiche la fenêtre d'alerte après chaque recherche. Alors que j'aimerais que ça ne s'affiche qu'à la fin du document (une fois qu'il a trouvé tous les mots en gras).

          C'est normal c'est ce qui est marqué dans le code.

          Find.Execute renvoie True si il a trouvé un élément qui correspond, False sinon. Si tu atteinds la fin du document, Find ne devrait plus rien trouver et donc renvoyer False. Il faut que tu récupères la valeur renvoyée par Find.Execute et que tu la testes pour savoir si tu as fini la recherche.

          • Partager sur Facebook
          • Partager sur Twitter
            11 mars 2019 à 14:21:48

            Super merci pour tes explications ! :)

            Alors pour lire le code enregistré par une macro pas de soucis tant que ce que je veux faire peut-être fait manuellement en cliquant sur des boutons (quand j'enregistre des tâches répétitives).

            Le problème se pose plutôt quand je dois écrire un code à la main sans que je puisse utiliser la fonction Enregistrer Macro.

            Par exemple, je voulais créer une macro dans Outlook pour que les messages d'un certain dossier soient marqués comme "Lus" après 7 jours.

            Pour l'instant Outlook ne me propose que de créer une règle pour marquer tous les messages dans ce dossier comme "Lus" mais j'aimerais qu'il ne les marque pas comme "Lus" d'office, mais bien qu'il attende 7 jours.

            ça demande de connaître les noms exacts des Objets et des méthodes et aussi toute la syntaxe. Comme pour ".clearformatting", en fait sans avoir jamais enregistré de Macro c'est difficile d'arriver à ce raisonnement d'emblée qui est d'abord de "nettoyer" la fenêtre de recherche. Mon cerveau lui aurait commencé direct par une formule du genre :

            Je cherche tel type de mot qui ressemble à ça, ça et ça mais pas à ça.

            Si je trouve --> je le mets en gras.

            Si je ne trouve pas je laisse tomber.

            (Pour l'ordi ce raisonnement est bancal car il manque plein de conditions. Bon heureusement, je ne suis pas un ordi :D)

            J'imagine aussi qu'on ne peut pas utiliser l'enregistreur de macros pour tout ce qui est des "événements", par exemple envoyer un mail automatique tous les mardis à 11h45.

            Ou bien retarder l'envoi de mail à une date précise?

            (je ne sais pas si Outlook propose déjà ces fonctionnalités mais j'aimerais les créer avec du VBA).

            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2019 à 10:42:26

              Tout ça viens avec l'habitude et l'expérience, il faut aussi ne pas avoir peur de chercher sur Google (et en anglais c'est mieux, il y a plus de résulatts pertinents), en général j'y suis 20 % du temps passé à développer une macro :).

              Sinon pour Outlook, j'ai jamais fait de macros dessus donc je ne sais pas si ce que tu veux est possible ni par où commencer.

              • Partager sur Facebook
              • Partager sur Twitter

              Débutante VBA : comprendre instructions du code

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown