从Word中提取嵌入的Excel工作表数据

时间:2014-09-16 16:40:19

标签: excel excel-vba ms-word word-vba ole vba

我有一批嵌入了Excel工作表的Word文档。用户通过双击工作表图像并打开嵌入的Excel对象,在Excel工作表中输入数据。我需要找到用户输入的数据。

下面是WORD VBA,引用了Microsoft Excel 15库。 (在Office 2010下创建的Word和Excel对象。)

我可以找到OLE对象,但我无法用它做任何事情。在下面的代码中,我尝试将对象分配给Worksheet对象,但是我遇到了类型不匹配错误。

为了使事情复杂化,嵌入的Excel工作表具有宏。在问题的一些过程中,将打开一个Excel窗口,其中会显示启用宏安全提示的提示。我很可能暂时禁用宏检查以超越它。

我需要做的就是获取工作表中的数据,将其复制到其他地方一次。如果可能的话,我很乐意将工作表复制到外部文件中。

我有Office 2010和2013,以及Visual Studio 2010 Pro和2014 Express。

如何访问嵌入式工作表数据?

    Sub x()
        Dim oWS As Excel.Worksheet
        Dim oIShape As InlineShape
        For Each oIShape In ActiveDocument.InlineShapes
            If Not oIShape.OLEFormat Is Nothing Then
                 If InStr(1, oIShape.OLEFormat.ProgID, "Excel") Then
                    oIShape.OLEFormat.ActivateAs (oIShape.OLEFormat.ClassType) 'Excel.Sheet.8
                    Set oWS = oIShape  '** type mismatch
                    Debug.Print oWS.Cells(1, 1)
                End If
            End If
        Next oIShape
    End Sub

我使用了建议开始上一次尝试: Modify embedded Excel workbook in Word document via VBA

在使用正确的引用时遇到了一些问题,并且代码弄乱了文档。

下面是另一个有效的通行证,但有一些我不明白的问题和代码。

1)我不想使用编辑模式,但其他模式不起作用 2)完美无瑕的参考Set xlApp = GetObject(," Excel.Application")很奇怪。某种无证的特征?

    Sub TestMacro2()
        Dim lNumShapes As Long
        Dim lShapeCnt As Long
        Dim xlApp As Object
        Dim wrdActDoc As Document
        Dim iRow As Integer
        Dim iCol As Integer

        Set wrdActDoc = ActiveDocument
        For lShapeCnt = 1 To wrdActDoc.InlineShapes.Count
            If wrdActDoc.InlineShapes(lShapeCnt).Type = wdInlineShapeEmbeddedOLEObject Then
                If wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.ProgID = "Excel.Sheet.8" Then
                    wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.Edit
                    Set xlApp = GetObject(, "Excel.Application")
                    With xlApp.Workbooks(1).Worksheets(2) ' can be multiple sheets, #2 is needed in this case
                        For iCol = 3 To .UsedRange.Columns.Count
                            If .Cells(1, iCol) = "" Then Exit For
                           For iRow = 1 To .UsedRange.Rows.Count
                                    Debug.Print .Cells(iRow, iCol) & "; ";
                            Next iRow
                            Debug.Print 'line feed
                        Next iCol
                    End With
                    xlApp.Workbooks(1).Close
                    xlApp.Quit
                    Set xlApp = Nothing
                End If
            End If
        Next lShapeCnt
    End Sub

代码运行良好,可以完成我的提取任务 - 谢谢!

0 个答案:

没有答案