如何使用 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
我使用交互式内容控件创建了一个 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