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 :

Parser un document Word


Sujet :

VBA Word

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut Parser un document Word
    Bonjour,

    Le titre est peut-être un peu trop large mais ça pourrait répondre à mon besoin et je n'ai pas trouvé mieux. Je travaille sous Word 2010 mais la question doit être la même pour les autres versions.

    Mon besoin est le suivant : j'utilise une macro pour procéder à des ajustements de la mise en page de quelques éléments sur tout un document (une fois que j'ai fini de rédiger).

    Exemple très concret : je définis généralement un style de corps de texte avec un espace de 6 points après un paragraphe et un autre style de liste avec un espace de seulement 3 points après un paragraphe. Mais dans le cas d'un enchaînement corps de texte -- liste - corps de texte, je veux que l'espace à la fin du dernier paragraphe de ma liste (donc avant le premier paragraphe de corps de texte qui suit cette liste) soit aussi de 6 points (et pas de 3 points comme défini dans le style de liste). Pour cela, je parcours la collection Paragraphs et j'ajuste la mise en page quand je tombe sur cette configuration.

    Je voudrais faire quelque chose de similaire avec des tableaux — ou des figures, le problème serait le même pour ce que j'en sais. Problème, les tableaux ne font pas partie de la même collection que les paragraphes.

    J'avais pensé à énumérer la collection des tableaux mais comment alors désigner le paragraphe qui précède ou suit immédiatement un tableau, d'autant plus qu'il n'existe pas forcément si ce tableau est précédé (ou suivi) d'un autre tableau ou d'une figure ??

    J'ai donc un peu cherché s'il n'existe pas une collection VBA qui contienne tous les éléments dans l'ordre d'un document mais je n'ai rien trouvé.

    J'ai aussi essayé de raisonner « comme un utilisateur » (puisque une bonne partie des bibliothèques VBA sont conçues comme cela), de sélectionner le premier paragraphe puis d'essayer de sélectionner l'élément suivant du document avec la classe Selection. Raté, les méthodes de cette classe qui permettent de le faire demandent de spécifier le type d'élément (paragraphe, tableau, figure, etc.) à sélectionner...

    Bref, ai-je loupé quelque chose ou y a-t-il une astuce ?

    Merci d'avance :-)

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Tu peux restreindre la portée des actions et des recherches, en utilisant l'objet sélection, et/ou l'objet Range.

    Sans avoir (trop) testé mon affaire, voici un exemple pour afficher les phrases du vingt-huitième paragraphe du document actif. (28e paragraphe, parce mon document de test avait une table des matières de 19 lignes. (Cela fait déjà 19 paragraphes.) Pour les "puristes", je me dois de mentionner que je ne garantis absolument pas que c'est la meilleure manière d'afficher les phrases d'un paragraphe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub phrases()
        Dim ledocument As Document
        Set ledocument = ActiveDocument
        ledocument.Select
        Dim paragraphe As Paragraph
        Set paragraphe = Selection.Paragraphs(32)
        For Each phrase In paragraphe.Range.Sentences
            MsgBox (phrase)
        Next
    End Sub
    Ou, pour afficher les phrases d'un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub phrases1()
        Dim ledocument As Document
        Set ledocument = ActiveDocument
        ledocument.Select
        Dim tableau As Table
        Set tableau = Selection.Tables(1)
        For Each phrase In tableau.Range.Sentences
            MsgBox (phrase)
        Next
    End Sub
    P.S. Quand il n'y a rien de sélectionné, la sélection, c'est le pointeur.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Tu peux restreindre la portée des actions et des recherches, en utilisant l'objet sélection, et/ou l'objet Range.
    Merci de ta réponse mais je pense que je n'ai pas dû être assez clair dans mes explications.

    Je vais le dire de manière plus orientée code (mais je préjuge donc de la solution) :

    Je chercher à énumérer tous les éléments d'un document (paragraphes, figures et tableaux), dans l'ordre dans lequel ils apparaissent dans le document. Imaginons qu'une telle collection existe dans VBA (si c'est le cas je ne l'ai pas trouvée) et qu'elle s'appelle DocItems ; le code de l'exemple que je donnais dans mon premier post ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim i as Long
     
    For i=1 To DocItems.Count
     
        If DocItems(i).Style Like "*Liste*" And Not DocItems(i+1).Style Like "*Liste*" Then
            DocItems(i).SpaceAfter = 6
            DocItems(i).KeepWithNext = False
        End If
     
    Next i

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Passer par du VBA sera très compliqué.

    Si tu en as la possibilité, il faut utiliser du .net qui permet de travailler directement sur le xml du document.

    Essaie de voir sur le forum .net si il n'y a rien d'utilisable.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Hello,

    Citation Envoyé par Heureux-oli Voir le message
    Si tu en as la possibilité, il faut utiliser du .net qui permet de travailler directement sur le xml du document.
    Effectivement c'est ce que je pressentais après avoir vu le modèle objet de Word dans l'API VBA. J'ai d'ailleurs posé la question (un peu différemment) sur Stackoverflow et la réponse est similaire.

    J'ai fait une rapide recherche sur le forum .NET et y'a quand même beaucoup de sujets en rapport avec Word… Juste pour que je parte dans la bonne direction, tu faisais référence à un truc comme VSTO — mais il me semble qu'il faut une version payante de VS, ce qui n'est pas mon cas — ou quelque chose de plus « bas niveau » ?

    EDIT : une rapide recherche Google fait sortir aussi cette bibliothèque tierce, une idée de ce que ça vaut vis-à-vis de mon besoin ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Je ne pensais pas à VSTO.
    il y a quelques temps, Microsoft fournissait une version gratuite de sa suite de développement.
    Je ne sais pas si c'est toujours le cas.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour à vous 2

    Une réponse en vrac.

    Microsoft offre toujours une version gratuite de Visual Studio du nom de Visual Studio Express en, disons, 3 "sous-versions".

    Visual Studio Express pour Desktop:
    Utilisable avec Windows 7 et probablement Windows Vista
    Ne supporte pas ASP.net et Silverlight

    Visual Studio Express pour Windows 8:

    Ne fonctionne pas avec Windows 7. N'est même pas installable sur Windows 7

    Visual Studio Express pour le Web.

    Supporte ASP.net et Silverlight.

    Aucune de ces versions ne supporte VSTO. (C'est l'expérience qui parle.) Par contre, elles peuvent piloter Office par automation. Elles ont également un support très limité pour les extensions de VS. (Seulement NuGet et quelques autres)

    Cependant, Microsoft offrait, et je pense qu'ils l'offrent toujours, d'essayer gratuitement pendant quelques semaines une version payante de Visual Studio, qui devrait supporter VSTO.

    Ce qu'il est possible de faire, avec les versions payantes et gratuites c'est d'utiliser des outils du Framework pour le XML pour traiter les fichiers Office comme tout autre fichier XML ou encore de télécharger le SDK Open XML (2.5), dédié aux fichiers Word, Excel et PowerPoint. Même qu'il est possible d'ajouter les fichiers d'aide du SDK (2.0) à l'aide de VS 2013.

    Pour les binaires du SDK (obligatoires avec VS), la documentation en local (indépendante de l'aide de VS) et une "visionneuse":

    http://www.microsoft.com/en-us/downl....aspx?id=30425

    Pour la documentation en ligne du SDK:

    http://msdn.microsoft.com/fr-fr/libr...ffice.15).aspx

    Un site (Microsoft) dédié à Open XML, avec des liens vers des articles et des exemples

    http://openxmldeveloper.org/default.aspx?PageIndex=2
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    ça c'est de l'info !
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Salut clementmarcotte,

    Merci beaucoup :-)

    J'ai également trouvé les articles suivants pour une introduction à OpenXML :

    http://badger.developpez.com/tutorie...-word-openxml/
    http://www.codeproject.com/Articles/...ng-the-Open-XM

    Maintenant je n'ai plus qu'à trouver un peu de temps pour m'y mettre !

Discussions similaires

  1. [Word] Parser un document Word
    Par Ethylene dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/10/2006, 13h24
  2. Réponses: 11
    Dernier message: 26/04/2005, 09h23
  3. parser un document
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 02/04/2005, 18h01
  4. Insertion document word
    Par julien41 dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/02/2004, 14h04
  5. [VB6] Erreur lors de l'ouverture d'un document Word
    Par Marco le Pouillot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/01/2003, 09h30

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