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 :

Export données VBA Excel vers Word avec signets et mise en forme ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut Export données VBA Excel vers Word avec signets et mise en forme ?
    Bonjour,

    Sous Excel 2010, j'essaie de créer un import d'Excel vers Word pour une newsletter. La démarche peut sembler étrange, mais le but final est de conserver ultérieurement les données exportées à des fins statistiques.

    Ma réflexion a été la suivante :

    Phase 1 : alimentation d'un tableau excel avec les données via userform (c'est fait, ça marche)
    Phase 2 : transfert des données saisies vers un modèle Word en fonction des signets.

    Je bloque à la phase 2. Les signets marchent, mais cela ne fait pas ce que je souhaiterai et après moults tentatives, j'arrive au bout de mes compétences en VBA et de ce que j'ai pu glaner sur le net. Les signets collent les données à la suite les unes des autres alors que j'aurai besoin que soit collé pour chaque information : le titre, puis en dessous l'auteur avec la source et la date, puis en dessous le résumé. En plus après je dois leur appliquer une mise en forme auto...

    Dans le modèle word, j'ai copié le rendu qui devrait être le final tout en bas. Avez-vous des pistes à me proposer ? Est-ce que l'idée de passer par des signets était la bonne ou y-a-t'il d'autres pistes à envisager ?

    Edit : il semble que je ne puisse pas mettre en PJ le modèle Word au format .dotm, le forum me le refuse... Je met donc un exemplaire en .docx pour que vous puissiez voir le rendu final... Désolée pour ce souci

    En espérant que vous ayez des pistes et en vous remerciant.
    EDIT : suppression des PJ en accord avec la charte
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Mde A Voir le message
    il semble que je ne puisse pas mettre en PJ le modèle Word au format .dotm, le forum me le refuse... Je met donc un exemplaire en .docx pour que vous puissiez voir le rendu final... Désolée pour ce souci
    Pour info, beaucoup de participants à ce forum n'ouvrent pas les fichiers joints, entre autre pour les raisons expliquées ici :
    https://www.developpez.net/forums/d8...s-discussions/
    Si tu veux augmenter tes chances de réponse, il serait donc préférable de copier la partie concernée de ton code dans un message, de préférence encadré de balises CODE.
    Si tu veux montrer le rendu final souhaité, tu peux mettre des copies d'écran.

    En plus après je dois leur appliquer une mise en forme auto...
    Il est plus simple d'appliquer directement la mise en forme au signet "à la main" dans ton modèle.
    La mise en forme avec VBA, c'est galère.

  3. #3
    Membre régulier
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut
    Bonjour,

    Merci pour ce retour, j'ajuste donc mon post en conséquence et vous présente toutes mes excuses pour la gène occasionnée

    Voici le code de la phase d'import vers les signets (qui marchent) mais qui ne font pas vraiment ce que je souhaite et pour lesquels je suis à la recherche d'autres pistes :

    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
    Sub ImportWord()
    Dim WordApp As Word.Application
    Dim DocWord As Word.Document
     
    'ouvrir word
    Set WordApp = CreateObject("Word.Application")
    'word est masqué ou visible pendant l'opération (true, false)
    WordApp.Visible = True
     
    'créer le nouveau document word
    Set DocWord = WordApp.Documents.Add(Template:="\test newsletterV2.docm", NewTemplate:=False, DocumentType:=0)
     
    'Import vers Word :
     
    '*****************************
    Dim Cell As Range
    Dim thematique As String
    Dim titre As String
    Dim auteur As String
    Dim source As String
    Dim datejour As String
     
    With Worksheets("Newsencours")
        For Each Cell In .Range("A2:A" & .Range("C65000").End(xlUp).Row)
        thematique = Cell.Offset(0, 0).Value
        titre = Cell.Offset(0, 1).Value
        auteur = Cell.Offset(0, 4).Value
        source = Cell.Offset(0, 5).Value
        datejour = Cell.Offset(0, 6).Value
        'MsgBox (thematique)
           If DocWord.Bookmarks.Exists(thematique) Then
            DocWord.Bookmarks(thematique).Range.Text = titre
            DocWord.Bookmarks(thematique).Range.Text = auteur
            DocWord.Bookmarks(thematique).Range.Text = source
            DocWord.Bookmarks(thematique).Range.Text = datejour
            Else
            'DocWord.Bookmarks("A_CLASSER").Range.Paste
            'DocWord.Bookmarks("A_CLASSER").Range.InsertAfter vbCrLf
        End If
        'Call Vider_Presse_Papier
        Next
    End With
     
    End Sub
    Voici le rendu actuel après import :

    Nom : renduactuel.PNG
Affichages : 1728
Taille : 16,4 Ko

    Voici le rendu que je dois obtenir :

    Nom : Captureaobtenir.PNG
