我有一个包含多个部分的单词文档,其中包含一些“分隔页面”,这些页面在页眉中有一个页面填充矩形,因此它们可以使用用户定义的背景颜色。 这些背景颜色我希望能够通过宏来更改,当用户在分隔页面上双击时应该运行该宏。
这种工作(是的,我确信代码可以用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
当然,我仍然需要添加代码来检测用户是否实际双击分隔页等。
但现在最大的问题是标题包含所有分隔符页面的形状,而不仅仅是当前页面的形状,即使它们位于不同的部分!
它们似乎并不一定按照它们出现在文档中的顺序。那么如何找到当前分隔页的形状呢?
答案 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