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 :

Recherche dans une zone de texte inclue dans un group


Sujet :

VBA Word

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Recherche dans une zone de texte inclue dans un group
    Bonjour,
    Je désire rechercher et copier un texte (en Titre3) qui se trouve dans une zone de texte, elle même inclue dans un groupe.
    Les groupes et zones de texte ont des noms que l'on voit dans le Volet de Sélection.
    La recherche manuelle avancée, permet de rechercher un Style, en l'occurrence un Titre3. Et cela fonctionne bien en exécutant la recherche depuis Word la Recherche avancée.
    J'ai donc enregistré une macro. Mais lorsque je lance la macro, une erreur apparait
    Erreur d'exécution '-2147024909 (80070057) - L'élément portant ce nom est introuvable
    Le code créé par l'enregistrement de la macro est le suivant:
    L'erreur se produit à la ligne 20 ActiveDocument.Shapes.Range(Array("Text Box 4")).
    A ce stade, aucune ligne VBA n'a été ajoutée manuellement, c'est uniquement le code généré par l'enregistrement de 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
    23
    24
    25
    26
    27
    28
    29
    30
    Sub essai16()
    '' essai16 Macro
    '
        Selection.Find.ClearFormatting
        Selection.Find.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
        ActiveDocument.Shapes.Range(Array("Groupe 2")).Select
        ActiveDocument.Shapes.Range(Array("Text Box 4")).Select
        Selection.Find.Execute
        ActiveDocument.Shapes.Range(Array("Group 3")).Select
        ActiveDocument.Shapes.Range(Array("Text Box 4")).Select
        Selection.Find.Execute
        Selection.Find.Execute
        Selection.Find.Execute
        Selection.Find.Execute
        ActiveDocument.Shapes.Range(Array("Groupe 2")).Select
        ActiveDocument.Shapes.Range(Array("Text Box 4")).Select
    End Sub
    Mais évidemment cette macro nomme que cette zone de texte qui se nomme "Texte Box 4" , Je dois rechercher dans tous les groupes et toutes les zones de texte inclues dans le document et qui se nomment différemment,
    On voit dans les captures jointes la construction des Titre3 qui sont inclus dans un groupe,

    J'ai essayé d'utiliser les shapes, mais ne suis pas arrivé à quelque chose de concluant.
    Je dois dire que je ne suis pas expert en VBA.
    Mais j'aurais besoin de faire cela cas mon document à plusieurs centaines de page avec entre 1 et 8 Zones de Textes inclues par pages (toutes en Titre 3 que je veux changer automatiquement en les sortants de ces groupes)
    Une aide me serait très précieuse, cela fait plusieurs jours que je suis à rechercher et essayer des solutions,
    Merci d'avance,
    Jean-Claude
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 347
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par jcm54 Voir le message
    Bonjour,

    Auriez-vous un fichier exemple à mettre en ligne ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour
    Merci. j'ai ajouté le fichier docx dans les documents attachés. C'est un extrait d'un long document sur lequel je fais des essais.
    Si vous avez besoin du fichier DOT (chez moi c'est Normal.dot encore) je veux bien l'ajouter également.
    Belle journée.

  4. #4
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 347
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par jcm54 Voir le message
    Une fois sélectionnée la forme Text Box 4, que faut-il faire ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 347
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par jcm54 Voir le message
    Le code ci-dessous donne les noms des formes contenues dans un groupe :
    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 Test()
     
    Dim I As Integer, J As Integer
    Dim WdDoc As Document
     
        Set WdDoc = ActiveDocument
        With WdDoc
             For I = 1 To .Shapes.Count
                 With .Shapes(I)
                      Select Case .Type
                             Case 6, 9, 13, 17
                                  If .GroupItems.Count > 0 Then
                                     For J = 1 To .GroupItems.Count
                                         Debug.Print I & " : " & .Name & " : " & .Type & " : " & .GroupItems(J).Name & " : " & .GroupItems(J).Type
                                     Next J
                                  End If
                      End Select
                 End With
             Next I
        End With
        Set WdDoc = Nothing
     
    End Sub

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par E KERGRESSE Voir le message
    Une fois sélectionnée la forme Text Box 4, que faut-il faire ?
    Bonjour "E",
    Super merci bcp pour cette aide. Le code pour connaître le nom m'est super utile.

    En résumé, ce que je veux faire, c'est de "sortir" tous les Titre3 de ces montages en groupés en Textbox et Straight Connector et de le placer nomarmalement en Titre3_new (format qui se trouve avec le texte "Essai Titre 3" en page 1.

    C'est à dire,
    - trouver - copier le Titre 3 (qui peut être également sur 2 lignes) de chaque groupe qui contient un texte en Titre 3.
    - sortir du groupe et coller le texte de ce titre avant le paragraphe concerné et le convertir en Titre3_new .
    - puis
    - supprimer tous ces groupes contenant ces Titre3

    Alors c'est vrai, que en tant que novice en VBA c'est un challenge plutôt complexe pour moi.
    Encore merci pour ton aide.

  7. #7
    Membre confirmé
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 347
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par jcm54 Voir le message
    Cela va être compliqué si vous ne maîtrisez pas VBA.
    Le code suivant établit la correspondance des groupes et des paragraphes en regard dans une matrice. Une fois la correspondance établie, il vous faudra insérer un paragraphe, 1 paragraphe au dessus de celui indiqué par MatriceShapes(3, IndexMatrice). Il faut partir de la fin pour ne pas désindexer la boucle.
    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
     
     
    Sub RepererLaPositionDesGroupes()
     
    Dim I As Integer, J As Integer, IndexMatrice As Integer
    Dim WdDoc As Document
    Dim MatriceShapes() As Variant
     
        Set WdDoc = ActiveDocument
        IndexMatrice = 0
     
        With WdDoc
             For I = 1 To .Shapes.Count
                 With .Shapes(I)
                      Select Case .Type
                             Case 6, 9, 13, 17
                                  ReDim Preserve MatriceShapes(3, IndexMatrice)
                                  MatriceShapes(0, IndexMatrice) = .Name
                                  MatriceShapes(1, IndexMatrice) = .Anchor.Information(wdActiveEndPageNumber)
                                  MatriceShapes(2, IndexMatrice) = .Anchor.Information(wdVerticalPositionRelativeToPage)
                                  IndexMatrice = IndexMatrice + 1
                                 ' Debug.Print I & " : " & .Name & " : " _
                                 '              & .Anchor.Information(wdActiveEndPageNumber) & " : " _
                                 '              & .Anchor.Information(wdVerticalPositionRelativeToPage)
                      End Select
                 End With
             Next I
     
     
             For I = .Paragraphs.Count To 1 Step -1
                 With .Paragraphs(I).Range
     
                      For IndexMatrice = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
                          If .Information(wdActiveEndPageNumber) = MatriceShapes(1, IndexMatrice) _
                              And .Information(wdVerticalPositionRelativeToPage) = MatriceShapes(2, IndexMatrice) Then
                              MatriceShapes(3, IndexMatrice) = I
                          End If
                      Next IndexMatrice
     
                     ' Debug.Print I & " : " & .Information(wdActiveEndPageNumber) & " : " _
                     '                          & .Information(wdVerticalPositionRelativeToPage)
                 End With
             Next I
     
        End With
     
        For IndexMatrice = LBound(MatriceShapes, 2) To UBound(MatriceShapes, 2)
            Debug.Print "Page : " & MatriceShapes(1, IndexMatrice) & ", paragraphe : " & MatriceShapes(3, IndexMatrice) & ", shape : " & MatriceShapes(0, IndexMatrice)
        Next IndexMatrice
     
     
        Set WdDoc = Nothing
     
    End Sub

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Après moultes essais, j'aimerais juste trouver un bout de code qui me permet de sortir le curseur de la Zone de Texte (par exemple après avoir sélectionné me contenu de la Text Box 4) et qui le place au début du paragraphe qui ancre le groupe qui contient la texte box.
    C'est pour le moment mon soucis principal.
    Au clavier pour sortir le curseur de la Text Box peut se faire en pressant 2x la touche Esc. En enregistrant un macro cela donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Selection.Copy
        Selection.EscapeKey
        Selection.Collapse
        Selection.EscapeKey
    Mais si j'exécute ceci cela ne sort pas le curseur de la Text Box.
    Si vous pouvez m'aider dans cette manip, c'est déjà un immense pas en avant.

    D'avance merci.



    Le code pour lister les "noms des formes contenues dans un groupe" m'a été bien utile. Mais je n'arrive pas à placer le curseur à l'intérieur en utilisant du code VBA.

    Typiquement le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveDocument.Shapes.Range(Array("Groupe 2")).Select
    ActiveDocument.Shapes.Range(Array("Text Box 4")).Select
    L'exécution de la ligne qui sélectionne le Text box 4 donne une erreur (pas trouvé).

    Donc je n'arrive pas à placer non plus le curseur dans la Text Box 4 (ou autre).

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour à tous. Bonjour E.
    J'espère que vous avez passez de belles et ensoleillées Fêtes Pasquale.
    Je butte toujours sur mon problème à placer et sortit le curseur via VBA ou macro le curseur dans une zone de texte inclue dans un groupe.
    Si quelqu'un à une idée..... merci d'avance.
    JC

  10. #10
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 224
    Points : 443
    Points
    443
    Par défaut
    Bonjour jcm54, Eric, le forum,

    Tu trouveras ci-dessous un code qui semble répondre à ton besoin.
    La procédure :
    • Boucle sur toutes les formes "de base" (en ignorant les groupes) du document actif ;
    • Filtre sur les formes de types texte ;
    • Ajoute un paragraphe avant l’endroit où est ancré le groupe ;
    • Applique le style "Titre 3" au paragraphe créé.


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Public Sub test()
    Dim l_o_shp As Shape
    Dim l_o_parentShape As Shape
    Dim l_o_anchorRange As Range
     
        'boucler sur toutes les formes (de base) du document
        For Each l_o_shp In GetAllShapes(ActiveDocument.Shapes)
            'filtrer sur les formes de type "Zone de texte"
            If l_o_shp.Type = msoTextBox Then
                'récupérer la shape parent (le groupe ou la formes elle-même si elle n'est pas groupée)
                Set l_o_parentShape = GetParentGroup(l_o_shp)
                'si la forme est ancrée à un paragraphe
                If l_o_parentShape.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph Then
                    'récupérer la Range où est positionnée l'ancre
                    Set l_o_anchorRange = l_o_parentShape.Anchor
                    'ajouter le texte et appliquer le style "Titre 3"
                    l_o_anchorRange.Previous(WdUnits.wdParagraph, 1).InsertAfter (l_o_shp.TextFrame.TextRange.Text)
                    l_o_anchorRange.Paragraphs(1).Style = "Titre 3"
                End If
            End If
        Next l_o_shp
    End Sub
     
    Private Function GetParentGroup(p_o_shape As Object) As Object
    Dim l_o_pShape As Object
        On Error Resume Next
         Set l_o_pShape = p_o_shape.ParentGroup
        On Error GoTo 0
        If l_o_pShape Is Nothing Then Set GetParentGroup = p_o_shape Else Set GetParentGroup = GetParentGroup(l_o_pShape)
    End Function
     
    Private Function GetAllShapes(p_o_shapes As Object) As VBA.Collection
    Dim l_o_shape As Object
    Dim l_o_shapeGroup As Object
    Dim l_o_resColl As VBA.Collection
    Dim l_o_groupsColl As VBA.Collection
    Dim l_o_subResColl As VBA.Collection
     
     
        Set l_o_resColl = New VBA.Collection
        Set l_o_groupsColl = New VBA.Collection
     
        If TypeName(p_o_shapes) = "Shapes" Then
            For Each l_o_shape In p_o_shapes
                l_o_groupsColl.Add l_o_shape
            Next l_o_shape
        ElseIf TypeName(p_o_shapes) = "Shape" Then
            If p_o_shapes.Type = Office.MsoShapeType.msoGroup Then
                For Each l_o_shapeGroup In p_o_shapes.GroupItems
                    l_o_groupsColl.Add l_o_shapeGroup
                Next l_o_shapeGroup
            Else
                l_o_resColl.Add p_o_shapes
            End If
        End If
     
        For Each l_o_shapeGroup In l_o_groupsColl
            Set l_o_subResColl = GetAllShapes(l_o_shapeGroup)
            For Each l_o_shape In l_o_subResColl
                l_o_resColl.Add l_o_shape
            Next l_o_shape
        Next l_o_shapeGroup
     
        Set GetAllShapes = l_o_resColl
     
        Set l_o_shape = Nothing
        Set l_o_shapeGroup = Nothing
        Set l_o_resColl = Nothing
        Set l_o_groupsColl = Nothing
        Set l_o_subResColl = Nothing
    End Function
    Le code utilise la fonction GetAllShapes qui permet d’extraire toutes les "formes de bases" à partir d’un groupe ou d’une collection de Shapes.
    Elle fonctionne pour les Shapes de Word, Excel et PowerPoint.

    A+

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Hello Romain.
    Ca marche !!!!! bcp bcp, c'est super, cela m'enlève un grosse épine du pied.
    Très belle continuation.

    Jean-Claude

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Août 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Hello Romain.
    Juste besoin d'une petite aide à nouveau.
    L'action doit se faire uniquement si le texte (contenu) dans la TextBox est en style "Titre 3".
    Je vois que l'auteur du doc a inséré des zones de textes partout et ton code applique cela aussi à ces Textes Box.

    J'ai joint un extrait qui contient de telles situations dans le doc Essai_5.doc


    un immense merci d'avance.
    Jean-Claude
    Fichiers attachés Fichiers attachés

  13. #13
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 224
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Tu peux essayer avec cette modification :
    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
    Public Sub test()
    Dim l_o_shp As Shape
    Dim l_o_parentShape As Shape
    Dim l_o_anchorRange As Range
     
        'boucler sur toutes les formes (de base) du document
        For Each l_o_shp In GetAllShapes(ActiveDocument.Shapes)
            'filtrer sur les formes de type "Zone de texte"
            If l_o_shp.Type = msoTextBox Then
                If l_o_shp.TextFrame.TextRange.Style = "Titre 3" Then
                    'récupérer la shape parent (le groupe ou la formes elle-même si elle n'est pas groupée)
                    Set l_o_parentShape = GetParentGroup(l_o_shp)
                    'si la forme est ancrée à un paragraphe
                    If l_o_parentShape.RelativeVerticalPosition = wdRelativeVerticalPositionParagraph Then
                        'récupérer la Range où est positionnée l'ancre
                        Set l_o_anchorRange = l_o_parentShape.Anchor
                        'ajouter le texte et appliquer le style "Titre 3"
                        l_o_anchorRange.Previous(WdUnits.wdParagraph, 1).InsertAfter (l_o_shp.TextFrame.TextRange.Text)
                        l_o_anchorRange.Paragraphs(1).Style = "Titre 3"
                    End If
                End If
            End If
        Next l_o_shp
    End Sub
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2016] Recherche depuis une zone de texte ne fonctionne pas
    Par developpécouché dans le forum VBA Access
    Réponses: 19
    Dernier message: 09/06/2017, 18h02
  2. [AC-2003] Recherche multiple dans une zone de texte
    Par Orakle dans le forum IHM
    Réponses: 10
    Dernier message: 23/02/2010, 13h57
  3. [WD-2000] Rechercher-remplacer dans une zone de texte
    Par tegestobis dans le forum VBA Word
    Réponses: 4
    Dernier message: 04/09/2009, 14h35
  4. [A-02] Recherche aphabetique dans une zone de texte
    Par jacques64 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/12/2008, 22h17
  5. Réponses: 40
    Dernier message: 24/02/2006, 14h19

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