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


Sujet :

VBA Word

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut Parser un document
    Bonjour,
    Je viens de m'inscrire sur ce forum car j'ai une problématique pour automatiser une opération en vba.
    Je connais déjà le vba dans Excel mais j'ai l'impression de ne rien maitriser dans Word tellement les choses me paraissent différentes.
    Je m'explique.
    J'ai un document s'apparentant à une "base de données".
    Chaque "produit" est toujours du type :
    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
    TITRE (en majuscule)
     
    commentaire1
     
    DESCRIPTION : bla bla bla....
     
    CHOIX DU SOL : bla bla bla....
     
    SEMIS : bla bla bla....
     
    CULTURE : bla bla bla....
     
    RECOLTE : bla bla bla....
     
    CONSEILS : bla bla bla....
     
    FLORAISON : bla bla bla....
     
    UTILISATION : bla bla bla....
     
    commentaire2
    il y a toujours une ligne vide entre chaque paragraphe.
    Certaines infos ne peuvent pas être présentes sur certains produits.

    Au final j'aimerai récupéré les données de façon tabulée pour les mettre dans un fichier Excel avec les colonnes : TITRE, COMMENTAIRE1, DESCRITPTION, CHOIX DU SOL, SEMIS, CULTURE, RECOLTE, CONSEILS, FLORAISON, UTILISATION, COMMENTAIRE2

    J'avais donc pensé balayer le document et enregistrer chez infos dans un array :
    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
     
    array(
        [0] => array( 
                   ['TITRE'] => le titre du produit 1
                   ['DESCRIPTION'] => la description du produit 1
                   ['CHOIX DU SOL'] => choix du sol du produit 1
                   ['SEMIS'] => semis du produit 1
                   ['CULTURE'] => culture du produit 1
                   ['RECOLTE'] => recolte du produit 1
                   ['CONSEILS'] => conseils du produit 1
                   ['FLORAISON'] => floraison du produit 1
                   ['UTILISATION'] => utilisation du produit 1
                   ['COMMENTAIRE1'] => le commentaire1 du produit 1
                   ['COMMENTAIRE2'] => le commentaire2 du produit 1
                   )
        [1] => array( 
                   ['TITRE'] => le titre du produit 2
                   ['DESCRIPTION'] => la description du produit 2
                   ['CHOIX DU SOL'] => choix du sol du produit 2
                   ['SEMIS'] => semis du produit 2
                   ['CULTURE'] => culture du produit 2
                   ['RECOLTE'] => recolte du produit 2
                   ['CONSEILS'] => conseils du produit 2
                   ['FLORAISON'] => floraison du produit 2
                   ['UTILISATION'] => utilisation du produit 2
                   ['COMMENTAIRE1'] => le commentaire1 du produit 2
                   ['COMMENTAIRE2'] => le commentaire2 du produit 2
                   )
    )
    J'ai commencer à réfléchir comment repérer les infos :
    cas 1 : Rechercher des caractères majuscules mais qui ne correspondent pas aux titres (DESCRITPTION, CHOIX DU SOL, SEMIS, CULTURE, RECOLTE, CONSEILS, FLORAISON, UTILISATION) Cette ligne est le titre.
    cas 2 : Si il y a du texte à la suite de cas1 c'est un commentaire1
    cas 3 : Sinon on attaque la répartition des rubriques
    cas 4 : A la fin si on tombe sur du texte qui n'est pas dans le cas 1 c'est un commentaire 2

    Qu'en pensez vous? Cela est il réalisable sachant que mon document contient plus de 2000 paragraphes?
    Merci d'avance pour votre aide

  2. #2
    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,

    Quelle sera la destination finale de ton "document" ?

    Faire un tableau VBA de 2000 éléments n'est pas impossible, mais ça va être lourd.

    Le principe que j'utiliserais !

    Parcourir chaque paragraphe, déterminer sa taille, si le paragraphe est vide, l'ignorer.
    Ensuite, vérifier le premier mot du paragraphe, et en fonction de ce mot lancer un traitement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim pAra As Paragraph
    Dim mOt
     
    For Each pAra In ActiveDocument.Paragraphs
        If pAra.Range.Words(1) = "SEMIS" Then
          MonTraitement
       End If
    Next pAra
    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 !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Bonjour,
    Merci pour ta réponse.

    Le but final de cette macro sera de :
    • Soit générer un fichier texte tabulé
    • Soit générer un fichier Excel


    Je suis d'accord avec le principe que tu me proposes.
    Gérer un array de 2000 éléments je me doute que ce n'est pas le plus "léger" mais je ne sais pas comment mémoriser mes données pour générer au final le fichier voulu.
    Existe t'il des fonctions de création de fichier Excel en vba Word? ou de création de fichier texte tout simplement?

  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,

    Oui, on peut générer et même directement écrire dans des fichiers Excel au départ de Word.

    Petite question, si un champ ne contient pas de données, est-il quand même présent ?

    Pourrais-tu mettre un morceau de ton document sur le forum ?
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Si un champ ne contient pas de données, non il n'est pas présent.

    Voilà un extrait de mon fichier original
    Fichiers attachés Fichiers attachés

  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,

    Après quelques essais, voilà ce que j'obtiens :

    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
     
    Sub ParserDocument()
    Dim xlApp As Excel.Application
    Dim xlWb As Excel.Workbook
    Dim xlWs As Excel.Worksheet
    Dim para As Paragraph
    Dim intVariete As Integer
     
    'affectation des objets Excel
    Set xlApp = New Excel.Application
    Set xlWb = xlApp.Workbooks.Add
    Set xlWs = xlWb.Worksheets(1)
     
    'Au moins une variété de graines
    intVariete = 1
     
    For Each para In ActiveDocument.Paragraphs
        If Len(para.Range.Text) > 2 Then
            'Traitement à faire
            'Debug.Print RTrim(para.Range.Words(1)) & " - " & Len(para.Range.Words(1))
            Select Case Left(para.Range.Words(1), 4)
            Case "DESC"
                xlWs.Cells(intVariete, 2) = Mid(para.Range.Text, 15, Len(para.Range.Text) - 1)
     
     
            Case "CHOI"
                xlWs.Cells(intVariete, 3) = Mid(para.Range.Text, 16, Len(para.Range.Text) - 1)
     
            Case "SEMI"
                xlWs.Cells(intVariete, 4) = Mid(para.Range.Text, 9, Len(para.Range.Text) - 1)
            Case "CULT"
                xlWs.Cells(intVariete, 5) = Mid(para.Range.Text, 11, Len(para.Range.Text) - 1)
            Case "RECO"
                xlWs.Cells(intVariete, 6) = Mid(para.Range.Text, 11, Len(para.Range.Text) - 1)
            Case "CONS"
                xlWs.Cells(intVariete, 7) = Mid(para.Range.Text, 12, Len(para.Range.Text) - 1)
            Case "FLOR"
                xlWs.Cells(intVariete, 8) = Mid(para.Range.Text, 13, Len(para.Range.Text) - 1)
            Case "UTIL"
                xlWs.Cells(intVariete, 9) = Mid(para.Range.Text, 15, Len(para.Range.Text) - 1)
            Case Else
                'Debug.Print InStr(1, UCase(para.Range.Text), "BOC")
                'Si le paragraphe contient Bocquet, il est ignoré
                If InStr(1, UCase(para.Range.Text), "BOC") <> 0 Then
                    'Nom de la variété de graines
                    xlWs.Cells(intVariete, 10) = Mid(para.Range.Text, 1, Len(para.Range.Text) - 1)
                 Else
                    intVariete = intVariete + 1
                    xlWs.Cells(intVariete, 1) = Mid(para.Range.Text, 1, Len(para.Range.Text) - 1)
                    'Titre
                 End If
            End Select
     
     
        End If
    Next para
    xlApp.Visible = True
     
     
    End Sub
    tu dois ajouter au projet la référence à Excel.
    Dans le VBE :
    Outils => Références
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Bonjour,
    Merci pour ta réponse Heureux-oli. Je n'ai pas encore eu le temps de regarder et de tester ta procédure.
    Mais j'espère le faire dans la journée.
    Je te tiens au courant.

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. Parser mon document XML.
    Par Bruno13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2006, 14h30
  3. [Conseil][Amélioration]Parser un Document (JDOM) avec SAX
    Par leminipouce dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 19/12/2005, 14h30
  4. [DOM] Parser un document Html distant
    Par le Daoud dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/05/2005, 14h19
  5. parser un document
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 02/04/2005, 18h01

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