PDA

View Full Version : VBA auto copy-paste from Excel to Word works but no source formatting!



hotsince82
07-20-2015, 09:55 AM
I found a code on the Internet and I've adapted to my own use to automate copy-paste. Works great except that when I paste the Excel chart to my word report, the colors get changed to destination theme. I need to keep source formatting and as the report is final, I can't change the color scheme either.

For some reason Selection.PasteSpecial (wdChart) does not work, it's used as a simple paste. I've got hundreds of reports to paste two dozens of graphs to, I would not want to do if manually!




'You must set a reference to Microsoft Word Object Library from Tools | References

Option Explicit

Sub ExportToWord()

Dim appWrd As Object
Dim objDoc As Object
Dim FilePath As String
Dim FileName As String
Dim x As Long
Dim LastRow As Long
Dim SheetChart As String
Dim SheetRange As String
Dim BookMarkChart As String
Dim BookMarkRange As String
Dim Prompt As String
Dim Title As String

'Turn some stuff off while the macro is running
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False

'Assign the Word file path and name to variables
FilePath = ThisWorkbook.path
FileName = "Trust03.docx"

'Determine the last row of data for our loop
LastRow = Sheets("Summary").Range("A65536").End(xlUp).Row

'Create an instance of Word for us to use
Set appWrd = CreateObject("Word.Application")

'Open our specified Word file, On Error is used in case the file is not there
On Error Resume Next
Set objDoc = appWrd.Documents.Open(FilePath & "\" & FileName)
On Error GoTo 0

'If the file is not found, we need to end the sub and let the user know
If objDoc Is Nothing Then
MsgBox "Unable to find the Word file.", vbCritical, "File Not Found"
appWrd.Quit
Set appWrd = Nothing
Exit Sub
End If

'Copy/Paste Loop starts here
For x = 2 To LastRow

'Use the Status Bar to let the user know what the current progress is
Prompt = "Copying Data: " & x - 1 & " of " & LastRow - 1 & " (" & _
Format((x - 1) / (LastRow - 1), "Percent") & ")"
Application.StatusBar = Prompt

'Assign the worksheet names and bookmark names to a variable
'Use With to group these lines together
With ThisWorkbook.Sheets("Summary")
SheetChart = .Range("A" & x).Text

BookMarkChart = .Range("C" & x).Text

End With



'Tell Word to goto the bookmark assigned to the variable BookMarkChart
appWrd.Selection.Goto What:=wdGoToBookmark, Name:=BookMarkChart

'Copy the data from Thisworkbook
ThisWorkbook.Sheets(SheetChart).ChartObjects(1).Copy

'Paste into Word
appWrd.Selection.PasteSpecial (wdChart)

Next

'Turn everything back on
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.StatusBar = False

'Let the user know the procedure is now complete
Prompt = "The procedure is now completed." & vbCrLf & vbCrLf
Title = "Procedure Completion"
MsgBox Prompt, vbOKOnly + vbInformation, Title

'Make our Word session visible
appWrd.Visible = True

'Clean up
Set appWrd = Nothing
Set objDoc = Nothing

End Sub

Kenneth Hobs
07-20-2015, 12:08 PM
appWrd.Selection.Paste

hotsince82
07-20-2015, 02:22 PM
appWrd.Selection.Paste

That's what was originally in the code before I changed it trying to fix the problem, and the result is the same unfortunately..

Kenneth Hobs
07-21-2015, 05:53 AM
Maybe you can work up two simple example files and attach?

Maybe this will give you an idea.



' http://www.ozgrid.com/forum/showthread.php?t=195109


Sub Button1_Click()
Dim wd As New Word.Application
Dim doc As Word.Document
Dim myChart As ChartObject, i As Integer, hasTrendline As Boolean
Set doc = wd.Documents.Add
wd.Selection.PageSetup.Orientation = wdOrientLandscape
wd.Visible = True

For Each myChart In ActiveSheet.ChartObjects
hasTrendline = False
For i = 1 To myChart.Chart.SeriesCollection.Count
If myChart.Chart.SeriesCollection(i).Trendlines.Count > 0 Then hasTrendline = True
Next i
If hasTrendline Then
myChart.Copy
wd.Selection.PasteSpecial _
Link:=False, _
DataType:=wdPasteEnhancedMetafile, _
Placement:=wdInLine, _
DisplayAsIcon:=False
End If
Next myChart
End Sub