Bonjour,
Je souhaiterais copier un tableau ou une plage de données de excel vers word.
Quelqu'un pourrait-il m'aider svp ?
Version imprimable
Bonjour,
Je souhaiterais copier un tableau ou une plage de données de excel vers word.
Quelqu'un pourrait-il m'aider svp ?
Bonjour,
Comme beaucoup de contributeurs, je n'ouvre jamais les fichiers joints.
Qu'as-tu déjà codé, pour ce projet ?
Pour pouvoir t'aider, j'aimerais savoir
- Pour Excel, sais-tu ce qu'est une cellule ou plage nommées ?
- Pour Word, sais-tu ce qu'est un signet ?
Comme Philippe Tulliez ( :salut: ), je n'ouvre pas les fichiers joints et comme tu ne donnes quasiment pas d'informations dans ta demande, ma réponse sera générique.
Pour la copie dans Excel, utilise la méthode Copy de Range.
https://msdn.microsoft.com/fr-fr/lib...0(v=office.15)
Pour coller dans Word, méthode Paste (ou une de ses petites soeurs) appliqué au Range de l'emplacement souhaité.
https://docs.microsoft.com/fr-fr/off...rd.range.paste
Bonjour
Pour l'instant j'arrive à ouvrir Word avec les signets mais pas à y insérer les données de mon tableau
Voici ce que j'ai fait
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Sub exportDonneesDansSignetsWord() Dim AppWord As Word.Application Dim WordDoc As Word.Document Dim i As Byte Set AppWord = CreateObject("word.application") 'ouvre session word Set WordDoc = AppWord.Documents.Open("E:\Essai Excel vers Word.docm") 'ouvre document Word Attention au chemin!! AppWord.Visible = True 'word affiché pendant l'operation For i = 1 To 50 Range("TABLEAU" & i).Copy 'les signets du document Word sont nommés Tableau1, Tableau2 WordDoc.Bookmarks("Tableau1" & i).Range.Select(B4:D9) AppWord.Selection.Paste Next i AppWord.Visible = True 'affiche le document Word WordDoc.Close False 'ferme le document word en sauvegardant les données 'AppWord.Quit 'ferme la session Word End Sub
Bonjour
J'ai modifié mon code mais il me met une erreur 1004
Je voudrais qu'à la fin du traitement le document word s'ouvre et reste visibleCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Private Sub CommandButton1_Click() Dim AppWord As Word.Application Dim WordDoc As Word.Document Dim i As Byte Set AppWord = CreateObject("word.application") 'ouvre session word Set WordDoc = AppWord.Documents.Open("E:\Essai Excel vers Word.docm") 'ouvre document Word Attention au chemin!! AppWord.Visible = True 'word affiché pendant l'operation For i = 1 To 50 Range("TABLEAU" & i).Copy 'les signets du document Word sont nommés Tableau1, Tableau2 WordDoc.Bookmarks("Tableau" & i).Range.Select AppWord.Selection.Paste Next i AppWord.Visible = True 'affiche le document Word WordDoc.Close False 'ferme le document word en sauvegardant les données 'AppWord.Quit 'ferme la session Word End Sub
Merci
Bonjour,
La procédure que j'ai développée fonctionne avec côté Excel une cellule ou plage de cellules nommée (Gestionnaire des noms) et côté Word un signet
Autrement dit, si tu as un signet qui se nomme Adresse dans le document qui te sert de modèle, tu dois avoir une cellule ou une plage (si tableau) nommée Adresse.
Si le signet n'existe pas dans Word, la fonction renvoie False dans le cas contraire True
Code de la procédure
Donc si je me réfère au code que tu as publié, voici la ligne de code pour invoquer cette procédure CopyXls2Wrd WordDoc, ThisWorkbook.Names("Contact") en copiant la cellule nommée Contact vers le signet de même nom.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 Function CopyXls2Wrd(wrdDoc As Word.Document, oName As Name) As Boolean ' Philippe Tulliez www.magicoffice.be ' Copie la cellule ou plage de cellules définie par l'argument oName ' Renvoie True si la copie a bien eu lieu ' Arguments ' wrdDoc ' Document qui contient le signet qui contiendra la ou les cellules copiées dans Excel ' oName ' Nom de la cellule ou plage de cellules à copier (Le signet doit avoir le même nom) Dim oRng As Range Dim Place As Long Dim BookmarkName As String Dim appWrd As Word.Application Set appWrd = wrdDoc.Parent Set oRng = oName.RefersToRange ' Objet Range à copier ' Place = wrdDoc.Bookmarks(BookmarkName).Range.Start BookmarkName = oName.Name With wrdDoc If .Bookmarks.Exists(BookmarkName) Then If oRng.Count = 1 Then .Bookmarks(BookmarkName).Range.Text = oRng.Text Else oRng.Copy .Bookmarks(BookmarkName).Select appWrd.Selection.PasteSpecial DataType:=9, Placement:=0 Application.CutCopyMode = False End If CopyXls2Wrd = True End If End With Set appWrd = Nothing: Set oRng = Nothing End Function
Voici ma procédure de test qui invoque la fonction CopyXls2Wrd. Le document Word, reste ouvert et n'est pas sauvé
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 Sub T() ' Nécessite de référencer Microsoft Word nn.n Object Library ' Déclaration Const SubFolder As String = "Template" ' Sous-répertoire où se trouve le modèle Const TemplateName As String = "Courrier.Docx" ' Nom du modèle Dim appWrd As Word.Application Dim wrdDoc As Word.Document Dim appPath As String, wrdFullName As String ' appPath = ThisWorkbook.Path wrdFullName = appPath & "\" & SubFolder & "\" & TemplateName Set appWrd = CreateObject("Word.Application") Set wrdDoc = appWrd.Documents.Add(Template:=wrdFullName) ' With appWrd .Visible = True: appWrd.Activate End With ' ' Copie des cellules et plages de cellules vers les signets CopyXls2Wrd wrdDoc, ThisWorkbook.Names("bmOffre") CopyXls2Wrd wrdDoc, ThisWorkbook.Names("bmName") ' Set appWrd = Nothing: Set wrdDoc = Nothing End Sub
Bonjour,
Je ne comprends pas pourquoi dans la déclaration des variables il me met une erreur
merciCode:
1
2
3 Sub T() Dim appWrd As Word.Application
Bonjour,
Et bien tout simplement parce-que le complément Word n'est pas référencé.
C'est pourtant indiqué en début de procédure 'Nécessite de référencer Microsoft Word nn.n Object Library
Bonjour,
Si tu as utilisé la procédure nommée T, les deux premières lignes de cette procédures définissent le nom du sous-répertoire où se trouve le modèle (c'est à dire le document où se trouve les signets qui devront contenir le résultat des cellules copiées depuis excel) et le nom du modèle (moi j'utilise un document suffixé docx mais tu peux utiliser une dotx) qui donc doit être présent dans sous-répertoire.
J'ai bien documenté ces deux lignes dans la procédure publiée donc si tu as mis les bonnes valeurs, tu devrais voir apparaître ton document Word basé sur ce modèle
Pour info, un sous-répertoire signifie que le classeur Excel où se trouve le code doit être dans le dossier parent puisqueCode:
1
2 Const SubFolder As String = "Template" ' Sous-répertoire où se trouve le modèle Const TemplateName As String = "Courrier.Docx" ' Nom du modèle
- la ligne 10 : assigne le répertoire de ThisWorkbook appPath = ThisWorkbook.Path
- la ligne 11 : Construit le nom complet soit le chemin où se trouve le classeur Excel + le sous-répertoire + le nom du modèle wrdFullName = appPath & "\" & SubFolder & "\" & TemplateName
donc si tu respectes cette contrainte, le document Word basé sur le modèle nommé comme définit dans TemplateName et présent dans SubFolder va s'ouvrir
Bonjour,
J'ai respecté ce que tu m'as dit mais maintenant j'ai une erreur à la ligne suivante
chemin des fichiers : C:\Users\b_leb\OneDrive\Documents\PROJET DTO
Je te met les fichiers sur lesquels je travailleCode:Function CopyXls2Wrd(wrdDoc As Word.Document, oName As Name) As Boolean
Fichier excel nommé test1
type désignation constructeur classification N° série 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 6 7 8 9 10 7 8 9 10 11
Fichier Word nommé FSMT
Pour l'instant en utilisant tes indications j'ai le code suivant:Citation:
FORMULAIRE DE SORTIE DE MATERIEL TECHNIQUE
(RESPONSABLE)
Certifie que le matériel suivant
signet Copie Tableau excel
A ETE CONFIE AU
NOM PRENOM
POUR LA DUREE
Période du xx au xx mois année
REMARQUES PARTICULIERES (EVENTUELLES)
Merci car je débute et les recherches de solutions sur internet ne sont pas claires ou ne correspondent pas à ce que je veux faireCode:
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
49
50
51
52
53
54
55
56 Function CopyXls2Wrd(wrdDoc As Word.Document, oName As Name) As Boolean ' Philippe Tulliez <a href="http://www.magicoffice.be" target="_blank">www.magicoffice.be</a> ' Copie la cellule ou plage de cellules définie par l'argument oName ' Renvoie True si la copie a bien eu lieu ' Arguments ' wrdDoc ' Document qui contient le signet qui contiendra la ou les cellules copiées dans Excel ' oName ' Nom de la cellule ou plage de cellules à copier (Le signet doit avoir le même nom) Dim oRng As Range Dim Place As Long Dim BookmarkName As String Dim appWrd As Word.Application Set appWrd = wrdDoc.Parent Set oRng = oName.RefersToRange ' Objet Range à copier ' Place = wrdDoc.Bookmarks(BookmarkName).Range.Start BookmarkName = oName.Name With wrdDoc If .Bookmarks.Exists(BookmarkName) Then If oRng.Count = 1 Then .Bookmarks(BookmarkName).Range.Text = oRng.Text Else oRng.Copy .Bookmarks(BookmarkName).Select appWrd.Selection.PasteSpecial DataType:=9, Placement:=0 Application.CutCopyMode = False End If CopyXls2Wrd = True End If End With Set appWrd = Nothing: Set oRng = Nothing End Function Sub T() ' Nécessite de référencer Microsoft Word nn.n Object Library ' Déclaration Const SubFolder As String = "C:\Users\b_leb\OneDrive\Documents\PROJET DTO" ' Sous-répertoire où se trouve le modèle Const TemplateName As String = "FSMT.Docm" ' Nom du modèle Dim appWrd As Word.Application Dim wrdDoc As Word.Document Dim appPath As String, wrdFullName As String ' appPath = ThisWorkbook.Path wrdFullName = appPath & "\" & SubFolder & "\" & "C:\Users\b_leb\OneDrive\Documents\PROJET DTO\FSMT.Docm" Set appWrd = CreateObject("Word.Application") Set wrdDoc = appWrd.Documents.Add(Template:=wrdFullName) ' With appWrd .Visible = True: appWrd.Activate End With ' ' Copie des cellules et plages de cellules vers les signets CopyXls2Wrd wrdDoc, ThisWorkbook.Names("bmOffre") CopyXls2Wrd wrdDoc, ThisWorkbook.Names("bmName") ' Set appWrd = Nothing: Set wrdDoc = Nothing End Sub
Mettre des actions dans une Function, c'est vraiment déconseillé.
Une fonction sert à calculer en fonction de paramètres et à renvoyer une valeur, pas à faire des modification par elle-même.
Bonjour Menhir,
Je ne suis pas d'accord avec toi. Il est tout à fait possible d'utiliser une fonction qui trie, exporte, etc.Citation:
Une fonction sert à calculer en fonction de paramètres et à renvoyer une valeur, pas à faire des modification par elle-même.
Je pratique de cette manière de plus en plus et on peut l'utiliser comme méthode ou comme fonction. MsgBox est une illustration parfaite de ce cas là
Ce qui n'est pas possible en revanche, c'est d'utiliser une fonction VBA qui effectue des actions sur un objet et de l'utiliser comme fonction personnalisée dans une cellule d'excel
Moi ? Certainement pas !
A moins que tu considères l'ensemble des participants à ce forum comme une personne unique, ce qui serait tout à fait irréaliste. :mrgreen:
MsgBox, tout comme InputBox, sont des fonction dont l'unique but (comme toute fonction) est de renvoyer une valeur.Citation:
MsgBox est une illustration parfaite de ce cas là
Elles ne modifient rien.
Si tu veux donner des exemple plus "borderline", il faudrait citer la fonction Excel LIEN_HYPERTEXTE() ou la fonction VBA GetObject(). Là, j'avoue, ça ne ressemble plus trop à des fonction et pourtant ça en est.
La Function qui est présenté ici pourrait être un Sub et, à mon sens, c'est ce qu'elle devrait être étant donné les méthodes et modifications de propriétés qu'elle contient.
D'autant plus que, si je ne me trompe pas, elle ne renvoie pas de valeur. Je ne vois donc pas trop l'intérêt d'utiliser Function plutôt que Sub.
C'est la façon de coder mais je conçois que d'autres ne la partage pas. Les goûts et les couleurs... ;)
Bonjour Menhir,
Un exemple dans cette contribution CopyRange - Copie de liste de données (source) dans une feuille cible où la fonction nommée CopyRange qui effectue la copie d'une plage de cellules vers une autre, renvoie un objet Range
Exemple pour l'invoquer
Code:Set rng = mStdCopyRange.CopyRange(oListSource, shtTarget, ClearSheet:=Elem = 0, AddLabel:=oListSource.Parent.Name)
Tout à fait d"accord, elle pourrait être une SubCitation:
La Function qui est présenté ici pourrait être un Sub et, à mon sens, c'est ce qu'elle devrait être étant donné les méthodes et modifications de propriétés qu'elle contient.
D'autant plus que, si je ne me trompe pas, elle ne renvoie pas de valeur. Je ne vois donc pas trop l'intérêt d'utiliser Function plutôt que Sub
J'ai allégé le code des procédures publiées mais initialement je renvoie une variable booléenne (qui permet de vérifier si la procédure s'est bien déroulée)
Bonjour,
Je teste toutes les procédures que je publieCitation:
J'ai respecté ce que tu m'as dit mais maintenant j'ai une erreur à la ligne suivante
chemin des fichiers : C:\Users\b_leb\OneDrive\Documents\PROJET DTO
Function CopyXls2Wrd(wrdDoc As Word.Document, oName As Name) As Boolean
Dans quel répertoire se trouve le classeur Excel qui contient à la fois le code VBA et les cellules ou plage de cellules nommées et dans quel répertoire se trouve le document suffixé docx qui contient les signets ?
Merci de publier le chemin complet et le nom des fichiers Word et Excel avec leur suffixe
Petite remarque : Le code des procédures que l'on publie doit être placé entre les balises prévues à cet effet (Après sélection des lignes de code cliquer sur le bouton # (croisillons)
Il n'y a aucune ligne contenant cette phrase. Si tu publies le code entre les balises, tu auras une numérotation. C'est ce numéro qui permet d'identifier la ligne et indiquer le numéro d'erreur renvoyé ainsi que son message n'est pas du luxeCitation:
j'ai une erreur à la ligne suivante
chemin des fichiers : C:\Users\b_leb\OneDrive\Documents\PROJET DTO
Je l'ai dit, c'est une question de goût et si tu le sens mieux comme ça et que ça fonctionne, continue.
Perso, quand j'ai une sous-routine qui doit réaliser des actions ET renvoyer une valeur, je préfère passer par un Sub avec un des paramètres en ByRef pour transmettre la valeur.
C'est vrai que l'on a ses habitudes
Je n'utilise jamais Call mais directement le nom de la procédure alors d'autres l'utilise
C'est effectivement une autre approche que je n'ai jamais utilisée.Citation:
Perso, quand j'ai une sous-routine qui doit réaliser des actions ET renvoyer une valeur, je préfère passer par un Sub avec un des paramètres en ByRef pour transmettre la valeur.