获取Word书签索引以从Excel中替换书签内的图像

时间:2017-04-25 11:27:34

标签: excel vba excel-vba word-vba

此问题与previous one相关。

我有一个带有一堆书签的打开Word文档,每个书签都有一个以前从Excel导出的Excel表格的内嵌图像。

现在,我需要更新Word文档中的表格,因为它们已在Excel中更改。

我这样做的方法是将Excel中的表名与Word中的书签名匹配。如果它们等于我想要用当前的图像替换Word中的现有图像。

到目前为止,这是我的代码:

Option Explicit

Sub substituir()
Dim Mark As String
Dim Rng As Range
Dim ShpRng As Range
Dim WordApp As Object
Dim DocumentoDestino As Object
Dim folha As Worksheet
Dim tabela As ListObject
Dim nomeTabela As String

Set WordApp = GetObject(class:="Word.Application")
Set DocumentoDestino = WordApp.ActiveDocument

For Each folha In ThisWorkbook.Worksheets
    If folha.Visible Then

    'loop all excel tables
    For Each tabela In folha.ListObjects
        tabela.Name = Replace(tabela.Name, " ", "")
        Mark = CStr(tabela.Name)

        With ActiveDocument
        If .Bookmarks.Exists(Mark) Then

            Set Rng = .Bookmarks(Mark).Range ' returns runtime error 13: Type mismatch, I guess it is because .Bookmarks expects the bookmark index instead of the name.


            If Rng.InlineShapes.Count Then
                Set ShpRng = Rng.InlineShapes(1).Range
                With ShpRng
                     Debug.Print .Start, .End
                    ShpRng.Delete

                End With
            End If
        End If
        End With

     Next tabela

    End If
Next folha

End Sub

代码似乎没问题,除了上面标记的返回运行时错误13的行,有没有办法获取书签索引而不是名称或其他方法来解决问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

问题来自Range对象。在Excel和Word中都有这样的对象。由于您运行的是Excel,因此Rng和ShpRng都会隐式声明为Excel范围。将它们声明为Word.Range

通常,对变量的使用要更加谨慎。你完美地声明了Set DocumentoDestino = WordApp.ActiveDocument,但接着你继续

With ActiveDocument
If .Bookmarks.Exists(Mark) Then

在Excel中,没有ActiveDocument。也许这就是为什么Excel正确地划分你引用DocumentoDestino的意图的原因。但是,如果你不保持紧密的控制实例可能会出现 - 当你最不期望它们时 - 当然,当Excel做出错误的猜测时。