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

Vba 从Excel获取Word书签索引以替换书签内的图像,vba,excel,ms-word,Vba,Excel,Ms Word,这个问题与一个问题有关 我有一个开放的Word文档,其中有一堆书签,每个书签都有一个以前从Excel导出的Excel表格的内联图像 现在,我需要更新Word文档中的表,因为它们在Excel中已更改 我这样做的方式是将Excel中的表名与Word中的书签名进行匹配。如果它们等于,我想用当前图像替换Word中的现有图像 这是我目前的代码: Option Explicit Sub substituir() Dim Mark As String Dim Rng As Range Dim ShpRng

这个问题与一个问题有关

我有一个开放的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的行之外,是否有任何方法可以访问书签索引而不是名称或其他方法来解决问题


提前谢谢

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

一般来说,在使用变量时要更加小心。您完美地声明了
Set DocumentoDestino=WordApp.ActiveDocument
,但随后继续

With ActiveDocument
If .Bookmarks.Exists(Mark) Then

在Excel中,没有
ActiveDocument
。也许这就是为什么Excel正确地预测到您要引用
文档destino
的意图。但是,如果您不严格控制,当Excel做出错误猜测时,很可能会出现实例(当然,在您最意想不到的时候)。

谢谢,我的知识仅限于Excel vba,而不像您的知识那么广泛。我现在改进了变量声明,但是第二个if语句不计算任何内联形状。这里是word文档的链接对不起,我不会下载你的文档,但是谢谢你的鲜花。然而,关于将一个内线形状放入一个范围,你肯定比我有更多的经验。我添加计数功能正是因为我不知道如何做到这一点。你的形状必须在书签旁边。使用Rng.Start和Rng.End,您可以非常精确地定义所需的范围。现在的问题是如何准确地添加书签及其InlineShape。也许还有一个问题。你是否考虑过使用形状的标题?减少你的选择。形状有名称。内联图形有标题。你为什么要放弃这两种选择?InlineShape具有索引号,索引号与加载时加载的顺序一致。太不可靠了?为只有内联形状的段落创建书签。然后在书签段落中找到形状。每个解决方案都有自己的问题。您不必面对所有选项的所有问题。:-)我以前试过使用inlinshape Alt文本,它很有效。但问题是如何用另一个来代替一个线性形状?让它成为另一个问题——用这个标题。