一些特定的单词书签在更新文本后没有被保留



因此,我尝试使用excel电子表格来填充单词模板。.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

提前感谢!

您可以参考书签«called"client_address2";(第2页(和";test_ name2";(共3页(»。我认为这些被命名为";client_address1"client_address2"test_ name1"test_ name2";,以及";test_name3";,因为Word文档不能有两个或多个同名书签。

是否有书签包含在另一个书签中或与另一个重叠?如果是这样,那么可能会导致您的"For i=1 To"。书签。如果那些嵌入/重叠的书签不再存在,则计数"崩溃"。关于:

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

最新更新