Bonjour,
Je débute en VBA, j'apprends à le faire en autodidacte du coup je ne pense pas ecrire le code de la meilleure façon, cela étant voici mon probleme.
J'ai un fichier word qui contient des images et des tableaux ainsi que du texte, et je cherche à intégrer dans ce fichier des tableaux d'un fichier excel (ce fichier à N (variable) onglets) les tableaux n'ont pas forcément la même taille.
Les tableaux sont copiés/collés dans le word à un emplacement précis (j'utilise des mots clés intégrés au texte du fichier, exemple <motcle> et <motcle\>)
Mon problème est le suivant, lorsque je suis en pas à pas, il n'y a pas de réel soucis, l'exportation vers word fonctionne, par contre si je me place comme un utilisateur lambda, j'ai une erreur de clipboard erreur 4605 que je ne comprends pas
Auparavant j'utilisais le PasteSpecial Link:=True, DataType:=wdPasteOLEObject, Placement:=wdInLine, DisplayAsIcon:=False mais j'ai un souci d'ordre cosmétique en effet les tableaux arrivent avec des tailles qui ne conviennent pas et je ne sais pas comment les tailler (autofit) à la largeur de la page.
Avec PasteExcelTable cela semble mieux, mais je perds la mise en page (couleur, alignement, etc...) et lorsque je ne suis pas en pas à pas j'ai l'erreur 4605 qui plante le script
Voici le code, si une âme charitable peut m'aider
là il s'agit donc de la partie déclaration etc...
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
49 Dim ExcelApp As Excel.Application Dim SelDOCFile As Selection Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim User As String, File_Word As String, Filename As String Dim Change As Boolean, REGMAP_Balise As Boolean, REGMAPDFT_Balise As Boolean, OTPMAP_Balise As Boolean Change = False REGMAP_Balise = False REGMAPDFT_Balise = False OTPMAP_Balise = False User = Environ("userprofile") User = Split(User, "\")(UBound(Split(User, "\"))) MsgBox ("Bonjour " & User & Chr(10) & "Veuillez sélectionner le fichier Word PTS") Change = False ChDir ActiveWorkbook.Path File_Word = Application.GetOpenFilename("Document Word, *.doc;*.docm;*.docx") If Split(File_Word, "\")(UBound(Split(File_Word, "\"))) = False Then MsgBox ("Abandon") Exit Sub End If Filename = Split(File_Word, "\")(UBound(Split(File_Word, "\"))) 'nécéssite d'activer la reference Microsoft word xx.x 0bject Library On Error Resume Next Set WordApp = GetObject(, "Word.Application") Set WordDoc = WordApp.Documents.Open(File_Word) Set ExcelApp = GetObject(, "Excel.Application") On Error GoTo 0 'Traitement différent si le document est déjà ouvert If WordDoc Is Nothing Then 'le document est fermé Set WordApp = CreateObject("Word.Application") WordApp.Visible = True Set WordDoc = WordApp.Documents.Open(Filename:=File_Word) WordApp.Documents(File_Word).Activate Else 'Le document est ouvert WordApp.Documents(File_Word).Activate End If On Error Resume Next CaptionLabels.Add Name:="[Table" On Error GoTo errorHandler Set SelDOCFile = WordApp.Selection
c'est ici que le code plante lors du paste, auparavant je retouche le document word, mais cela n'a pas d'importance ici.
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 'ClearClipboard 'On colle les tableaux SelDOCFile.HomeKey Unit:=wdStory ' place le cursaur en debut du document With SelDOCFile.Find .Forward = True .Wrap = wdFindContinue .Execute FindText:="\<motcle\>" If .Found And REGMAP_Balise Then Change = True SelDOCFile.MoveRight Unit:=wdCharacter, Count:=1 SelDOCFile.TypeParagraph For Each WS In ExcelApp.ActiveWorkbook.Sheets If WS.Name = "REGMAP" Then SelDOCFile.TypeParagraph SelDOCFile.MoveUp Count:=1 SelDOCFile.InsertCaption Label:="[Table", Title:=": REGMAP]", Position:=wdCaptionPositionAbove, ExcludeLabel:=0 SelDOCFile.MoveRight Unit:=wdCharacter, Count:=1 TabDim = "B2:F" & ExcelApp.Sheets(WS.Name).Range("B2").End(xlDown).Row ExcelApp.Sheets(WS.Name).Range(TabDim).Copy 'WordApp.Selection.PasteSpecial Link:=True, DataType:=wdPasteOLEObject, Placement:=wdInLine, DisplayAsIcon:=False SelDOCFile.PasteExcelTable False, True, False SelDOCFile.TypeParagraph Else SelDOCFile.TypeParagraph SelDOCFile.MoveUp Count:=1 SelDOCFile.InsertCaption Label:="[Table", Title:=": " & ExcelApp.Sheets(WS.Name).Range("D4").Value, Position:=wdCaptionPositionAbove, ExcludeLabel:=0 SelDOCFile.MoveRight Unit:=wdCharacter, Count:=1 Reglength = Len(Split(ExcelApp.Sheets(WS.Name).Range("H5").Value, "b")(0)) TabDim = "B4:H" & Reglength + 4 + 3 ExcelApp.Sheets(WS.Name).Range(TabDim).Copy SelDOCFile.PasteExcelTable False, True, False SelDOCFile.TypeParagraph End If Next End If End With
j'ai essayé de mettre ça pour bien vider le pressepapier, mais rien y fait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Sub ClearClipboard() Dim oDataObject As DataObject Set oDataObject = New DataObject oDataObject.SetText "" oDataObject.PutInClipboard Set oDataObject = Nothing End Sub
D'ailleurs est-il possible de modifier les paramètres du tableau qui est importé (copié/collé) ? car si j'ai compris il faut connaitre l'indice du tableau, mais dans mon cas cela est assez problématique (sans partir dans une usine à gaz ce que j'ai l'impression d'avoir déjà fait)
Partager