LinkToPrevious 的 Microsoft Word 2016 VBA 问题
Posted
技术标签:
【中文标题】LinkToPrevious 的 Microsoft Word 2016 VBA 问题【英文标题】:Microsoft Word 2016 VBA issues with LinkToPrevious 【发布时间】:2021-09-25 07:53:43 【问题描述】:我们在 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 上,即使存在前一部分,我们也会收到以下消息: Please see the screenshot
它在上述代码行之一上随机失败,例如: Please see the screenshot
第二个问题和第一个有关吗?
【问题讨论】:
@Timothy Rylatt:谢谢你的警告。我现在添加了屏幕截图的链接。 我不知道任何特定于 Wd2016 的东西会导致这种行为。我当然没有在 O365 中看到这种行为。从屏幕截图看来,NewSection
可能没有指向您想要的部分,但由于您只包含了一小段代码,因此无法调试。如果这只发生在某些文档上,则可能与文档损坏有关。
@Timothy Rylatt:NewSection 是使用以下语句创建的:NewSection = ActiveDocument.Sections.Add(rng)
和 rng:Set rng=Selection.Range
。即使在新创建的文档上也会发生这种情况(随机),而不仅仅是在某个文档上。
如果它完全是随机的,将很难调试。可能性包括:损坏的文件;损坏的模板;损坏的 Normal.dotm。
@Timothy Rylatt:我找到了导致这种情况的一段代码(见下文)。在设置与以前相同的代码设置边距、方向和页面大小后,然后在页脚上插入自动文本并使用此代码将图像发送到后面:.Footers(wdHeaderFooterPrimary).Range.ShapeRange.ZOrder msoSendToBack
.Footers(wdHeaderFooterEvenPages).Range.ShapeRange.ZOrder msoSendToBack
第一次代码运行时与以前的工作相同,因为上面的代码运行之后但在同一 Word 会话上第二次运行时发生。如果我保存文档并关闭 Word,那么在第一次再次打开时也可以正常工作。
【参考方案1】:
我发现问题与发送到后面语句的形状和在页脚上插入自动文本有关。如果您多次运行它(比如 4-5 次),我创建了一段失败的代码(即设置与之前的 true 相同,即使代码设置为 false)。要在下面运行代码,您需要创建一个自动文本“abcd”,其中包括一个锚定在页脚上的形状。您可以使用内置的笑脸形状来创建如下所示的自动文本。
代码如下:
Sub AddSections()
Dim rng As Range
Dim NewSection As Section
Set rng = Selection.Range
Set NewSection = ActiveDocument.Sections.Add(Selection.Range)
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
ActiveDocument.AttachedTemplate.BuildingBlockEntries("abcd").Insert Where:=.Footers(wdHeaderFooterPrimary).Range, RichText:=True
ActiveDocument.AttachedTemplate.BuildingBlockEntries("abcd").Insert Where:=.Footers(wdHeaderFooterEvenPages).Range, RichText:=True
.Footers(wdHeaderFooterPrimary).Range.ShapeRange.ZOrder msoSendToBack
.Footers(wdHeaderFooterEvenPages).Range.ShapeRange.ZOrder msoSendToBack
End With
NewSection.Range.Select
Selection.Collapse
Selection.TypeParagraph
End Sub
任何可以提供帮助的建议。我很想解决这个问题。
【讨论】:
以上是关于LinkToPrevious 的 Microsoft Word 2016 VBA 问题的主要内容,如果未能解决你的问题,请参考以下文章
在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsof