如何使用 VBA 脚本更改 Microsoft Word 内容控件占位符文本格式?

How do I change a Microsoft Word Content Control placeholder text format using a VBA script?

我使用交互式内容控件创建了一个 Microsoft Word 表单。这是一个非常长的表格,有各种字段和字段类型(下拉列表、文本框、组合框、复选框等)。经过几个月和多次编辑,我发现它的格式不一致字段值和占位符文本值。有些字段即使在您填写后仍保持灰色。其他字段具有完全未变灰的占位符文本。字体的大小、样式和灰色阴影似乎不一致。我可以在设计模式中编辑占位符文本字体样式和大小,但我不知道如何确保占位符文本变灰(相同的灰色阴影)而字段值文本不是。此外,我正在考虑使用 VBA 宏来自动化该过程。我使用 Greg Maxey 共享的以下宏来大量设置占位符文本:

Sub SetPlaceHolderText()
Dim strText As String
  If Selection.Range.ContentControls.Count = 1 Then
    On Error GoTo Err_Handler
    With Selection.Range.ContentControls(1)
      strText = .PlaceholderText.Value
      .SetPlaceHolderText , , InputBox("Type your new placeholder text below.", _
                              "Define Placeholder Text", strText)
    End With
  Else
    MsgBox "You must select a single ContentControl." & vbCr + vbCr _
           & "Click the ""empty"" or ""title"" tag of the" _
           & " ContentControl you want to modify."
  End If
Exit Sub
Err_Handler:
End Sub

可以在这里找到:https://gregmaxey.com/word_tip_pages/modify_cc_placeholder_text.html

是否可以做类似的事情来应用默认的 Word 内容控件格式(例如占位符文本采用段落默认格式和一定的灰色阴影,直到它被覆盖,此时它不再变灰)?我有将近 80 个这种形式的内容控件,希望简化流程而不必从头开始。我将不胜感激任何建议,无论是使用 VBA 脚本还是 Word 对象属性。谢谢。

编辑:

我创建了一个简单的宏,它循环遍历我的字段并更改占位符和值的字体,但它不会更改所有默认值。正如我在评论中提到的,当我 select 某些东西然后通过 select 返回到占位符时,第一个下拉项默认与占位符相同,格式再次重置。这是脚本:

Sub Demo()

Dim cc As ContentControl

For Each cc In ActiveDocument.ContentControls
    If cc.Type = wdContentControlDropdownList Or cc.Type = wdContentControlComboBox Then
        If cc.ShowingPlaceholderText Then
            With cc.Range.Font
                .Name = "Times New Roman"
                .Size = 11
                .ColorIndex = wdGray50
            End With
        Else
            With cc.Range.Font
                .Name = "Times New Roman"
                .Size = 11
                .ColorIndex = wdBlack
            End With
        End If
    End If
Next cc

我完全不熟悉 Microsoft Word,但我能够创建表单并提取数据。但是,其他人对其进行了如此多的更改(这反过来又弄乱了一些格式构建),以至于回滚到我的“干净”版本并重新开始将需要大量工作。如果可能的话,我想“修复”现有的表格。我还缺少哪些其他 Word 内容控件默认字体?

编辑:

循环遍历日期选择器字段并应用标准格式和占位符文本也很好。出于某种原因,当我包括:

If cc.Type = wdContentControlDropdownList Or cc.Type = wdContentControlComboBox Or cc.Type = wdContentControlDate Then

我的日期占位符文本的格式与内容控件值文本的格式相同(在我上面的示例中,它是 wdBlack。)

不确定这是否符合您的要求,但看看其中是否有任何有用的东西...

Sub Demo()

    Const DEF_STYLE As String = "myCCStyle"
    
    Dim cc As ContentControl, s As Style, sP As Style
    
    'Adjust the built-in style used by the placeholder text
    With ActiveDocument.Styles("Placeholder text").Font
        .Color = wdColorGreen
        .Size = 11
        .Name = "Times New Roman"
    End With
    
    
    On Error Resume Next
    Set s = ActiveDocument.Styles(DEF_STYLE) 'see if our style exists
    On Error GoTo 0
    'add if not already there
    If s Is Nothing Then Set s = ActiveDocument.Styles.Add(DEF_STYLE, Type:=wdStyleTypeCharacter)
    With s.Font
        'just to be different....
        .Name = "Courier"
        .Size = 15
        .ColorIndex = wdBlue
    End With
    
    'set the default style (for non-placeholder content)
    For Each cc In ActiveDocument.ContentControls
        If cc.Type = wdContentControlDropdownList Or cc.Type = wdContentControlComboBox Then
            cc.DefaultTextStyle = DEF_STYLE
        End If
    Next cc

End Sub

通过内容控件重置占位符文本循环并将控件中当前的文本写入变量。删除控件中的文本并将占位符文本设置为变量的值。这将重置标志并且将自动应用占位符文本样式。这还将确保控件行为得到重置,以便单击它替换占位符文本。

Sub ResetCCPlaceholderText()
  Dim cc As ContentControl
  Dim promptText As String
  For Each cc In ActiveDocument.ContentControls
    if cc.Type = wdContentControlDate then
        promptText = cc.Range.Text
        cc.Range.Text = ""
        cc.SetPlaceholderText Text:=promptText
    end if
  Next cc
End Sub