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 19/10/2011, 14h30   #1
Candidat au titre de Membre du Club
 
Steve
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Steve
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 11
Points : 11
Par défaut Comment copier des tableaux d'un document à l'autre ?

Salut,

J'ai une macro qui parcours l'ensemble des paragraphes d'un document, puis qui créer des nouveaux paragraphes dans un autre document avec style dépendant d'une règle métier :

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
Private Sub Copy()
    Dim newDoc As Document
    Dim srcDoc As Document
 
    Set srcDoc = Application.ActiveDocument
    Set newDoc = Application.Documents.Add
 
    Dim srcPar As Paragraph ' the paragraph to copy
    For Each srcPar In srcDoc.Paragraphs
        CopyAndTransformParagraph(srcPar, srcDoc, newDoc)      
    Next
end sub
 
Private Function CopyAndTransformParagraph(srcPar As Paragraph, srcDoc As Document, newDoc As Document, previousPar As Paragraph) As Paragraph
    Dim parText As String
    parText = Trim(srcPar.Range.Text)
    ' check all rules for importing a document
 
    if Rule1(parText) then 
        ImportWithStyle(srcPar, srcDoc, newDoc, "Style when rule 1")
    elseif
        ImportWithStyle(srcPar, srcDoc, newDoc, "Style when rule 2")
    else
        ImportWithStyle(srcPar, srcDoc, newDoc, "Style when else")
    end if
 
End Function
 
Private Function ImportWithStyle(srcPar As Paragraph, srcDoc As Document, newDoc As Document, styleName As String) As Paragraph
    Dim newPar As Paragraph
 
    Dim r As Range
    Set r = newDoc.Content
    r.Collapse direction:=WdCollapseDirection.wdCollapseEnd
    r.FormattedText = srcPar.Range.FormattedText
    r.style = newDoc.Styles(styleName)
 
    Set ImportWithStyle = newDoc.Paragraphs(newDoc.Paragraphs.Count - 1)
End Function
Ce code fonctionne très bien tant que je n'ai pas de tableau dans mon document source.

Si j'ai un tableau, on dirait qu'il prends le contenu du paragraphe, en ignorant le tableau lui même...

Comment puis-je modifier mon code pour copier les tableaux dans leur intégralité ? Je n'ai pas de règle à appliquer... juste copier le tableau "dans le flux" des paragraphes.

Merci
steveb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 15h03   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 336
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 336
Points : 29 243
Points : 29 243
Salut,

Le principe serait de tester si le paragraphe est dans un table, si c'est le cas, on copie la table, mais le problème serait pour les paragraphes suivants, on aurait autant de tables que de paragraphes dans les tables.

Donc, il faudrait sélectionner la table et vérifier qu'on ne copie la table que pour le premier paragraphe et que les autres seraient ignorés.


ne serait-ce pas plus facile de modifier le contenu du document et de lui donner un autre nom quand il est terminé ?
Dans ce cas, on peut boucler sur les paragraphes sans problème.
__________________
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 19/10/2011, 15h17   #3
Candidat au titre de Membre du Club
 
Steve
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Steve
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 11
Points : 11
En fait, j'ai simplifié le code pour aller à l'essentiel, mais il faut savoir que dans les règles, on peut ignorer certains documents, modifier le texte, ou effectuer certaines tâches plus complexes.
De plus, j'ai absolument besoin d'avoir un document cible impeccable d'un point de vue styles (une liste finie de styles autorisés). Du coup, ça me semblait plus simple de ne prendre que ce qui m'interesse, plutôt que d'avoir à faire du nettoyage.

Un truc qui peut aider... ma boucle garde en réalité une reférence du dernier paragraphe traité:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ' Define the paragraphs
    Dim srcPar As Paragraph ' the paragraph to copy
    Dim previousPar As Paragraph
 
 
    ' iterate through all paragraphs
    For Each srcPar In srcDoc.Paragraphs
        Dim newPar As Paragraph
 
 
 
        Set newPar = CopyAndTransformParagraph(srcPar, srcDoc, newDoc, previousPar)
        If Not newPar Is Nothing Then
            If newPar.style <> "Ignore" Then Set previousPar = newPar ' keep a track of the last non-ignored paragraph
        End If
 
    Next
Peut-être peut on réutiliser le previousPar pour savoir si on est dans un tableau ou non ?

En admettant que je trouve l'algo qui va bien, comment est ce que je peut, à partir du premier paragraphe dans un tableau, détecter qu'on soit dans un tableau puis copier le tableau en question ?

merci
steveb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 18h38   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 336
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 336
Points : 29 243
Points : 29 243
Salut,

Pour savoir si on se trouve dans un tableau, il faut passer par un objet selection.

Code :
Selection.Information(wdWithInTable)
Renvoie True si la selection est dans une table.
__________________
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 20/10/2011, 10h56   #5
Candidat au titre de Membre du Club
 
Steve
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Steve
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 11
Points : 11
Merci pour ton aide !

Je m'en suis sorti en modifiant ma boucle comme ceci :

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
Private Sub Copy()
    Dim newDoc As Document
    Dim srcDoc As Document
    Dim isInTable As Boolean
 
    isInTable = False
    Set srcDoc = Application.ActiveDocument
    Set newDoc = Application.Documents.Add
 
    Dim srcPar As Paragraph ' the paragraph to copy
    For Each srcPar In srcDoc.Paragraphs
        If srcPar.Range.Information(wdWithInTable) Then
            If Not isInTable Then CopyTable srcPar.Range.Tables(0), newDoc
            isInTable = True
        Else
            isInTable = False       
            CopyAndTransformParagraph(srcPar, srcDoc, newDoc)  
        End if    
    Next
end sub
 
Public Sub CopyTable(sourceTable As Table, newDoc As Document)
    sourceTable.Range.Copy
    With newDoc.Range
        .Collapse direction:=WdCollapseDirection.wdCollapseEnd
        .Paste
    End With
End Sub
steveb 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 16h10.


 
 
 
 
Partenaires

Hébergement Web