Hi OfficeNinja,
I've lately had occasion to delve into extracting data from Office 2007 files. The following macro is based on that work. It probably does far more than you need. I can also be run from any Office 2007/2010 application, as none of the code is application-specific. After selecting the folder to process, the code extracts all files in each xlsx/xlsm file's _rels\ folder and outputs them to a new 'XlRels' folder in the parent folder. Each output file's name is prefixed with the parent file's name. If you want to extract data from just one file, the easiest way would be to put in into a folder on its own, then point the macro to that folder.
Code:
Sub ExtractXlRels()
Application.ScreenUpdating = False
Dim SBar As Boolean ' Status Bar flag
Dim StrInFold As String, StrOutFold As String, StrTmpFold As String
Dim StrDocFile As String, StrZipFile As String, Obj_App As Object, i As Long
Dim StrFile As String, StrFileList As String, StrMediaFile As String, j As Long
StrInFold = GetFolder
If StrInFold = "" Then Exit Sub
' Store current Status Bar status, then switch on
SBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
StrOutFold = StrInFold & "\XlRels"
StrTmpFold = StrInFold & "\Tmp"
'Test for existing tmp & output folders, create they if they don't already exist
If Dir(StrTmpFold, vbDirectory) = "" Then MkDir StrTmpFold
If Dir(StrOutFold, vbDirectory) = "" Then MkDir StrOutFold
'Create a Shell App for accessing the zip archives
Set Obj_App = CreateObject("Shell.Application")
'Look for docx files to process
StrFile = Dir(StrInFold & "\*.xls?", vbNormal)
'Build the file list
While StrFile <> ""
StrFileList = StrFileList & "|" & StrFile
StrFile = Dir()
Wend
'process the file list
j = UBound(Split(StrFileList, "|"))
For i = 1 To j
'ID the document to process
StrDocFile = StrInFold & "\" & Split(StrFileList, "|")(i)
' Report progress on Status Bar.
Application.StatusBar = "Processing file " & i & " of " & j & ": " & StrDocFile
'Define the zip name
StrZipFile = Split(StrDocFile, ".")(0) & ".zip"
'In case the file is in use or zip file has no media
On Error Resume Next
'Create the zip file, by simply copying to a new file with a zip extension
FileCopy StrDocFile, StrZipFile
'Extract the zip archive's media files to the temporary folder
Obj_App.NameSpace(StrTmpFold & "\").CopyHere Obj_App.NameSpace(StrZipFile & "\_rels\").Items
'Delete the zip file - the loop takes care of timing issues
Do While Dir(StrZipFile) <> ""
Kill StrZipFile
Loop
'Restore error trapping
On Error GoTo 0
'Get the temporary folder's file listing
StrMediaFile = Dir(StrTmpFold & "\*.*", vbNormal)
'Process the temporary folder's files
While StrMediaFile <> ""
'Copy the file to the output folder, prefixed with the source file's name
FileCopy StrTmpFold & "\" & StrMediaFile, StrOutFold & "\" & Split(Split(StrFileList, "|")(i), ".")(0) & StrMediaFile
'Delete the media file
Kill StrTmpFold & "\" & StrMediaFile
'Get the next media file
StrMediaFile = Dir()
Wend
Next
'Delete the temporary folder
RmDir StrTmpFold
' Clear the Status Bar
Application.StatusBar = False
' Restore original Status Bar status
Application.DisplayStatusBar = SBar
Application.ScreenUpdating = True
End Sub
Function GetFolder() As String
Dim oFolder As Object
GetFolder = ""
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
Set oFolder = Nothing
End Function