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 :

Comment copier des tableaux d'un document à l'autre ?


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 22
    Points
    22
    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 : 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
    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

  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,

    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    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 : 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
        ' 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

  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,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Information(wdWithInTable)
    Renvoie True si la selection est dans une table.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Merci pour ton aide !

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

    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
    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

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/08/2008, 15h25
  2. Réponses: 3
    Dernier message: 21/06/2007, 18h48
  3. Réponses: 4
    Dernier message: 10/05/2006, 10h36
  4. Réponses: 4
    Dernier message: 09/05/2006, 11h33
  5. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01

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