您可以使用字段和宏来执行此操作。该字段将创建值,宏将更新它们以说明更改。
假设您正在使用您所描述的文档属性状态。如果值为“草稿”,则表格中的文本将为“这是草稿”,如果是其他任何内容,则文本将为“这不是草稿”。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 宏一起运行以使它们保持同步(或编写第三个宏来触发它们,这样您就不会忘记)。