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 :

Créer et renseigner un fichier word depuis Excel VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut Créer et renseigner un fichier word depuis Excel VBA
    Bonjour à tous,

    Je suis encore novice en VBA mais je sais me démerder un peu. J'ai un code VBA qui permet de créer des tableaux sous Excel. Ces tableaux sont par la suite copier et coller dans un fichier word que je crée depuis Excel par VBA voici le code

    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
    Sub Copier_Coller()
    Dim ws As Worksheet
     
        Set source = ThisWorkbook
        Nomdufichier = InputBox("Nom du fichier", "Saisie") 'enregistre le fichier sous le nom donné
     
    Dim varDoc As Object
     
            Set varDoc = CreateObject("Word.Application")
     
                      varDoc.Visible = True
                      varDoc.Documents.Add
                        For Each ws In ActiveWorkbook.Worksheets
                        DL = ws.Range("B" & Rows.Count).End(xlUp).Row 'détermine la dernière ligne du tableau (en prenant comme référence la colonne B)
                    If ws.Name <> "Balance" Then
     
                      ws.Range("B3:F" & DL).Copy 'selection du tableau (à adapter, F étant ici la dernière colonne)
     
                      varDoc.Selection.Paste 'recopie dans le document Word
                      ws.Range("J" & DL).Copy
                      varDoc.Selection.PasteAndFormat (wdPasteDefault)
                      On Error Resume Next
                      ws.Range("J3:J" & DL - 1).Copy 'selection du tableau (à adapter, J étant ici la dernière colonne)
                      varDoc.Selection.PasteAndFormat (wdPasteDefault) 'recopie dans le document Word
     
                      Application.CutCopyMode = False
                    End If
     
                      Next ws
                      Sheets("Actif").Range("A1:I" & DL).Copy
                        varDoc.Selection.Paste
                    Sheets("Actif").Range("J" & DL).Copy
                    varDoc.Selection.PasteAndFormat (wdPasteDefault)
                    Sheets("Actif").Range("J" & DL - 1).Copy
                    varDoc.Selection.PasteAndFormat (wdPasteDefault)
     
                      varDoc.ActiveDocument.SaveAs ThisWorkbook.Path & "/" & Nomdufichier & ".doc" 'Enregistre le fichier sous le nom donné dans la InputBox
     
            Set varDoc = Nothing
     
            Set source = Nothing 'Les 2 lignes permettent de libérer la mémoire
     
     
     
    End Sub
    En plus de ce code :
    - j'ai besoin d'insérer un texte et une image dans l'entête du fichier word (je connais pas le code pour) depuis VBA excel
    - J'ai besoin d'écrire sur word depuis VBA excel plusieurs paragraphes : un premier paragraphe dont l'intitulé est I- Chiffre d'affaires / autre paragraphe dont l'intitulé II- Résultat ainsi de suite.
    - J'ai aussi besoin que les tableaux que le code ici-haut copie et colle soit plutôt coller à partir de chacun des paragraphes, par exemple que le tableau correspond au chiffre d'affaires en feuil chiffre d'affaires soit collé dans le paragraphe I- Chiffre d'affaires.
    - En dernier, la taille des tableaux doit être adapté à la page word et ne déborde pas pour ça j'ai penser à rajouter le code ci-après, mais cependant ça marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varDoc.Tables(1).AutoFitBehavior (wdAutoFitWindow)
    Merci d'avance pour votre aide!

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Veuillez noter que Word dispose (tout comme Excel) d'un enregistreur de macros.
    Il est toutefois d'un usage moins aisé, puisque la plupart des commandes entrées à la souris ne sont pas enregistrées.
    Il est toutefois possible d'utiliser les raccourcis associés à la touche 'Alt' pour accéder à la plupart des fonctions Word au clavier.

    Concernant votre besoin d'insérer du texte et une image dans l'entête d'un fichier Word :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub ModifHeader()
        With ThisDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range
            .Text = "ABC"
            .Paragraphs.Add
            .Paragraphs.Last.Range.InlineShapes.AddPicture FileName:="C:\Un_dossier\Une_image.png", _
                                                           LinkToFile:=False, SaveWithDocument:=True
        End With
    End Sub
    Ce code est à utiliser directement dans un module de code d'un document Word.
    Pour l'utiliser dans Excel, remplacer simplement ThisDocument par un autre identificateur (par exemple : varDoc.ActiveDocument).

    Cdt

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut
    Merci pour votre réponse Ben_L, je vais essayer ce code .
    Savez vous svp comment insérer depuis Excel toujours vba à partir d’un paragraphe déterminé le contenu d’un onglet en format texte et non tableau. Aussi comment insérer un tableau et l’adapter à la page sans que ce dernier déborde?

    Merci

  4. #4
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Personnellement pour mes applications utilisant Excel et Word, je travaille toujours avec un fichier Word (docx) qui sert de modèle et que l'utilisateur peut lui même personnaliser s'il le souhaite et que je place dans un répertoire dédié à cela et pour les endroits où placer le contenu des cellules ou plage de cellules d'excel, je travaille avec les signets (objet BookMark)

    Avantage : Vous pouvez personnaliser à votre guise les modèles Word avec en-tête du client, son logo, tous les textes standards en ce y compris les conditions générales de ventes et indiquer par les signets les endroits où coller les valeurs provenant d'excel (pour les cellules, j'utilise la propriétés Text pour avoir le format nombre défini dans Excel. Le fait de créer un modèle permet également de ne pas devoir gérer par programmation les alignements, taille de police, etc.
    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

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut
    Merci Philipe Tulliez pour votre réponse.
    Avez vous svp un bout de code que vous pouvez joindre illustration de votre traitement?
    Merci

  6. #6
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Citation Envoyé par badr.bader Voir le message
    comment insérer depuis Excel toujours vba à partir d’un paragraphe déterminé le contenu d’un onglet en format texte
    Je ne connais pas de méthode qui permettrait de facilement traduire le contenu d'une feuille Excel en un texte non structuré.
    Mais il est possible de coder ça par soit même. Tout va dépendre de l'organisation de l'onglet Excel du résultat attendu... Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim Rng As Range, sStr As String
        Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1).CurrentRegion
        sStr = Join(Application.Transpose(Rng.Value), vbLf)
    permet de récupérer dans la variable sStr, sous forme de texte, le contenu du premier onglet d'un classeur, à condition que seules la premières colonne contienne des données et que la 1ère ligne vide indique la fin de la colonne.
    Plus la structure initiale de votre onglet sera complexe, plus le code qu'il faudra écrire le sera aussi.
    Idem pour le format attendu dans Word.

    Citation Envoyé par badr.bader Voir le message
    comment insérer un tableau et l’adapter à la page sans que ce dernier déborde?
    C'est beaucoup plus complexe.
    Dans le cas général, ça n'est pas possible : prenez une feuille Excel dont toutes les cellules sont remplies d'un texte de 10 caractères. Même avec les limitations des fichiers Excel de type *.xls, cela ferait 167 millions de caractères à faire tenir sur une page A4
    Plus sérieusement et en imaginant que la quantité totale de texte présente sur chaque onglet est raisonnable, il reste beaucoup trop de cas possibles pour vous expliquer une méthode générique en quelques lignes...
    Ce qui me semble le plus simple, c'est d'interdire (dans le tableau Word) le découpage des lignes sur plusieurs pages et de définir des lignes d'en-tête pour le tableau qui seront reproduites sur toutes les pages.

    Have fun !

  7. #7
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avez vous svp un bout de code que vous pouvez joindre illustration de votre traitement?
    Pour l'explication et un bout de code, voir ma réponse dans cette discussion titrée Enregistrer sous avec un libellé spécifique macro Word
    dans cette discussion, je montre un exemple copiant des cellules seules mais pour coller une plage de cellules (tableau), j'utilise la méthode PasteSpecial avec comme arguments nommés
    • DataType:=wdPasteEnhancedMetafile
    • Placement:=wdInLine

    voir cette discussion sur ce sujet Transfert de données Excel vers 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

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Bonjour,

    Veuillez noter que Word dispose (tout comme Excel) d'un enregistreur de macros.
    Il est toutefois d'un usage moins aisé, puisque la plupart des commandes entrées à la souris ne sont pas enregistrées.
    Il est toutefois possible d'utiliser les raccourcis associés à la touche 'Alt' pour accéder à la plupart des fonctions Word au clavier.

    Concernant votre besoin d'insérer du texte et une image dans l'entête d'un fichier Word :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub ModifHeader()
        With ThisDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range
            .Text = "ABC"
            .Paragraphs.Add
            .Paragraphs.Last.Range.InlineShapes.AddPicture FileName:="C:\Un_dossier\Une_image.png", _
                                                           LinkToFile:=False, SaveWithDocument:=True
        End With
    End Sub
    Ce code est à utiliser directement dans un module de code d'un document Word.
    Pour l'utiliser dans Excel, remplacer simplement ThisDocument par un autre identificateur (par exemple : varDoc.ActiveDocument).

    Cdt
    Hello les génies,

    Désolé pour ma réponse tardive...
    J'ai beau scruté le forum pour une réponse à ma question, mais en vain, (ou peut être je cherche pas au bon endroit). Ben_L j'ai copié le bout de code en changeant ThisDocument par Vardoc.activedocument et ayant déclaré varDoc as Word.document. Mais, j'ai une erreur "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie". Par le suite, j'ai aussi changé la définition de la variable VarDoc as Word.application et j'ai la même erreur. J'ai supprimé par la suite "ActiveDocument" et là j'ai une autre erreur "Erreur de compilation : Membre de méthode ou de données introuvables", alors que j'ai un fichier word vierge ouvert...

    J'ai épuisé toute mes cartes.

    Merci pour votre aide.

  9. #9
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    En citant le nom de variable varDoc, issu de votre code, je supposais que sa déclaration et sa définition seraient conservées, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim varDoc As Object
    Set varDoc = CreateObject("Word.Application")
    NB : pour que l'utilisation de la propriété ActiveDocument ait un sens, encore faut-il qu'un fichier Word soit ouvert dans l'application varDoc...

    Mais pour savoir réellement quel qualificateur utiliser, il faudrait que vous spécifiiez la structure attendue :
    • où se trouve le code de votre macro ?
    • comment le lancez-vous ? (un bouton de commande ? si oui, où est-il situé ?)
    • sur quel fichier Word souhaitez vous travailler ? (je ne demande ni son nom, ni son emplacement, mais plutôt la façon dont vous y accédez)

    Cdt

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut
    Bonjour Ben_L,

    *Le code de la macro se trouve dans un module nomé Header.
    *Je le lance depuis application.run ´´Header´´
    *Le fichier word sur lequel je travail est un fichier word que je créé à travers le bout de code que j’avais cité ici-haut au début de la discussion initiale* «*vardoc.Documents.Add*» et que j’enregistre à travers une inputbox sous le nom que je souhaite en général revueXXX:

    varDoc.ActiveDocument.SaveAs ThisWorkbook.Path & "/" & Nomdufichier & ".doc" 'Enregistre le fichier sous le nom donné dans la InputBox

    J’espère que j’ai répondu à vos questions.
    Désolé je réponds depuis mon téléphone je mets pas de balises.

    Je teste sous peu votre bout de code. En attendants pouriez-vous svp m’aider pour écrire un code permettant d’agir toujours sur word depuis Excel :
    1-Ecrire par exemple des titres I- chiffre d’affaires II- cost of goods sold….
    2- dire à word depuis Excel s’il trouve le titre par exemple I-Chiffre d’affaires qu’il colle l’onglet chiffre d’affaires ( déjà créé par une macro) et ainsi de suite pour les autres paragraphe et onglet.

    Merci pour votre aide

  11. #11
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Comme le montre cette page, la méthode Add de la collection Documents renvoie un objet de type Document.
    Donc, plutôt que d'utiliser la propriété ActiveDocument, qui laisse souvent planer un doute sur le document qui sera référencé, mieux vaut procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim WdApp As Word.Application, WdDoc As Word.Document
    Set WdApp = New Word.Application
    Set WdDoc = WdApp.Documents.Add
    WdDoc peut ensuite vous servir d'identificateur pour faire référence au fichier Word souhaité.
    Attention au fait que la méthode Open ne se comporte pas de la même façon...

    Quant au fait d'agir sur Word depuis Excel, mis à part la déclaration de référence et la nécessité de lancer programmatiquement une application, tout le reste est équivalent au fait de contrôler Word depuis l'éditeur VBA Word.
    Je vous conseille donc de poster directement sur le forum Word pour obtenir de l'information pertinente sur le sujet.

    Bonne fin de journée à vous

  12. #12
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonsoir à tous,

    Ravi de retrouver le Forum.

    Salut, Philippe.

    Peut-être une piste, qui aurait ma préférence.
    Dans cette contribution, j'utilise l'éditeur Word de Outlook.

    Je pense qu'une adaptation pourrait être envisagée
    A savoir:
    - Exporter sous format image la plage Excel souhaitée
    - Activer le document Word et y intégrer l'image par la méthode "InlineShapes"

    Pour ce faire, voir le code intégré au fichier joint à la contribution.

    L'avantage de ce processus serait de shunter la mise en page Word.
    Le travail se faisant en amont depuis Excel.

Discussions similaires

  1. [XL-2007] Créer un fichier word depuis excel
    Par a.faurie dans le forum Excel
    Réponses: 4
    Dernier message: 06/11/2013, 08h22
  2. [XL-2002] Comptage de fichiers word depuis excel
    Par Pegase45 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/12/2011, 17h54
  3. [XL-2007] VBA Ouvrir Fichier word depuis Excel
    Par Floorfiler dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2011, 21h18
  4. Ouverture d'un fichier Word depuis Excel
    Par franck71 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2008, 23h33
  5. Question sur accès fichier word depuis excel (VBA)
    Par jerome.grange dans le forum VBA Word
    Réponses: 6
    Dernier message: 22/09/2006, 17h34

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