2017-08-11 103 views
0

我對VBA瞭解甚少,但仍然在學習。Excel VBA - 將書籤/表單字段與Word交叉引用

我一直在Word中使用書籤來填充Excel中的數據。但是,由於某些數據需要在文檔中重複的內容,我嘗試使用文本表單字段/書籤和REF字段來複制相同的數據。

問題出現了,當我填充數據到單詞時,文本表單字段/書籤消失,導致REF字段無法跟蹤被引用的數據,因此,「Error!Reference source not found」。

總之,我想要做的是將數據從excel填充到鎖定的單詞文檔,同時保留文本字段表單/書籤以便讓REF字段跟蹤和複製相同的數據。

數據填充到單詞後,是否有任何方法保留文本字段表單/書籤佔位符?這是我在Excel VBA中無法解決的代碼。

提前感謝您的幫助!

Private Sub CommandButton1_Click() 
Dim ws As Worksheet 
Set ws = ThisWorkbook.Sheets("Sheet1") 
Dim objWord As Object 
Set objWord = CreateObject("Word.Application") 
objWord.Visible = True 
objWord.Documents.Open "C:\Users\" & Environ("username") & "\Desktop\XXX\XXX" 
objWord.ActiveDocument.Unprotect Password:="xxx" 
With objWord.ActiveDocument 

Dim objBMRange As Range 
Set objBMRange = .Bookmarks("pr1").Range.Text = ws.Range("C28").Value 
objBMRange.Text = pr1 
.Bookmarks.Add "pr1", BMRange 
.Fields.Update 

objWord.ActiveDocument.Protect Password:="xxx", NoReset:=False, Type:=wdAllowOnlyFormFields 
End With 

Set objWord = Nothing 
End Sub 
+0

爲什麼不使用使用excel數據作爲後端的Mailmerge? – Sixthsense

+0

我們有很多類型的文件和信息要生成,再加上我們有用戶問題,因此郵件合併不適合我的情況。 –

回答

0

你快到了。非常接近,但你沒有得到Range對象。請嘗試此代碼(僅部分測試)。

Private Sub CommandButton1_Click() 

    Dim Ws As Worksheet 
    Dim objWord As Object 
    Dim Mark As String 
    Dim Txt As String 
    Dim BmkStart As Long 

    Mark = "pr1" 
    Set Ws = ThisWorkbook.Sheets("Sheet1") 
    Txt = Ws.Range("C28").Value 

    Set objWord = CreateObject("Word.Application") 
    With objWord 
     .Visible = True 
     .Documents.Open "C:\Users\" & Environ("username") & "\Desktop\XXX\XXX" 
     With .ActiveDocument 
      .Unprotect Password:="xxx" 

      If .Bookmarks.Exists(Mark) Then 
       With .Bookmarks(Mark).Range 
        BmkStart = .Start 
        .Text = Txt 
       End With 
       .Bookmarks.Add Mark, .Range(BmkStart, BmkStart + Len(Txt)) 
      End If 
      .Fields.Update 
      .Protect Password:="xxx", NoReset:=False, Type:=wdAllowOnlyFormFields 
     End With 
    End With 

    Set objWord = Nothing 
End Sub 

的一點是,Bookmark定義Word.Range(不同於一個Excel.Range時不指定應用程序在Excel中工作時,你得到)。另一方面,Bookmark定義了一個範圍,但本身不是範圍,甚至不是Word.Range。因此,您通過修改其範圍的Text屬性來獲取或設置文本。

+0

謝謝Variatus的回覆!最後它的作品!謝謝!! –

+0

對不起,最後一個問題。我試着複製相同的代碼Mark =「pr1」txt = ws.range(「C28」)。在它下面填入值並粘貼不同的書籤數據和不同的範圍,但它只出現最後粘貼的代碼。例如,第一個是pr1,第二個是pr2,但是隻有pr2數據。 –

+0

嗨Variatus,我設法自己解決它。無論如何,再次感謝您的幫助!欣賞它! –