Word VBA控制标题中表格单元格的格式和内容

时间:2014-10-29 23:37:59

标签: vba ms-word word-vba heading

通常,我必须根据customproperty的内容更改word文档的所有标题。例如,如果文档prorperty'Status'标记为除final之外的任何内容,则所有标题必须包含在红色背景上以粗体字符书写的'DRAFT'。如果文档是“最终”,则不得出现DRAFT,背景必须为“none”。

除第一部分外,我们的标题包含一个由一行和两个单元组成的表。必须根据“状态”翻转单元格1,单元格2必须保持不变。

是否有任何已知的解决方案(VBA或特定于单元格的'IF-THEN-ELSE语句)根据状态文档属性更改整个文档中单元格1的内容?目前,我必须滚动浏览所有部分并手动更改标题。

2 个答案:

答案 0 :(得分:0)

您可以使用字段和宏执行此操作。该字段将创建值,宏将更新它们以考虑更改。

假设您正在使用您所描述的文档属性状态。如果值为“DRAFT”,则表格中的文本将为“This is a draft”,如果是其他任何内容,则文本将为“This is a a draft”。 Word可以简单地讲述这些属性,所以我要做的第一件事就是测试。将您的属性设置为DRAFT,然后创建一个字段以确保Word正在读取它。

文档类型中的任何位置:

[Ctrl+F9] DOCPROPERTY  Status

这将导致文本看起来像

{DOCPROPERTY Status} 

但请注意,您必须使用Ctrl + F9来获取特殊字段括号。

现在切换字段代码(选择,右键单击并选择切换字段代码)。如果它成为说明草案的文本,那么你就准备好了。如果没有,您可能不会按照Word要求的方式设置属性。我这样做的方法是转到高级属性,单击自定义选项卡,在列表中查找状态,添加值,然后单击添加以使其显示在下面。可能还有其他方法,但是有效。

使用该字段代码取得成功后,在表格中创建一个新的字段代码(请记住所有括号都是使用Ctrl + F9创建的):

{ IF { COMPARE { DOCPROPERTY Status } = "DRAFT" } = 1 "This is a draft" "This is not a draft" }

If语句将compare语句的值与1进行比较,并且两个引用的字符串在反映If语句的计算结果为true时将显示的内容,以及在计算结果为false时显示的内容。切换域代码以查看您获得的内容。

然后,您可以创建一个小宏来为您更新它们,因此您不必手动更新每个宏。这样的事情应该有效:

Public Sub UpdateAllFields()
Dim objDoc as Document
Dim objSect As Section
Dim objHeader As HeaderFooter, objFooter As HeaderFooter

Set objDoc = ActiveDocument

objDoc.Fields.Update
For Each objSect In objDoc.Sections
    For Each objHeader In objSect.Headers
        objHeader.Range.Fields.Update
    Next objHeader
    For Each objFooter In objSect.Footers
        objFooter.Range.Fields.Update
    Next objFooter
Next objSect

End Sub

我误读了并且没有意识到应用于这些表的颜色变化,所以添加了一些关于它的内容。

可以使用字段更改字体颜色。更改上面的字段,使它看起来像这样(记住关于Ctrl + F9)(为了便于阅读,我添加了一些换行符。不要在你的字段中包含这些。将它们全部放在一行上):

{ IF { COMPARE { DOCPROPERTY Status } = "DRAFT" } = 1 
{ QUOTE "This is a draft" \*Charformat }
{ QUOTE "This is not a draft" \*Charformat } }

然后依次选择每个引用字段并应用您需要的任何字体格式。您也可以这种方式应用突出显示;我认为这不足以满足您对整个单元进行遮挡的要求,但您可以尝试一下,看看是否可以避免其他步骤。

如果你肯定需要遮蔽整个细胞,那么你需要另一个宏。这样的事情应该这样做:

Sub ChangeCol()
Dim objDoc As Document
Dim objTable As Table, objCell As Cell
Dim objFld As Field

Set objDoc = ActiveDocument

For Each objFld In objDoc.Fields
    If objFld.result.Information(wdWithInTable) = True And _
        objFld.Code Like "*IF*" And _
        objFld.Code Like "*DOCPROPERTY Status*" Then
        If objDoc.CustomDocumentProperties("Status").Value = "DRAFT" Then
            objFld.result.Cells(1).Shading.BackgroundPatternColor = wdColorRed
        Else: objFld.result.Cells(1).Shading.BackgroundPatternColor = wdColorAutomatic
        End If
    End If
Next objFld
End Sub

只需将它与UpdateFields宏一起运行以保持它们同步(或者编写第三个触发它们的宏,这样你就不会忘记)。

答案 1 :(得分:0)

请再次接受我的承认。此后,我使用的宏用于我的目的:

Private Sub colorizeTableCells(ByVal oFields As fields, sStatus As String)
    Dim objFld As field
    Dim bgColor As WdColor
    oFields.Update
    For Each objFld In oFields
        If objFld.Result.Information(wdWithInTable) = True And _
            objFld.Code Like "*IF*" And _
            objFld.Code Like "*DOCPROPERTY Status*" Then
                bgColor = wdColorAutomatic
                If sStatus = "DRAFT" Then
                    bgColor = wdColorRed
                End If
                objFld.Result.Cells(1).Shading.BackgroundPatternColor = bgColor
        End If
    Next objFld
End Sub
Sub processHeaderAndFooterFields()
    Dim objDoc As Document
    Dim objSect As Section
    Dim objHeader As HeaderFooter
    Dim objFooter As HeaderFooter
    Dim sStatus As String

    Set objDoc = ActiveDocument
    sStatus = objDoc.CustomDocumentProperties("Status").Value

    For Each objSect In objDoc.Sections
        For Each objHeader In objSect.Headers
            colorizeTableCells oFields:=objHeader.range.fields, sStatus:=sStatus
        Next objHeader
        For Each objFooter In objSect.Footers
            colorizeTableCells oFields:=objFooter.range.fields, sStatus:=sStatus
        Next objFooter
    Next objSect
End Sub