0

场景:

包含一系列句子(字符串)的 Word 文档。可能有多达 30 个可能的字符串(长度从 5 到 20 个字不等)。该文档将仅包含这些字符串的选择。

目标:

搜索文档、查找特定字符串的每次出现并在每次出现后插入特定文本代码(例如“(ACWD2553)”)的宏。这对集合中的所有其他字符串重复,每个不同的字符串都有自己不同的代码。某些字符串不会出现在文档中。字符串可以位于文档正文和表格单元格中。然后,该宏将应用于具有不同字符串选择的其他文档。

我已经使用 selection.find、content.find、target.list、insertafter 等尝试了很多天,但只有一种情况,但仍然遇到很多问题(例如,仅在一个实例中插入,或者代码重复插入直到 Word 冻结) .

奖励功能###

能够选择要搜索的字符串集(可能多达 60 组)及其对应的代码。每个文档将只有一组中的字符串。

我的一个想法是将字符串列在一个列中(在 Excel 中?),并将匹配的代码列在第二列中。然后,宏将在文档中搜索列表中的每个字符串(在列表末尾停止,因为字符串的数量在集合之间有所不同)在下一列的单元格中找到匹配的代码,然后插入每次出现的代码word doc 中的字符串。当需要不同的集合时,可以将 Excel 文件与包含相关字符串集合的文件交换,但文件名相同。或在不同工作表上的一个 Excel 文件中的所有集合和在 Word(用户窗体?)中输入的选项卡名称,这会强制搜索相关集合。该文件将位于网络驱动器上。

不确定这是否比 Ben Hur 大,最后一点会很好,但我也可以从模板代码手动输入原始代码中的字符串。

编辑了这篇文章以包括我对代码的糟糕尝试。请参阅下面的评论。我刚刚意识到我可以在这个窗格中添加代码。尝试了以下迭代的各种迭代,但没有一个效果很好,也没有达到我的要求。我知道存在明显的错误,正如我在下面所说的那样,我已经玩弄了代码,并通过将零碎混合在一起使其变得更糟。

Sub Codes()

Dim range As range
Dim i As Long
Dim TargetList

TargetList = Array("This is sentence 1", "This is string 2 which could be twenty words in length", "This is string three, there could be thirty more strings to search") ' put list of terms to find here

For i = 0 To UBound(TargetList)

Set range = ActiveDocument.range

With range.Find
.Text = TargetList(i)
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False

Do While .Execute(Forward:=True) = True
range.Find.Execute
range.InsertAfter Text:=" (ACWD1234)"

Loop

End With
Next

End Sub
4

3 回答 3

0

下面的代码正是您所需要的。我不知道替换文档对象的整个 Contents 属性是否会对制表/格式化等产生一些奇怪的影响。

我宁愿不通过字符串/数组/集合操作增加任何开销。使用 find-replace 可能是最明显的路线,但我不喜欢你需要设置的那么多选项(因为我一个都不理解 =P)

您需要添加对“Microsoft 脚本运行时”的引用

Public Sub changeTokens()
    Dim strContents                     As String
    Dim mapperDic                       As Scripting.Dictionary
    Dim thisTokenKey                    As String
    Dim varKey                          As Variant

    Set mapperDic = getTokenMapper()

    For Each varKey In mapperDic.Keys
        thisTokenKey = CStr(varKey)
        ThisDocument.Content = Replace(ThisDocument.Content, thisTokenKey, mapperDic(thisTokenKey))
    Next varKey
End Sub

Public Function getTokenMapper() As Scripting.Dictionary
    ' This function can fetch data from other sources to buidl up the mapping.
    Dim tempDic                         As Scripting.Dictionary
    Set tempDic = New Scripting.Dictionary


    Call tempDic.Add("Token 1", "Token 1 changed!!")
    Call tempDic.Add("Token 2", "Token 1 changed!!")
    Call tempDic.Add("Token 3", "Token 1 changed!!")

    Set getTokenMapper = tempDic
End Function

您可以毫无问题地从 Excel 工作表中获取数据以创建映射器字典。

于 2013-08-26T01:29:09.413 回答
0

感谢两位答主。我没有完成第二个代码的技能。我最终搜索将 Excel 中的数据读取到 Word 文档中,并找到了完美运行的代码。

在 Word VBA 中使用 Excel 作为数据源 http://social.msdn.microsoft.com/Forums/office/en-US/ca9a31f4-4ab8-4889-8abb-a00af71d7307/using-excel-as-data-source-in- Doug Robbins 制作的word-vba代码。

这绝对是一种享受。这也意味着我可以为不同的语句集及其匹配代码编辑 Excel 文件。现在,如果我能想出一种方法来创建一个在我运行宏时会打开的用户表单并根据所选的用户表单下拉列表项选择适当的 woprksheet,那将是特别好的。

于 2013-08-26T06:05:01.910 回答
0

我认为这是使用替换而不是查找的时候,请参见下面的实现。如果特定代码根据目标字符串发生变化,您可以使用二维数组轻松处理

Sub Codes()

Dim i As Long
Dim TargetList
Dim MyRange As range
TargetList = Array("This is sentence 1", "This is string 2 which could be twenty words in length", "This is string three, there could be thirty more strings to search") ' put list of terms to find here
Dim sStringToAdd As String

sStringToAdd = " (ACWD2553)"

For i = 0 To UBound(TargetList)

Set MyRange = ActiveDocument.Content

MyRange.Find.Execute FindText:=TargetList(i), ReplaceWith:=TargetList(i) & sStringToAdd, _
    Replace:=wdReplaceAll


Next i

End Sub
于 2013-08-25T16:10:26.470 回答