Affichages : 1730
Taille : 16,4 Ko

    Je sais bien qu'excel n'est pas la meilleure idée pour faire cela, mais pour le moment je n'ai pas d'autres solutions : je cherche des pistes savoir si c'est faisable ou ce n'est pas réaliste. Si vraiment vous séchez je comprendrais largement...

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    J'ai déjà fais une appli qui ressemble à ce que tu souhaites.
    Je vais te donner quelques conseils correspondant à la procédure telle que je l'ai imaginée.
    Je ne dis pas que c'est le mieux mais c'est comme ça que j'ai fait et ça fonctionne.

    Pour chaque chapitre, mets un bookmark par information et non pas un bookmark par chapitre.
    Par exemple, tu pourrais avoir, pour un chapitre les bookmark BKTitre_A1, BKTAuteur_A1, BKSource_A1, BKDate_A1.
    Idem pour les autres chapitres.

    Et, pour chaque bookmark, mets dans ton modèle un court texte, au mieux un seul mot, le plus pratique etant de mettre le nom du bookmark, ça permet de bien les repérer. Ca te permet non seulement d'identifier le bookmark mais surtout d'ajuster la mise en forme du texte correspondant. Peu importe le contenu de ces textes puisqu'ils vont être remplacés par les données souhaitées lors de la procédure.
    Il faut que le bookmark s'applique à l'intégralité de ce court texte lui correspondant et ne soit pas seulement un "point" avant ou après. Pour ça, il faut que tu sélectionnes tout le mot avant de cliquer sur l'icone Signet créant le bookmark.

    Dans la colonne A de ton fichier Excel, ne mets que la partie commune du chapitre, par exemple "A1", "T1", etc.
    C'est la macro qui reconstituera le nom entier des bookmark.

    Ensuite, tu peux faire un code ressemblant à celui ci-dessous.
    Attention, je tape ça directement sur le forum sans le tester. Tu auras donc peut-être du débugage à faire.
    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
    Sub ImportWord()
    Dim DocWord As Word.Document
    Dim Lig As Long
     
    'ouvrir le modèle
    Set DocWord = GetObject("\test newsletterV2.docm", NewTemplate:=False, DocumentType:=0)
     
    With Worksheets("Newsencours")
        For Lig = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
            If DocWord.Bookmarks.Exists("BKTitre_" & .Cells(Lig, 1).Value) Then   ' on vérifie que le chapitre existe
                DocWord.Bookmarks("BKTitre_" & .Cells(Lig, 1).Value).Range.Text = .Cells(Lig, 2).Value
                DocWord.Bookmarks("BKAuteur_" & .Cells(Lig, 1).Value).Range.Text = .Cells(Lig, 5).Value
                DocWord.Bookmarks("BKSource_" & .Cells(Lig, 1).Value).Range.Text = .Cells(Lig, 6).Value
                DocWord.Bookmarks("BKDate_" & .Cells(Lig, 1).Value).Range.Text = .Cells(Lig, 7).Value
            Else
                'DocWord.Bookmarks("A_CLASSER").Range.Paste
                'DocWord.Bookmarks("A_CLASSER").Range.InsertAfter vbCrLf
            End If
        Next Lig
    End With
     
    DocWord.Application.Visible = True
    DocWord.Application.Activate
    Set DocWord = Nothing
     
    End Sub
    Je n'ai pas trop compris ce que tu voulais faire si le chapitre n'est pas trouvé. J'ai donc laissé le "Else" en l'état.

    Dernier détail : à la place, juste après le GetObjet, je mettrais une sauvegarde du document Word sous un autre nom, histoire de ne pas risquer d'écraser le modèle par une regrettable maladresse.

  5. #5
    Membre régulier
    Femme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut
    Bonjour,

    merci pour ce retour sur lequel je vais travailler dès à présent. Pour des raisons d'emploi du temps, je reviendrai poster mes avancées dans une semaine (désolée pour la longueur).

    Concernant le getObject : en fait, j'avais modifié la macro juste avant de poster, le document Word original est en .dotm ce qui le préserve de toute altération (testé et approuvé). Depuis une précédente mésaventure, je fais systématiquement des copies...

    Merci pour votre écoute et votre aide.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je ne suis absolument pas convaincu que tu aies besoin d'une macro pour compléter ton bulletin. Pour autant que la structure de ton fichier Excel soit constante, tout ce que cela te prendrait, du moins au premier regard, ce sont des champs base de données dans Word (que tu peux insérer comme n'importe quel autre champ) et les relier à tes "champs Excel". (Disons une feuille dédiée que tu mets à jour juste avant de procéder.) Tu mets les champs en forme dans ton modèle Word.

    Ensuite tu mets manuellement (ou par macro) ta feuille Excel à jour. Quand ru ouvres ton document modèle, les champs se mettent à jour (ou tu les mets à jour avec le raccourci-clavier que j'ai oublié) et cela devrait être correct.

Discussions similaires

  1. [XL-2003] Exporter données d'Excel vers Word 2003
    Par flet le kid dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2009, 16h44
  2. Réponses: 2
    Dernier message: 30/03/2009, 12h44
  3. Données Excel vers Word avec critères précis
    Par Z20500 dans le forum Excel
    Réponses: 4
    Dernier message: 18/09/2007, 18h38
  4. Réponses: 2
    Dernier message: 12/02/2007, 13h39
  5. [VBA-A]Copier des données d'Excel vers Word
    Par soad029 dans le forum VBA Word
    Réponses: 15
    Dernier message: 16/03/2006, 11h56

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