Нет идеального решения для этого, но то, что работает большую часть времени, это принудительно открывать / закрывать OLEFormat.Object
. Не имеет значения, будете ли вы повторно обрабатывать встроенный лист Excel из-за пределов Word (т.е. манипулировать форматом Open XML) или делать это через объектную модель. Для этого нужно открыть встроенную электронную таблицу Excel из Word, а затем закрыть этот объект, чтобы изображение сменилось на текущие значения во встроенной электронной таблице и новое изображение, которое будет создано.
Немного зависит, делаете ли вы это со многими документами Word или только с одним. В первом случае, глобальный шаблон (такой как normal.dot или пользовательский, который вы создаете и помещаете в папку STARTUP), или в последнем случае просто запустите код позади одного документа. Оба имеют разные способы запуска вещей, но по сути вы будете подключать событие Document_Open
и оттуда проверять, есть ли в текущем документе объекты OLE Embedded и, если да, открывать и закрывать их.
Не вдаваясь в ловушку, как я уже сказал, код не очень красивый. В основном потому, что он использует SendKeys
. В большинстве случаев это будет работать. Иногда это не так. Такова природа SendKeys
и других программ, получающих фокус без согласия (например, программа мгновенного обмена сообщениями).
Если Word имеет фокус (что означает, что вы не можете открыть VBE и нажать F5 ), этот код должен помочь:
Sub UpdateEmbeddedXLSX()
Dim workbook As InlineShape
For Each workbook In ActiveDocument.InlineShapes
With workbook
If .Type = wdInlineShapeEmbeddedOLEObject Then
''# Excel.Sheet.12 for Excel 2007
If .OLEFormat.ClassType = "Excel.Sheet.12" Then
''# Open Object as spreadsheet
.OLEFormat.DoVerb wdOLEVerbPrimary
''# If you want, you can also do any updates here like
.OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1"
''# Nasty - but it works - SendKeys
SendKeys "{ESC}", True
End If
End If
End With
Next
End Sub
По крайней мере, вы можете поместить этот код в ваш файл normal.dot и назначить его для QAT, который будет запускаться как макрос.
Обратите внимание, что код не касается открытия Excel, изменения значений, а затем закрытия - это неотъемлемая часть использования встроенных объектов. Использование связывания вместо встраивания было бы намного более плавным способом сделать все это, но я понимаю, что это не всегда вариант.