2016-07-16 2 views
2

Я пытаюсь скопировать Excel-диаграмму в Word. У меня есть следующий скрипт в Excel, и он работает с Office 2003 для ПК и Office Mac 2011. В более поздней версии Office (2016) диаграмма не изменяется при вставлении, а токен, который он ищет, не заменяется диаграммой как это происходит в более ранних версиях. Вот сценарий, который работает, но не в более поздних версиях Office. Любая помощь будет принята с благодарностью.VBA Script для копирования Excel-диаграммы в Word, не работающей в более поздних версиях Word

ActiveChart.ChartArea.Select 
ActiveChart.ChartArea.Copy 
Set wrd = CreateObject("Word.Application") 
wrd.Documents(DocumentName).Activate 
     wrd.Selection.Find.ClearFormatting 
     With wrd.Selection.Find 
      .Text = "insert" & ChartName 'This is the token it is looking for in the Word document and is where the chart should be inserted. 
      .Replacement.Text = "" 
      .Forward = True 
      .Wrap = 1 'wdFindContinue 
      .Format = False 
      .MatchCase = False 
      .MatchWholeWord = False 
      .MatchWildcards = False 
      .MatchSoundsLike = False 
      .MatchAllWordForms = False 
      .Execute 
      If .Found = True Then 
       wrd.Selection.PasteAndFormat Type:=13 'wdChartPicture 
      End If 

В предыдущих версиях Управления этот сценарий принимает активные копии диаграммы Это и вставляет его в слово, глядя на знак и вставив его. Токен заменяется диаграммой, и диаграмма изменяется. В новых версиях токен остается в нижней части диаграммы, и диаграмма не изменяется.

Если невозможно определить, почему он не работает, можно ли написать код таким образом, чтобы он работал во всех версиях Office? Я пытался убедиться, что все настройки одинаковы, но могу ли я упустить некоторые предпочтения, которые могут вызвать проблему. Любые мысли были бы очень признательны, потому что это для меня большая проблема.

+0

Когда вы проходите через этот код, выполняется условие '.Found = True'? –

+0

Если это так, я бы посмотрел на метод ExecuteMSO ([здесь] (http://stackoverflow.com/questions/35605460/copy-text-formatting-in-a-excel-to-word-script/35606101# 35606101) является аналогичным вопросом, копируя диапазон ячеек из Excel в Word), а вот [несколько больше] (http://stackoverflow.com/search?q=user%3A1467082+ExecuteMso) в основном из Excel в PowerPoint, но общая идея такая же, вам просто нужно определить, какой глагол вызывать, и это должно быть самым надежным. –

+0

Состояние. Действительно верно. Я попытался заменить строку wrd.selection.pasteandformat Тип: = 13 с wrd.CommandBars.ExecuteMso «PasteasPicture» и получить сообщение об ошибке, говорящее, что «объект не поддерживает это свойство или метод» – Steve

ответ

0

Вы в основном два вопроса:

  1. Почему не эта работа в Excel 2016
  2. Как я могу сделать этот код независимым от версии и ОС-независимыми?

У меня нет 2016 Excel или Mac OS, поэтому я не могу ответить # 1, но я поделюсь некоторыми своими выводами в Excel 2010 и 2013 в случае, если это поможет вам найти решение в 2016 году. Я могу ответить на № 2 ниже.

Excel 2010/2013 Результаты:

В 2010 году Excel, я был в состоянии видеть некоторые подобные вопросы, то .Execute не было на самом деле замены текста. Я наблюдаю за тем, что .Execute меняет выбор - по существу .Executeвыбирает найденный текст. IOW, он не по умолчанию заменить, он просто находит и выбирает. Для того, чтобы заменить, мне нужно сделать:.

.Execute Replace:=wdReplaceAll 

Однако, как паста (будь PasteAndFormat или ExecuteMso успешно заменить новый «выбор»

я наблюдаю то же самое в Excel 2013 , и, предположительно, which is the latest version documented on MSDN же, как модель объекта 2016.

Н.Б. Я использовал метод .CopyPicture вместо .Copy. Возможно, вам повезет с этим методом. Это стоит того.

Стремление к версии независимым (и ОС-независимый код)

можно ли написать код таким образом, что заставляет его работать во всех версиях Office?

Да, и для этого потребуется определить, что работает в каждой версии, и использовать технику под названием Conditional Compilation. Обычно этот метод используется для учета изменений в объектной модели, которые повышают ошибку компиляции.

Например, скажем, этот блок кода работает в 2003 году:

 .Execute 
     If .Found = True Then 
      wrd.Selection.PasteAndFormat Type:=13 'wdChartPicture 
     End If 

И этот блок кода работает в 2010 и 2013:

 .Execute Replace:=wdReplaceAll 
     If .Found = True Then 
      wrd.CommandBars.ExecuteMSO "PasteAsPicture" 
     End If 

И другой код работает 2016+ (это не настоящий код, но нести со мной):

 .Execute Replace:=wdReplaceAll 
     If .Found = True Then 
      wrd.SOMETHING_FOR_2016 
     End If 

Тогда вы бы сделали:

#If Mac Then 
    Debug.Print "Mac" 
    .Execute 
    If .Found = True Then 
     wrd.SOMETHINGFORMAC 'pseudo-code 
    End If 
#Else 
    Debug.Print "Windows" 
    Select Case CLng(Application.Version) 
     Case 11 'Excel 2003 
      Debug.Print 2003 
      .Execute 
      If .Found = True Then 
       wrd.Selection.PasteAndFormat Type:=13 'wdChartPicture 
      End If 
     Case 14 'Excel 2010 
      Debug.Print 2010 
      .Execute Replace:=wdReplaceAll 
      If .Found = True Then 
       wrd.CommandBars.ExecuteMSO "PasteAsPicture" 
      End If 
     Case 15 'Excel 2013 
      Debug.Print 2013 
      .Execute Replace:=wdReplaceAll 
      If .Found = True Then 
       wrd.CommandBars.ExecuteMSO "PasteAsPicture" 
      End If 
     Case Is > 15 'Excel 2016+ 
      Debug.Print "2016+" 
      .Execute Replace:=wdReplaceAll 
      If .Found = True Then 
       wrd.SOMETHING_FOR_2016 
      End If 
     Case Else 
      MsgBox "Other versions would require add'l logic..." 
    End Select 
#End If 
+1

Большое спасибо. Я попробую это, но я не смогу сделать это до конца следующей недели. Я дам вам знать, что произойдет. – Steve

+0

Тем временем я попробовал это на Mac. Я заменил линии Если .Found = True Type Тогда wrd.Selection.PasteAndFormat: = 13 «wdChartPicture End If со следующим Если .Found = True Then .Execute Replace: = wdReplaceAll End If Кодекса но ничего не произошло, т. е. текст не заменился на диаграмме. Я не профессиональный программист, поэтому, возможно, я неправильно понял инструкции. – Steve

+0

Я также пробовал метод copypicture, но он сказал, что его не существует. Сценарий находится в файле Excel, который пытается скопировать выбранную диаграмму. У него нет проблем с методом копирования. – Steve