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

Macros et VBA Excel Discussion :

VBA - Export Excel → Word


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut VBA - Export Excel → Word
    Bonjour à tous,

    Pour plus de lisibilité, je créé ce topic avec les mises à jour qui s'imposent.

    J'ai un fichier excel, d'une dizaine d'onglets, qui me sort au final 3 onglets utiles, synthétiques, mis en forme et qu'il faut que j'exporte sur Word.

    J'ai regardé l'export avec liaison d'Excel sous Word et j'ai trouvé deux modes de collages plutôt pratiques : Avec liaison - Feuille de calcul Excel ou Avec liaison - Image en mode point.

    En tout cas si j'utilise un des deux, que je réduis par les coins le tout pour que ça rentre en largeur ma feuille A4, ça donne quelque chose de plutôt correct et qui se modifie selon ce que je tape sur Excel.

    j'ai trouvé sur le net comment faire pour générer les plages nommées comme mes sauts de page (ce qui me permet d'avoir une plage nommé par page Word):

    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
    Sub test()
        suppNomsPage "En_tête"
        nommerPages "En_tête"
         suppNomsPage "Descriptif"
        nommerPages "Descriptif"
         suppNomsPage "Carac_tech"
        nommerPages "Carac_tech"
    End Sub
     
    Sub nommerPages(nomF As String)
        Dim HPB As HPageBreak, numP As Long, nom As String
        Dim pl As Range, lig As Long, col1 As Long, nbCol As Long, derlig As Long
        ActiveWindow.View = xlPageBreakPreview
        With Sheets(nomF)
            On Error GoTo fin
            Set pl = Range(.PageSetup.PrintArea)
            On Error GoTo 0
            col1 = pl.Column: nbCol = pl.Columns.Count: derlig = pl.Row + pl.Rows.Count - 1
            lig = pl.Row
            For Each HPB In .HPageBreaks
                numP = numP + 1
                Set pl = .Cells(lig, col1).Resize(HPB.Location.Row - lig, nbCol)
                nom = nomF & "!page_" & Format(numP, "00")
                pl.Name = nom
                lig = HPB.Location.Row
            Next HPB
            If lig < derlig Then
                numP = numP + 1
                Set pl = .Cells(lig, col1).Resize(derlig - lig + 1, nbCol)
                nom = nomF & "!page_" & Format(numP, "00")
                pl.Name = nom
            End If
        End With
    End Sub
     
    Sub suppNomsPage(nomF As String)
        Dim nom As Name
        For Each nom In ActiveWorkbook.Names
            If Left(nom.Name, Len(nomF) + 6) = nomF & "!page_" Then nom.Delete
        Next nom
    End Sub
    Donc maintenant il ne manque plus qu'à faire une extraction de ces plages nommées sur Word.

    Pour ça je verrais bien un code du style
    Ouvrir Word,
    copier page 1 de la feuille En_tête,
    coller sur Word en tant qu'image mode point, (largeur collage = large page Word, serait la cerise sur le gâteau )
    si page_02 de en_tête existe, alors copier/coller image mode point à la page 2 du word
    puis checker si page_03 existe etc,

    sinon passer à l'onglet suivant,
    copier page_01 de l'onglet Descriptif, puis coller sur Word à la page suivante
    checker si page_02 de descriptif existe, etc

    puis passer au dernier onglet Carac_tech
    Et idem page_01 copier/coller sur word à la page suivant etc.

    Sinon on peut aussi copier/coller sur word puis insérer un saut de page sur word, comme ça on est à la suivante

    Si ça peut aider, le collage se fait comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .PasteSpecial Link:=True, DataType:=wdPasteBitmap, Placement:= _
            wdInLine, DisplayAsIcon:=False
    Mais c'est tout ce que je sais

    Voilà, merci à tous, hésitez pas si je peux éclaircir quelques points

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Donc maintenant il ne manque plus qu'à faire une extraction de ces plages nommées sur Word.
    Personnellement pour transférer des données d'excel vers word, j'utilise un document Word qui sert de modèle et qui contient des signets (Objet Bookmark de la collection Bookmarks)
    Une fois ce "modèle" ouvert je transfère les données d'excel vers word en utilisant deux méthodes différentes suivant qu'il s'agisse de valeur contenue dans une cellule ou dans une plage de cellules. Les cellules nommées dans excel portant le même nom que les signets dans Word
    • Une cellule - j'utilise la propriété Text de l'objet Range (cellule nommée) pour la placer dans le signet
    • Une plage de cellules - j'utilise le Copier/Collage-Spécial Image (méta fichier amélioré) manuellement on conserve le format des cellules (couleur, police) d'excel. Soit en VBA
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Objet.Selection.PasteSpecial DataType:=wdPasteEnhancedMetafile, Placement:=wdInLine

    Voir discussions sur le même sujet


    sinon passer à l'onglet suivant,
    copier page_01 de l'onglet Descriptif, puis coller sur Word à la page suivante
    checker si page_02 de descriptif existe, etc
    C'est également possible

    Je te conseille la lecture de ce tutoriel Débutez en VBA Word
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut
    Bonjour Phillippe,

    Merci pour tes liens je vais regarder tout ça. En tout cas ça me confirme que c'est possible !

  4. #4
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut
    Alors.. en reprenant le code de Zekraoui_Jakani, j'arrive à faire un petit quelque chose..

    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
    Sub export_excel_to_word()
     
        Dim obj As Object
        Dim newObj As Object
        Dim sh As Worksheet
        Dim myFile
     
        Set obj = CreateObject("Word.Application")
        obj.Visible = True
        Set newObj = obj.Documents.Add
     
     
    ThisWorkbook.Worksheets("En_tête").Range("page_01").Copy
      With obj.Selection
                    .PasteSpecial Link:=True, DataType:=wdPasteEnhancedMetafile, _
                        Placement:=wdInLine, DisplayAsIcon:=False
                    .TypeParagraph
                End With
     
    ThisWorkbook.Worksheets("En_tête").Range("page_02").Copy
      With obj.Selection
                    .PasteSpecial Link:=True, DataType:=wdPasteEnhancedMetafile, _
                        Placement:=wdInLine, DisplayAsIcon:=False
                    .TypeParagraph
                End With
     
     
    ThisWorkbook.Worksheets("Descriptif").Range("page_01").Copy
      With obj.Selection
                    .PasteSpecial Link:=True, DataType:=wdPasteEnhancedMetafile, _
                        Placement:=wdInLine, DisplayAsIcon:=False
                    .TypeParagraph
                End With
     
     
     
       Application.CutCopyMode = False
     
        myFile = Replace(ActiveWorkbook.Name, "xlsm", "docx")   'remplacer "docx" par l'extension qui convient, si nécessaire
        newObj.SaveAs Filename:=Application.ActiveWorkbook.Path & "\" & myFile
     
        MsgBox "Export vers Word terminé", vbInformation + vbOKOnly, "Export vers Word"
     
        obj.Activate    'vous pouvez jouer sur les marges pour améliorer la lecture
        Set obj = Nothing
        Set newObj = Nothing
     
    End Sub
    Que pensez-vous de mon petit bout de code ?

    La ou je bloque :
    - J'arrive pas à ajouter un saut de page (ou à faire un coller sur la page suivante) : InsertBreak Type:=wdPageBreak ne fonctionne pas.

    - Je ne parviens pas à mettre les conditions, si ThisWorkbook.Worksheets("En_tête").Range("page_02") n'existe pas, alors passer à la suite.

    - Je n'ai pas trouvé comment régler les marges du Word (ou les supprimer)

    - Je ne sais pas comment réduire la dimensions de mes collages

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Même s'il n'est pas aussi performant que celui d'excel, Word possède également son enregistreur de macros et cet outil a un mérite c'est nous donner les méthodes et propriétés des objets que l'on doit manipuler.
    Malgré mes années d'expérience en développement VBA, il m'arrive régulièrement de l'utiliser pour l'emploi d'objet que je manipule rarement ou pour la première fois.
    Le forum Word même s'il n'est pas aussi actif que celui-ci est également intéressant à consulter et la page Word de ce site est riche de tutoriels sur le VBA Word pour la plupart écrit par Olivier Lebeau.
    Voici la ligne de code du saut de page en Word que vient de me donner l'enregistreur de macros Word
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.InsertBreak Type:=wdPageBreak
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut
    C'est gràce à l'enregistreur de macro que j'avais obtenu le même code que vous pour le saut de page, mais il ne fonctionne pas (propriété ou méthode non gérée par cet objet)

    J'irai sur le forum Word pour les questions de mise en forme.

    Savez-vous comment régler les conditions d’existence des plages nommées ? (pour l'onglet descriptif, ça peut aller jusqu'à 15 plages)

Discussions similaires

  1. [Toutes versions] export excel vers word erreur 6028
    Par galzinc dans le forum Excel
    Réponses: 2
    Dernier message: 14/08/2009, 12h58
  2. VBA Export Excel vers Access
    Par rabihm81 dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/05/2009, 13h54
  3. VBA - Export Excel vers PPT - pb de couleur
    Par Neodyme dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/09/2008, 10h43
  4. [VBA-Word] Exportation Excel vers Word
    Par le_sonic dans le forum VBA Word
    Réponses: 6
    Dernier message: 20/12/2006, 17h18
  5. [VBA-E] : Excel et word (Zone d'impression)
    Par Geoffray dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/06/2006, 12h34

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