[英]A few specific word bookmarks not being preserved after updating their text
因此,我正在嘗試使用 excel 電子表格來填充 word 模板。 .xlsm 文件中的命名范圍與單詞模板書簽名稱相同。 大多數運行得很好,但對於其中兩個,.bookmarks.add 方法失敗,沒有錯誤或警告,然后書簽丟失。 據我所知,這兩者並沒有什么特別或特別之處。 可能是什么原因?
有問題的書簽稱為“client_address2”(共 2 個)和“test_name2”(共 3 個)。
Sub preencher_word_2dd()
'Substitui os bookmarks do word pelo conteúdo do Bookmarks.xlsm
Dim wdApp As Word.Application
Dim wDoc As Word.Document
Dim bmkwb As Workbook
Dim bmk As Worksheet
Dim nome_report As String
Dim i As Integer
Set bmkwb = ActiveWorkbook
Set bmk = bmkwb.Sheets(1)
'Get the running word application
Set wApp = GetObject(, "Word.Application")
'get report name to be updated
nome_report = bmk.Range("project_number").Value & "_" & bmk.Range("report_number") & "_01 Overview.docx"
'select the correct, already open, word document
Set wDoc = wApp.Documents(nome_report)
Debug.Print wDoc.Bookmarks.Count
i = 1
With wDoc
For i = 1 To .Bookmarks.Count
For Each nm In bmkwb.Names
If .Bookmarks(i).Name = nm.Name Then
'On Error Resume Next
UpdateBookmark wDoc, .Bookmarks(i), nm.RefersToRange.Value
'On Error GoTo 0
Exit For
End If
Next nm
Next i
.Fields.Update
End With
Debug.Print wDoc.Bookmarks.Count
End Sub
Sub UpdateBookmark(wDoc As Word.Document, b As Word.Bookmark, TextToUse As String)
Dim BMRange As Word.Range
Dim BMName As String
Dim n_bmks As Integer
n_bmks = wDoc.Bookmarks.Count
Set BMRange = b.Range
BMName = b.Name
BMRange.Text = TextToUse
wDoc.Bookmarks.Add BMName, BMRange
If n_bmks <> wDoc.Bookmarks.Count Then
Debug.Print BMName, BMRange
Debug.Print wDoc.Bookmarks.Count, "Bookmark lost"
End If
End Sub
提前致謝!
您指的是書簽«稱為“client_address2”(2 個)和“test_name2”(3 個)»。 我假設它們被命名為“client_address1”、“client_address2”、“test_name1”、“test_name2”和“test_name3”,因為 Word 文檔不能有兩個或多個同名的書簽。
是否有任何書簽包含在另一個書簽內或與另一個書簽重疊? 如果是這樣,如果那些嵌入/重疊的書簽不再存在,這可能會導致您的“For i = 1 To.Bookmarks.Count”崩潰。 至於:
i = 1
With wDoc
For i = 1 To .Bookmarks.Count
For Each nm In bmkwb.Names
If .Bookmarks(i).Name = nm.Name Then
'On Error Resume Next
UpdateBookmark wDoc, .Bookmarks(i), nm.RefersToRange.Value
'On Error GoTo 0
Exit For
End If
Next nm
Next i
.Fields.Update
End With
這都可以簡化為:
With wDoc
For Each nm In bmkwb.Names
If .Bookmarks.Exists(nm.Name).Name Then _
Call UpdateBookmark(wDoc, .Bookmarks(nm.Name), nm.RefersToRange.Value)
Next nm
.Fields.Update
End With
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.