我们在 VBA 中开发了一些 Microsoft Word 工具,允许用户向文档添加部分,并提供 A3 和 A4 页面大小以及纵向和横向方向的选项。我们使用一个表单向用户展示单选按钮,(用户)可以在其中选择新部分的页面大小和方向。 VBA 代码添加一个新部分,然后关闭页眉和页脚“与先前相同”设置,设置边距并在页眉和页脚上添加特定的自动文本以控制页眉和页脚的布局,即取决于所选的单选按钮。 我们遇到问题的文档 – 也有奇数页和偶数页。 但在没有奇数和偶数页面布局的文档中也会失败。
我们已经在 Word 2010 上使用这段代码很多年了,没有出现任何问题,但现在我们在 Word 2016 上和以下代码部分中遇到了不一致的问题。即,即使代码专门将“链接到上一个”设置为 false,代码也不会随机关闭“与上一个相同”。下面是我们在 Word 2010 上使用时没有出现问题但现在失败的代码的一部分:
With NewSection
.Headers(wdHeaderFooterFirstPage).LinkToPrevious = False
.Headers(wdHeaderFooterPrimary).LinkToPrevious = False
.Headers(wdHeaderFooterEvenPages).LinkToPrevious = False
.Footers(wdHeaderFooterFirstPage).LinkToPrevious = False
.Footers(wdHeaderFooterPrimary).LinkToPrevious = False
.Footers(wdHeaderFooterEvenPages).LinkToPrevious = False
End With
我们上面尝试做的事情是否存在已知问题?为什么“链接到上一个”可能无法始终如一地工作。
与上述问题相关的另一个问题是,在 Word 2016 上,即使上一节存在,我们也会收到以下消息: 请看截图
上面的代码行之一会随机失败,例如: 请看截图
第二个问题与第一个问题相关吗?
对于遇到此问题的任何人,我都遇到同样的问题,模板中的某些部分不允许我将
Headers(wdHeaderFooterPrimary).LinkToPrevious
设置为 True
。没有错误,只是保持 False
并且页眉/页脚保持未链接状态。我正在使用 Word 365 版本 2405。
我发现反复设置
Headers(wdHeaderFooterPrimary).LinkToPrevious = True
最终会起作用。
这是我的循环解决方案。这也可能适用于关闭链接,只需将其交换为
False
。
Dim i As Long
Dim Retries As Integer
Dim MaxRetries As Integer
Dim StartingSection As Long
Dim LastSection As Long
MaxRetries = 10
StartingSection = 2
LastSection = ActiveDocument.Sections.Count
For i = StartingSection To LastSection
With ActiveDocument.Sections(i)
.Headers(wdHeaderFooterFirstPage).Range.Delete 'Shouldn't be needed, but might help some edge cases
.Headers(wdHeaderFooterPrimary).LinkToPrevious = True
.Headers(wdHeaderFooterFirstPage).LinkToPrevious = True
.Headers(wdHeaderFooterEvenPages).LinkToPrevious = True
Do While Not .Headers(wdHeaderFooterPrimary).LinkToPrevious And Retries < MaxRetries
Retries = Retries + 1
.Headers(wdHeaderFooterPrimary).LinkToPrevious = True
Loop
Retries = 0
.Footers(wdHeaderFooterFirstPage).Range.Delete 'Shouldn't be needed, but might help some edge cases
.Footers(wdHeaderFooterPrimary).LinkToPrevious = True
.Footers(wdHeaderFooterFirstPage).LinkToPrevious = True
.Footers(wdHeaderFooterEvenPages).LinkToPrevious = True
Do While Not .Footers(wdHeaderFooterPrimary).LinkToPrevious And Retries < MaxRRetries
Retries = Retries + 1
.Footers(wdHeaderFooterPrimary).LinkToPrevious = True
Loop
Retries = 0
End With
DoEvents
Next i