Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 09h52   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 182
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 182
Points : 67
Points : 67
Par défaut tester si un paragraphe contient un tableau

Bonjour,

aujourd'hui je suis face à une difficulté que je n'arrive pas à résoudre directement sur les forums.
je parcours tous les paragraphes d'un document word, et j'ai besoin de savoir si un d'entre eux serait un tableau, comme le style de paragraphe ne me renseigne pas, j'ai cherché un peu et j'ai trouvé deux methodes mais aucune ne me donne satisfaxction

1 compter les tables dans un paragraphe :

documents.paragraphe(i).range.select
selection.tables.count

ça me renvoie toujours 0

2_ verifier l'état du paragraphe

is_table = selection.information(wdwithinTable)

me renvoie toujours false

la seule méthode qui me donne un indication juste est de comparer la position du paragraphe avec celle des tables, mais cette méthode est trés longue et plutôt "éléphantaire".
comme mon document est géant il faut que je trouve une méthode plus élégante

merci pour la réponse si quelqu'un a une bonne idée.
Patnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 15h25   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Un paragraphe ne contient jamais de tableau.

Explique nous ce que tu souhaites faire ?
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 15h49   #3
Membre du Club
 
Inscription : novembre 2007
Messages : 182
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 182
Points : 67
Points : 67
je parcours un doc word paragraphes par paragraphes
j'en récolte les infos comme le titre et le contenu que je filtre et que je traite dans un fichier excel qui va nous servir de base de donnée.

dans certains paragraphes les données sous placées dans un tableau, il faut donc que je puisse faire le lien entre le titre du paragraphe principal et le tableau qui contient les données.

comme tu dis il y a une distinction entre la gestion des paragraphes et des tableau je suis bien embeté pour tracer le tableau sur le titre du paragraphe. c'est l'objet de ma question :
comment tester si un paragraphe contient un tableau et par là récuperer l'index du tableau qui va me permettre d'en extraire les données.

la seule méthode que j'ai pu évaluer est de comparer la position du paragraphe et celle du tableau.

cette méthode a le désavantage d'être trop lourde et prend trop de temps,
les documents que je dois traiter comportent à peu prés 40 000 paragraphes
et 10 000 tableaux.

c'est pour ça qu'on me demande de faire une routine.

merci pour ta réponse
Patnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h06   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Les paragraphes ne contiennent pas de tableau.
On pourrait comparer les tableaux à des shapes, ils sont ancrés à un paragraphe, mais ne sont pas contenu dans ce paragraphe. Ils peuvent être ancrés à un paragraphe et être affiché devant un autre.
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 08h41   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 182
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 182
Points : 67
Points : 67
donc mon pb est insoluble
Patnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 08h59   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,

Insoluble, non, mais tu vas avoir une usine à gaz.

Il faut sélectionner une portion contenue entre deux titres pour en extraire les tableaux, mais tu vas avoir des temps de traitement énormes.

Ou alors travailler en deux temps.

Mais je n'ai pas de piste plus précise.
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 09h29   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 182
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 182
Points : 67
Points : 67
bon j'ai compris je vais faire avec le positionnement, et si les gars râlent je leur dirai de mettre des balises dans les doc pour faciliter le boulot d'analyse.

je deleste cette discussion

merci

à +
Patnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 13h55   #8
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 321
Points : 29 219
Points : 29 219
Salut,
si tu peux mettre des signets, c'est plus facile.
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 23h44   #9
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 377
Points : 3 377
Salut Patnel,

Peux-tu mettre un fichier d'exemple (avec que quelques paragraphes du style 50 et que quelques tables du style 5) si ton document n'est pas confidentiel évidemment et ta macro de parcours des paragraphes et des tableaux ?

Peux-tu nous préciser ce que tu veux faire avec les tableaux, car s'il s'agit de ne rien faire ou des les supprimer, tu vas simplifier énormément ton problème ?

J'ai déjà parcouru des documents comme tu l'indiques pour y supprimer des paragraphes qui ne correspondaient pas à ce que l'on voulait retenir et j'ai utilisé
Code :
selection.information(wdwithinTable)
mais pas toujours, je reconnais car certains comportements de Word sont assez bizarres avec les tableaux.

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 13h24   #10
Membre du Club
 
Inscription : novembre 2007
Messages : 182
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 182
Points : 67
Points : 67
pour sepia je donne je qu'en final j'ai fait ,

en plus j'ai trouvé une solution assez élégante qui correspond à ce que je cherchais

Code :
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
 
Sub traite_gtdb()
' déclarations
Dim TDS_file As Object
Dim M_objdoc As Word.Document
 
Set le_Dossier = ThisWorkbook.Sheets("Tests")
' instance de word
Set TDS_file = New Word.Application
 
