0

通常,我必须根据自定义属性的内容更改 word 文档的所有标题。例如,如果文档属性“状态”不等于最终属性,则所有标题都必须包含在红色背景上以粗体字符书写的“草稿”。如果文档是“最终的”,则不得出现草稿并且背景必须为“无”。

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

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

4

2 回答 2

0

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

假设您正在使用您所描述的文档属性状态。如果值为“草稿”,则表格中的文本将为“这是草稿”,如果是其他任何内容,则文本将为“这不是草稿”。Word 可能会对这些属性感到奇怪,所以我要做的第一件事就是测试。将您的属性设置为 DRAFT,然后创建一个字段以确保 Word 正在读取它。

文档类型中的任何位置:

[Ctrl+F9] DOCPROPERTY  Status

这将导致文本看起来像

{DOCPROPERTY Status} 

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

现在切换域代码(选择,右键单击并选择切换域代码)。如果它变成显示 DRAFT 的文本,您就可以开始了。如果没有,您可能没有按照 Word 想要的方式设置属性。我这样做的方法是转到“高级属性”,单击“自定义”选项卡,在列表中找到“状态”,添加值,然后单击“添加”,使其出现在下方。可能还有其他方法,但可行。

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

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

If 语句将 compare 语句的值与 1 进行比较,后面的两个带引号的字符串反映了 If 语句计算结果为 true 时会出现什么,以及 if 语句计算结果为 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 宏一起运行以使它们保持同步(或编写第三个宏来触发它们,这样您就不会忘记)。

于 2014-11-03T16:17:15.103 回答
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
于 2017-01-19T22:39:05.337 回答