我是一名转录员。我处理很长的文档并经常使用“查找和替换”。因此,我一直在尝试编写一个高效的 Word VBA 代码,以三种不同的方式查找和替换多个特定的通配符字符串:
需要明确的是,通过按一个按钮/快捷方式,我可以分别用粗体、斜体和大写字母查找/替换特定的 wildcard 字符串列表;三“批”字符串,三种不同的替换操作。
目前我有一个“全局”代码,它调用三(3)个单独的代码,每个代码调用更多代码。我认为这远非理想。它非常巨大,需要很长时间才能执行,变得滞后等等。
这是“全局”代码:
Sub ERET_ES_Format()
Application.ScreenUpdating = False
Call ERET_ES_Bold
Call ERET_ES_Italicize
Call ERET_ES_Capitalize
Call ERET_GoToBookmark_End
Application.ScreenUpdating = True
End Sub
这些是三 (3) 个后续代码:
Sub ERET_ES_Bold()
Call ClearParameters
Call ERET_C_Bold_Articles_ES
Call ClearParameters
Call ERET_C_Bold_Officials_ES
Call ClearParameters
Call ERET_C_Bold_Titles_ES
Call ClearParameters
Call ERET_C_Bold_QA
Call ClearParameters
Call ERET_C_Bold_Headers_ES
Call ClearParameters
Call ERET_C_Bold_TwoNames
Call ClearParameters
End Sub
Sub ERET_ES_Italicize()
Call ClearParameters
Call ERET_C_Italicize_EnglishWords
Call ClearParameters
Call ERET_C_Italicize_LatinWords
Call ClearParameters
End Sub
Sub ERET_ES_Capitalize()
Call ClearParameters
Call ERET_C_CapsAfter_TwoSpaces
Call ClearParameters
Call ERET_C_CapsAfter_Symbols
Call ClearParameters
Call ERET_C_CapsAfter_Tabs
Call ClearParameters
End Sub
剩下的代码或多或少类似于这两个:
Sub ERET_C_Bold_Titles_ES()
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
selection.Find.Replacement.Font.Bold = True
'LCDO(A)
With selection.Find
.Text = "^t(LCD[AO]. *:)"
.Replacement.Text = "^t\1"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
selection.Find.Execute Replace:=wdReplaceAll
'HON.
With selection.Find
.Text = "^t(HBLE. *:)"
.Replacement.Text = "^t\1"
.Wrap = wdFindContinue
End With
selection.Find.Execute Replace:=wdReplaceAll
'SR./A.
With selection.Find
.Text = "^t(S[AR]{1,2}. *:)"
.Replacement.Text = "^t\1"
.Wrap = wdFindContinue
End With
selection.Find.Execute Replace:=wdReplaceAll
'DR./A.
With selection.Find
.Text = "^t(D[AR]{1,2}. *:)"
.Replacement.Text = "^t\1"
.Wrap = wdFindContinue
End With
selection.Find.Execute Replace:=wdReplaceAll
'ING.
With selection.Find
.Text = "^t(ING. *:)"
.Replacement.Text = "^t\1"
.Wrap = wdFindContinue
End With
selection.Find.Execute Replace:=wdReplaceAll
'NO IDENTIFICADO X
With selection.Find
.Text = "^t(NO IDENTIFICADO [0-9]:)"
.Replacement.Text = "^t\1"
.Wrap = wdFindContinue
End With
selection.Find.Execute Replace:=wdReplaceAll
End Sub
Sub ERET_C_CapsAfter_Tabs()
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
With selection.Find
.ClearFormatting
.Text = "^t([a-záéíóú])"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
While .Found
selection.range.Case = wdUpperCase
selection.Collapse Direction:=wdCollapseEnd
.Execute
Wend
End With
End Sub
我认为,如果我至少可以结合“较低”的代码,那可能会向前迈出一步。我一直在寻找有关如何在一次操作中查找/替换多个字符串的信息,是的,有很多示例,但它们没有使用通配符,而且我似乎无法正确添加“MatchWildcards”部分(如果这是这样做的方法,我真的不知道)或修改它们以便它们工作。
有什么建议吗?我错过了什么主题吗?
我刚刚开始学习 VBA 编码。如果有我没有看到的明显例子,或者已经被问/回答过,或者如果我很烦人并且错过了这里显而易见的内容,我深表歉意。我将不胜感激任何信息。我并不是要求有人给我写完整的代码。我真的很想学。
提前谢谢您。
更新:
感谢 Charles Kenyon,我能够清理代码,解决我遇到的所有问题。
这些是任何感兴趣的人的更新代码:
Sub ERET_SetFormat_ES()
Application.ScreenUpdating = False
Call ERET_SetBold
Call ERET_SetItalic
Call ERET_SetCase
Application.ScreenUpdating = True
End Sub
Sub ERET_SetBold()
SetBold "" 'INSERT WILDCARD STRING
SetBold "" 'INSERT WILDCARD STRING
SetBold "" 'INSERT WILDCARD STRING
End Sub
Sub SetBold(findText As String)
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
selection.Find.Replacement.Font.Bold = True
With selection.Find
.Text = findText
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
selection.Find.Execute Replace:=wdReplaceAll
End Sub
Sub ERET_SetItalic()
SetItalic "" 'INSERT WILDCARD STRING
SetItalic "" 'INSERT WILDCARD STRING
SetItalic "" 'INSERT WILDCARD STRING
End Sub
Sub SetItalic(findText As String)
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
selection.Find.Replacement.Font.Italic = True
With selection.Find
.Text = findText
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
selection.Find.Execute Replace:=wdReplaceAll
End Sub
Sub ERET_SetCase()
Call SetCase("") 'INSERT WILDCARD STRING
Call SetCase("") 'INSERT WILDCARD STRING
Call SetCase("") 'INSERT WILDCARD STRING
End Sub
Sub SetCase(pattern As String)
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
With selection.Find
.ClearFormatting
.Text = pattern
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
While .Found
selection.range.Case = wdUpperCase
selection.Collapse Direction:=wdCollapseEnd
.Execute
Wend
End With
End Sub