通常,我必须根据customproperty的内容更改word文档的所有标题。例如,如果文档prorperty'Status'标记为除final之外的任何内容,则所有标题必须包含在红色背景上以粗体字符书写的'DRAFT'。如果文档是“最终”,则不得出现DRAFT,背景必须为“none”。
除第一部分外,我们的标题包含一个由一行和两个单元组成的表。必须根据“状态”翻转单元格1,单元格2必须保持不变。
是否有任何已知的解决方案(VBA或特定于单元格的'IF-THEN-ELSE语句)根据状态文档属性更改整个文档中单元格1的内容?目前,我必须滚动浏览所有部分并手动更改标题。
答案 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