Макрос vba для вставки диаграммы из excel в word и форматирования с переносом текста

В моем документе Excel есть диаграмма, которую я хочу скопировать и вставить в документ MS-Word. Я хочу избежать связывания данных, встраивания книг и изменения размера (в Excel диаграмма отформатирована до желаемого размера). Итак, я придумал / нашел следующий код, который почти работает:

Sub PasteChart()

Dim wd As Object
Dim ObjDoc As Object
Dim FilePath As String
Dim FileName As String
FilePath = "C:\Users\name\Desktop"
FileName = "Template.docx"


'check if template document is open in Word, otherwise open it
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
    Set wd = CreateObject("Word.Application")
    Set ObjDoc = wd.Documents.Open(FilePath & "\" & FileName)
Else
    On Error GoTo notOpen
    Set ObjDoc = wd.Documents(FileName)
    GoTo OpenAlready
notOpen:
    Set ObjDoc = wd.Documents.Open(FilePath & "\" & FileName)
End If
OpenAlready:
On Error GoTo 0

'find Bookmark in template doc
wd.Visible = True
ObjDoc.Bookmarks("LPPU").Select

 'copy chart from Excel
 Sheets("Group Level Graphs").ChartObjects("Chart 1").Chart.ChartArea.Copy

 'insert chart to Bookmark in template doc
 wd.Selection.PasteSpecial Link:=False, DataType:=14, Placement:=0, _
    DisplayAsIcon:=False

 End Sub

Единственная проблема заключается в том, что изображение вставлено как «В строке с текстом», но мне нужно, чтобы оно было «Квадрат с переносом текста». Я не могу заставить Word или Excel записать изменение изображения на «Квадрат с переносом текста».

Компонент PasteSpecial предназначен только для размещения wdFloatOverText или wdInLine, и ни один из них не решает эту проблему.

Я очень новичок в VBA, и у меня закончились идеи. Я все еще пытаюсь найти способ отформатировать его, возможно, используя какой-то оператор WITH. Однако я подумал, что попытаюсь обратиться за помощью, пока продолжу работу с google-foo и изучу VBA с Youtube.

Использование PasteAndFormat Type:=wdChartPicture связывает диаграмму с Excel. Так что это не сработало.

0
0
2 740
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Убедитесь, что у вас есть ссылка на приложение Word в вашем VBE, затем сразу после обычной вставки (wd.Selection.Paste) добавьте эти две строки кода:

wd.Selection.MoveStart word.WdUnits.wdCharacter, Count:=-1
wd.Selection.InlineShapes(1).ConvertToShape.WrapFormat.Type = wdWrapSquare

Если вы хотите продолжать использовать метод PasteSpecial, который есть в вашем коде, замените строку кода над «wd.Selection.MoveStart ...» на следующую:

wd.Selection.MoveEnd word.WdUnits.wdCharacter, Count:=1

Причина в том, что при обычной вставке активная точка вставки остается в конце вставленного объекта. Но если используется метод PasteSpecial, активная точка вставки находится в начале вставленного объекта. Почему? Я понятия не имею! Слово VBA не перестает меня удивлять. :-)

@Thomas, я скорректировал ответ выше на основе комментариев, которыми вы и я поделились. Stack Overflow любит, чтобы строки комментариев были короткими, а окончательный правильный ответ отражал любые изменения, сделанные на основе временных комментариев. Я убираю свои комментарии по мере того, как мы продвигаемся. Я рекомендую вам поступить так же. Также, если этот окончательный ответ сработает за вас, я надеюсь, вы отметите его как ответ на свой вопрос.

Rich Michaels 14.09.2018 00:44

Другие вопросы по теме