【问题标题】:Word VBA to control formatting and content of table cells in headingWord VBA 控制标题中表格单元格的格式和内容
【发布时间】:2014-10-29 23:37:59
【问题描述】:

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

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

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

【问题讨论】:

  • 可以在表格单元格中使用字段吗?您可以设置一个条件字段来检查文档变量的状态(我假设属性也是如此)。如果您对文档有这么多的控​​制权,我可能会提供更完整的答案。
  • 是的:我可以自己定义标题。如果您能让我知道如何实现这一目标,我将不胜感激。提前致谢,卢卡斯

标签: vba ms-word heading


【解决方案1】:

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

假设您正在使用您所描述的文档属性状态。如果值为“草稿”,则表格中的文本将为“这是草稿”,如果是其他任何内容,则文本将为“这不是草稿”。 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 语句将比较语句的值与 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 宏一起运行以使它们保持同步(或编写第三个宏来触发它们,以免忘记)。

【讨论】:

  • 完美!非常感谢!是否也可以更改字段的颜色? “草稿”为红色,非草稿为无?提前感谢您的任何提示,卢卡斯
  • 可以更改文本突出显示,但不能更改整个单元格的阴影。不过,这可以通过 VBA 来完成。你追求的是哪一个?
  • 在草稿模式下,文本应为浅红色上的深蓝色,即单元格应为浅红色。非常感谢!
  • 谢谢!这正是我所需要的!卢克
  • 太好了,很高兴为您提供帮助。如果它适合您,请考虑标记答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多