Как сохранить Word Shapes для изображения с помощью VBA? - PullRequest
1 голос
/ 28 июня 2011

У меня есть простое требование сохранять объекты чертежа MS-Office, встроенные в документ Word, в файлы изображений. Следующий код работал для извлечения изображения из Powerpoint. Однако это не работает для MS-Word, если я изменяю ActivePresentation на ActiveDocument. Метод экспорта не был доступен для объекта формы. Есть идеи?

Dim oPPTShap as Shape
For k = 1 To .Slides(intSlide).Shapes.Count
    Set oPPTShape = ActivePresentation.Slides(intSlide).Shapes(k)
    oPPTShape.Export "C:\images\s" & k & ".bmp", ppShapeFormatBMP                
Next

Ответы [ 4 ]

3 голосов
/ 12 сентября 2016

Это не очень хорошо, поскольку он выводит каждое изображение в формате EMF, но записывает каждое из изображений в коллекции встроенных фигур в отдельный файл.Конечно, его можно модифицировать для создания другой коллекции фигур.

Я бы хотел улучшить непосредственную запись JPG, но пока не знаю VBA для продвижения вывода WRITE через фильтр.Поэтому, чтобы использовать эти файлы, вам нужно запустить какой-нибудь внешний пост-процесс / пакет для преобразования файлов из EMF во что-то более удобное для использования.

Sub WriteInlineShapesToFile()
    Dim docCurrent As Document
    Dim shapeCurrent As InlineShape
    Dim RC As Integer
    Dim vData() As Byte
    Dim i As Long
    Dim lWritePos As Long
    Dim strOutFileName As String

    Set docCurrent = ActiveDocument

    i = 1

    For Each shapeCurrent In docCurrent.InlineShapes
        strOutFileName = "c:\temp\datafile" & CStr(i) & ".emf"
        Open strOutFileName For Binary Access Write As #1
        i = i + 1
        vData = shapeCurrent.Range.EnhMetaFileBits
        lWritePos = 1

        Put #1, lWritePos, vData

        Close #1

 Next shapeCurrent

    RC = MsgBox("Job complete.", vbOKOnly, "Job Status")

End Sub
2 голосов
/ 29 июня 2011

Код, который вы пытаетесь скопировать из PPT VBA в Word VBA, не будет работать, потому что функциональность отсутствует в Word.

Вы можете попробовать самостоятельно: при выборе фигур в Word и правойщелкните, у вас нет функции Сохранить как изображение ... (в отличие от PPT у вас есть функция).

Тем не менее, с этой страницы автор указывает на MVP, который создал решение VBA , чтобы делать то, что вы хотите: http://www.lebans.com/msword.htm

Надеюсь, что он будет делать то, что вы хотите,

1 голос
/ 09 марта 2012

Вот один грязный ( и самый быстрый ) трюк, о котором я могу подумать: D

Сохраните документ word во временную папку как веб-страницу. Что-то вроде

ActiveDocument.SaveAs FileName:="C:\Temp\Sample.htm", FileFormat:=wdFormatHTML, _
LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False

Все фигуры и изображения в документе Word будут автоматически сохранены в папке с именем C: \ Temp \ Sample_Files

Затем вы просто удаляете все файлы в этой папке, которые не являются изображениями:)

Дайте мне знать, если вы хотите продолжить эту опцию:)

Sid

EDIT

Черт возьми, я только что понял, что это старая нить. Хм, всем спасибо "Joel Coehoorn" за редактирование этой темы LOLZ

0 голосов
/ 10 марта 2014

Хорошо, это не решение, а другой подход к старой проблеме.До сих пор я натолкнулся на множество примеров, которые либо сохраняют файл в .HTML, а затем извлекают изображения из подпапки документа HTML, либо код, который извлекает архив документа, а затем извлекает файлы из извлеченного набора.

Как насчет этого:

  1. Итерация по встроенным формам документа, если вы находитесь в Word.

  2. Длякаждая встроенная форма:

    a.Скопируйте данные изображения в буфер обмена.У вас уже есть другие метаданные изображения, полученные с помощью объектной модели в VBA.

    b.Вы можете скопировать изображение, скажем, для первой Inline Shape следующим образом:

    ActiveDocument.InlineShapes(1).Range.CopyAsPicture
    

    c.Теперь, когда данные изображения находятся в буфере обмена, должна быть возможность получить данные из буфера обмена.Я знаю, что VBA отстой с этим, но вы должны иметь возможность использовать Windows API, чтобы обойти это.Если вы можете каким-то образом получить данные изображения обратно, вы можете записать их в файл с метаданными, полученными из объектной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...