访问当前页眉中的形状

时间:2018-01-27 11:15:08

标签: vba ms-word word-vba

我有一个包含多个部分的单词文档,其中包含一些“分隔页面”,这些页面在页眉中有一个页面填充矩形,因此它们可以使用用户定义的背景颜色。 这些背景颜色我希望能够通过宏来更改,当用户在分隔页面上双击时应该运行该宏。

这种工作(是的,我确信代码可以用With块写得好一点(我是一个C#人,这只是一个副项目):

Private Sub App_WindowBeforeDoubleClick(ByVal Sel As Selection, Cancel As Boolean)    
    Dim sectionNumber As Long

    sectionNumber = ActiveDocument.ActiveWindow.Selection.Information(wdActiveEndSectionNumber)

    Dim i As Integer
    Dim shapeCount As Integer
    shapeCount = ActiveDocument.Sections(sectionNumber).Headers(wdHeaderFooterPrimary).Shapes.Count
    For i = 1 To shapeCount
        ActiveDocument.Sections(sectionNumber).Headers(wdHeaderFooterPrimary).Shapes(i).Fill.ForeColor.RGB = RGB(255, 0, 0)
        ActiveDocument.Sections(sectionNumber).Headers(wdHeaderFooterPrimary).Shapes(i).Fill.BackColor.RGB = RGB(255, 0, 0)
    Next i
End Sub

当然,我仍然需要添加代码来检测用户是否实际双击分隔页等。

但现在最大的问题是标题包含所有分隔符页面的形状,而不仅仅是当前页面的形状,即使它们位于不同的部分!

它们似乎并不一定按照它们出现在文档中的顺序。那么如何找到当前分隔页的形状呢?

1 个答案:

答案 0 :(得分:2)

如果您发布Shapes Header的{​​{1}}集合,您将会发现所有标题中的所有形状。

相反,解决Header.Range.ShapeRange - 应该只返回锚定在特定标头范围内的Shapes

ActiveDocument.Sections(sectionNumber).Headers( _
  wdHeaderFooterPrimary).Range.ShapeRange(i).Fill.ForeColor.RGB = RGB(255, 0, 0)

注1:您可以提高代码的效率(更快,如果您在C#中使用interop则更加相关),并且通过分配对象更具可读性,而不是始终完全限定对象层次结构:

Dim hdr as Word.HeaderFooter
Set hdr = ActiveDocument.Sections(sectionNumber).Headers(wdHeaderFooterPrimary)

注意2:如果您希望优化VBA代码,可以使用For Each ... Next来循环集合:

Dim shp as Word.Shape
For Each shp in hdr.Range.ShapeRange

Next