我在弄清楚这个问题时遇到了一些麻烦,非常感谢一些帮助。我正在尝试编写一个使用 selection.text 属性作为大小写文本表达式的宏。在 Word 中单击宏Microsoft时,所选文本将自动设置为显示文本。此方法非常适合通过 Selection.Font.Color 进行格式化,以实现快速而脏的格式切换宏,但它不适用于实际文本。
使用 MsgBox 进行调试时,它显示一个框(例如:□(作为值。
例如
字域代码:
{ MACROBUTTON Macro_name DisplayText }
VBA代码在Word中突出显示"显示文本"时运行:
Sub Macro_name()
Dim Str As String
Str = Selection.Text
MsgBox Str
Select Case Str
Case "DisplayText"
MsgBox "A was selected"
Case "B"
MsgBox "B was selected"
End Select
End Sub
输出的是一个仅显示□的消息框 当我在选择一些常规文本的情况下运行此宏时,它工作正常。
我的问题是:有没有办法让宏读取域代码的显示文本部分以在宏中使用?
您可以直接读取字段代码,而不是选择(或也不提供文本的Field.Result
(。
目前还不清楚如何在整个文档中使用此宏,因此下面的代码示例提供了两种变体。
两者都检查所选内容是否包含字段,如果是,则检查(第一个(字段是否为MacroButton
字段。然后测试域代码。
在注释掉的变体(更简单的变体(中,代码然后简单地检查字段代码中是否存在MacroButton
显示文本。如果是,则该文本将分配给Select
语句正在测试的字符串变量。
如果这还不够,因为显示文本是"未知的"(可能有多个 MacroButton 字段(,那么有必要找到包含显示文本的域代码部分。在这种情况下,函数InstrRev
在整个字段代码中查找组合字段名称和宏名称的端点以及中间空格,从字符串的末尾进行搜索。之后,Mid
函数提取显示文本并将其分配给由Select
语句测试的字符串变量。
在这两种变体中,如果所选内容不包含MacroButton
字段,则将所选测试分配给Select
语句的字符串变量。
(请注意,对于我的测试,我需要在Select
语句中使用Case Else
。您可能想将其改回Case "B"
...
Sub Display_Field_DisplayText()
Dim Str As String, strDisplayText As String
Dim textLoc As Long
Dim strFieldText As String, strMacroName As String
Dim strFieldName As String, strFieldCode As String
strDisplayText = "text to display"
If Selection.Fields.Count > 0 Then
If Selection.Fields(1).Type = wdFieldMacroButton Then
strFieldName = "MacroButton "
strMacroName = "Display_Field_DisplayText "
strFieldCode = strFieldName & strMacroName
Str = Selection.Fields(1).code.text
textLoc = InStrRev(Str, strFieldCode)
strFieldText = Mid(Str, textLoc + Len(strFieldCode))
MsgBox strFieldText
Str = strFieldText
'If InStr(Selection.Fields(1).code.text, strDisplayText) > 0 Then
' Str = strDisplayText
'End If
End If
Else
Str = Selection.text
End If
Select Case Str
Case strDisplayText
MsgBox "A was selected"
Case Else
MsgBox "B was selected"
End Select
End Sub