2017-04-25 58 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