2017-04-25 61 views
0

此问题与previous one有关。获取Word书签索引以替换Excel中的书签内部图像

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

现在,我需要更新的Word文档中的表格,因为他们在Excel中发生了变化。

我这样做的方式是匹配在Word中的书签名称在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

的问题是从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做出错误的猜测时。

+0

谢谢,我的知识仅限于excel vba,并不像您的知识那么强烈。我现在改进了变量声明,但第二个if语句不计算任何内联形状。这里有一个链接到word文档https://portalg-my.sharepoint.com/personal/nuno_portalg_onmicrosoft_com/_layouts/15/guestaccess.aspx?docid=177a32a1ed0a745bb93598158acd0f2ee&authkey=AWS7Irv4EdU6TL7gb8ewFgE –

+1

对不起,我不会下载你的文件,但谢谢你鲜花。然而,关于将InlineShape放入一个范围内,您肯定比我有更多的经验。我添加了计数功能,正是因为我对如何做到这一点怀疑。然后,您的形状必须位于书签旁边。使用Rng.Start和Rng.End,你可以在你想要的地方准确定义一个范围。现在的问题是,如何添加书签和InlineShape。也许另一个问题。你有没有考虑使用形状的标题? – Variatus

+0

减少您的选择。形状有名字。 InlineShapes具有标题。为什么你放弃了这两种选择? InlineShapes具有索引号,这些索引号在加载时按照它们加载的顺序排列。太不可靠?为可能的InlineShape将是唯一的段落创建书签。然后在书签的段落中找到形状。每个解决方案都有自己的问题。您不必面对所有选项的所有问题。 :-) – Variatus