Extracting an OLEObject (XML Document) from PowerPoint VBA

…衆ロ難τιáo~ 提交于 2019-12-02 13:16:26

After a lot (a LOT) of searching, I had written this off and was moving on to one of several "Plan B" solutions, when I stumbled on a possible solution.

I know that DoVerbs 1 activates the embedded package file (.txt, .xml, etc) but I did not have any control over the new instance of Notepad, from which I need to read the XML contained therein.

Instead of copying and trying to paste the object (which fails manually and programmatically)

'Save this out to a drive so it can be accessed by a COM Object:
    metaDoc.Copy
CreateObject("Shell.Application").Namespace(ActivePresentation.Path).self.InvokeVerb "Paste"

I was able to use a slightly modified version of the solution posted here:

http://www.excelforum.com/excel-programming-vba-macros/729730-access-another-unsaved-excel-instance-and-unsaved-notepad-text.html

to read the open, unsaved instance of Notepad as a string, which I then write to a new file. This is called from the NotepadFunctions.ReadNotepad() function documented in the above mentioned link.

Sub ExtractLocalXMLFile(xlsFile As Object)
'Extracts an embedded package object (TXT file, for example)
' reads string contents in from Notepad instance and
' prints a new file with string contents from embed file.

Dim embedSlide As slide
Dim DataObj As New MSForms.DataObject 'This is the container for clipboard contents/object
Dim fullXMLString As String         'This is the captured string from clipboard.
Dim t As Long                       'Timer variable

MsgBox "Navigating to the hidden slide because objects can only be activated when " & _
        "the slide is active."

Set embedSlide = ActivePresentation.Slides("Hidden")

ActivePresentation.Windows(1).View.GotoSlide embedSlide.SlideIndex

'Make sure no other copies of this exist in temp dir:

On Error Resume Next
    Kill UserName & "\AppData\Local\Temp\" & _
         MetaDataXML_FilePath
            'replace an xls extension with txt
On Error GoTo 0

xlsFile.OLEFormat.DoVerb 1
        '1 opens XML package object -- ' for xls/xlsm files use Verb 2 to Open.
        ' in which case I can maybe control Notepad.exe

t = Timer + 1

Do While Timer < t
    'Wait... while the file is opening
Wend

'Retrieve the contents of the embedded file

fullXMLString = Notepad_Functions.ReadNotepad(Notepad_Functions.FindNotepad("Chart Meta XML"))

'This function closes Notepad (would make it a subroutine, instead.

'CloseAPP_B "NOTEPAD.EXE"  '<--- this function is NOT documented in my example on StackOverflow

'Create a new text file

WriteOutTextFile fullXMLString, MetaDataXML_FilePath

'Get rid of the embedded file

xlsFile.Delete

End Sub

Sub WriteOutTextFile(fileString As String, filePath As String)

'Creates a txt file at filePath
'inserting contents (filestring) from the temp package/XML object

Dim oFile As Object
Dim fso As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.CreateTextFile(filePath)

oFile.WriteLine (fileString)
oFile.Close

End Sub
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!