'f_TDS = ThisWorkbook.Path & "\doc_testa\" & "CDS_05_005266 rev12.doc"
f_TDS = ThisWorkbook.Path & "\doc_testa\" & "GTDB.doc"
' ouvrir le fichier GTDB
'TDS_file.Visible = True
On Error Resume Next
Set M_objdoc = TDS_file.Documents.Open(f_TDS)
 
'initialisation
le_Dossier.Cells.Clear
le_Dossier.Cells(1, 1).Value = "Numero Test"
le_Dossier.Cells(1, 2).Value = "TITRE"
le_Dossier.Cells(1, 3).Value = "OVERVIEW"
le_Dossier.Cells(1, 4).Value = "PARAMETRE"
le_Dossier.Cells(1, 5).Value = "I/O"
le_Dossier.Cells(1, 6).Value = "FORMAT"
le_Dossier.Cells(1, 7).Value = "USE"
le_Dossier.Cells(1, 8).Value = "N° Diagram"
 
 
    With Columns("G:G")
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlTop
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .ShrinkToFit = False
        .MergeCells = False
    End With
 
 
    With Columns("C:C")
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlTop
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .ShrinkToFit = False
        .MergeCells = False
    End With
 
i_tab = 0
i_diag = 0
T_deb = Time
Ln = 2
N_para = M_objdoc.Paragraphs.Count
 
' analyse du document
    For i_para = 1 To N_para ' voir 2278
 
    le_style = M_objdoc.Paragraphs(i_para).Style
 
 
le_texte = M_objdoc.Paragraphs(i_para).Range.Text
 
        ' definition des filtres
 
' traitement titre 3 : nom et n° du test
pos = InStr(le_style, "Titre 3;H3")
 
If pos > 0 Then
Ln = Ln + 1
pos = InStr(le_texte, ": FF")
titre_test = Left(le_texte, pos - 1)
posi = Len(le_texte) - pos - 1
num_test = Right(le_texte, posi)
 
le_Dossier.Activate
le_Dossier.Cells(Ln, 1).Value = num_test '"Numero Test"
le_Dossier.Cells(Ln, 2).Value = titre_test '"TITRE"
 
pos = 0
End If
 
        ' titre 4 overview
 
pos_T = InStr(le_style, "Titre 4")
pos_l = InStr(le_texte, "Overview")
 
If pos_T > 0 And pos_l > 0 Then
    descri_test = M_objdoc.Paragraphs(i_para + 2).Range.Text
    le_Dossier.Cells(Ln, 3).Value = descri_test
    pos_l = 0
End If
 
          ' tableau
 pos = InStr(le_texte, "List of used variables")
If pos > 0 Then tab_val = True
 
is_tab = M_objdoc.Paragraphs(i_para).Range.Tables.Count
 If is_tab > 0 And tab_val = True Then
 n_l = M_objdoc.Paragraphs(i_para).Range.Tables(1).Rows.Count
 
    For lg = 2 To n_l
    Nom = M_objdoc.Paragraphs(i_para).Range.Tables(1).Cell(lg, 2)
 
    famil = M_objdoc.Paragraphs(i_para).Range.Tables(1).Cell(lg, 3)
    forma = M_objdoc.Paragraphs(i_para).Range.Tables(1).Cell(lg, 4)
    desc = M_objdoc.Paragraphs(i_para).Range.Tables(1).Cell(lg, 5)
 
    le_Dossier.Cells(Ln, "D").Value = Nom
     le_Dossier.Cells(Ln, "E").Value = famil
      le_Dossier.Cells(Ln, "F").Value = forma
       le_Dossier.Cells(Ln, "G").Value = desc
       Ln = Ln + 1
    Next lg
  tab_val = False
  'i_para = i_para + Ln * 5
 End If
 
            ' diagram
 
pos_l = InStr(le_texte, "diagram")
If pos_l > 1 Then
 
'Is_diag = M_objdoc.Paragraphs(i_para).Shapes.Count
 
End If
 
'fin de l'analyse
    Next i_para
fin:
T_fin = Time
 
duree = T_fin - T_deb
le_temps = Format(duree, "h:m:s")
 
 
 
M_objdoc.Close
 
'Quitter l'application Word créée
TDS_file.Quit
'Un peu de ménage
Set TDS_file = Nothing
Set M_objdoc = Nothing
 
 MsgBox le_temps
 
End Sub
je ne donne pas le corps du texte car il est confidentiel
on voit bien la méthode pour savoir si un paragraphe contient un tableau et comment récupérer les données des différents tableaux.

voilà je repasse la discussion en résolue car la solution est interessante
Patnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h51.


 
 
 
 
Partenaires

Hébergement Web