VBA - 页脚修改 - 取消与之前的链接

时间:2018-06-13 09:16:46

标签: vba ms-word word-vba

我正在尝试创建一个宏,该宏创建一个具有不同方向的新页面,并使用不同的列表。

我有这段代码:

Selection.InsertBreak Type:=wdSectionBreakNextPage
If Selection.PageSetup.Orientation = wdOrientPortrait Then
  MsgBox "OK"
Else
  Selection.PageSetup.Orientation = wdOrientPortrait

  ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
  Selection.HeaderFooter.LinkToPrevious = Not Selection.HeaderFooter. _
    LinkToPrevious

  Selection.ParagraphFormat.TabStops.ClearAll
  Selection.ParagraphFormat.TabStops(CentimetersToPoints(18)).Position = _
    CentimetersToPoints(18.5)
  Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(9.5), _
      Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces
  ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End If

Selection.Style = ActiveDocument.Styles("Annexe1")

不幸的是,这改变了之前页面的表格。

我有办法解决这个问题吗? 我已经尝试过GoTo功能,包括页面,部分......但它并没有做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:0)

在VBA代码中使用Selection时总是很棘手 - 它并不总是精确地模仿用户执行操作时会发生什么。使用SeekView时,这尤其是页眉和页脚的问题。

以下适用于Range个对象(将Range视为不可见的选择,但您的VBA代码中可以有多个范围 - 只能有一个选择)。

首先将当前选择分配给Range对象,然后继续插入分节符并比较页面方向,就像你一样。

如果需要更改页面方向,则会将新部分的页脚分配给Footer对象。然后将页脚Range.ParagraphFormat分配给ParagraphFormat对象*。请注意这些是如何用于更改代码中的设置。最大的区别是,代码没有在页脚中添加任何选择:一切都是直接完成的。这不仅更快,更准确,还可以减少屏幕闪烁"。

最后,选择原始范围(已超出原始选区),因为我假设您希望在此时继续输入文本。如果没有,那么你可以删除这一行。

Sub ChangePageOrientationAndTabs()
    Dim ftr As word.HeaderFooter
    Dim pf As word.ParagraphFormat
    Dim rngSel As word.Range

    Set rngSel = Selection.Range
    rngSel.InsertBreak Type:=wdSectionBreakNextPage
    If rngSel.PageSetup.Orientation = wdOrientPortrait Then
        MsgBox "OK"
    Else
        rngSel.PageSetup.Orientation = wdOrientPortrait
        Set ftr = ActiveDocument.Sections(rngSel.Sections(1).index).Footers(wdHeaderFooterPrimary)
        ftr.LinkToPrevious = False

        Set pf = ftr.Range.ParagraphFormat
        pf.TabStops.ClearAll
        pf.TabStops(CentimetersToPoints(18)).Position = _
          CentimetersToPoints(18.5)
        pf.TabStops.Add Position:=CentimetersToPoints(9.5), _
          Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces

    End If

    rngSel.Paragraphs(1).Range.style = ActiveDocument.styles("Annexe1")
    rngSel.Select
End Sub

*对我来说,为什么将Footer.Range分配给Range对象可以解决上一部分的页脚问题,而Footer和ParagraphFormat是正确的...