用其他字符串

时间:2016-08-26 08:11:54

标签: vba replace ms-word find wildcard

所以这就是我想要做的事情:

我有一个字符串origStr,它位于Word文档中一行的开头。在origStr之后是未知值(例如23或2,6)

我想找到该字符串并将该值替换为另一个已知值,但保留字符串。

我的Word文档中的示例:

Diam. diastole, mm: 53

[运行用户输入为54,3的VBA makro]

预期结果:

Diam. diastole, mm: 54,3

实际结果:

Diam. diastole, mm: 54,3 53

所以这就是我得到的:

origStr = LArray(i, j - 1).Caption & ": *"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text

With ActiveDocument.Content.Find
    .MatchWildcards = True
    .ClearFormatting
    .Text = origStr
    .Replacement.ClearFormatting
    .Replacement.Text = replStr
    .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindStop
End With

为什么我的旧值不被删除?

提前致谢!

2 个答案:

答案 0 :(得分:2)

Word使用“懒惰”模式匹配,在这种情况下很好,因为否则它只会替换整个文档的其余部分。 Vincent G给出了一个单词的解决方案(在该行的其余部分不超过一个空格),这里有一些更通用的内容:

要让Word替换所有内容直到行尾,您需要将行尾包含在搜索字符串中。 ^l^11new line的控制代码(shift + enter),^12page or section break^13carriage returnThis是我找到的最“最近”的列表。

所以"yourtext*^11"会匹配从"yourtext"到下一个new line的所有内容,依此类推。

根据您的格式,它可能是上述之一,因此您必须小心。如果您替换"*^12",但您的行以new line结尾,则您将替换整个段落。

要抓住所有这些内容,您可以对其进行分组:yourtext*[^11^12^13]将匹配所有内容,直到下一个new linecarriage return。但是,如果我们替换它,那么该行的末尾也将被替换,因此我们必须将其包含在替换文本中。我们怎么知道它是什么?

我们可以使用()来定义子匹配,并使用\1\2等在替换文本中使用这些子匹配:

origStr = LArray(i, j - 1).Caption & ": *([^11^12^13])"
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text & "\1"

示例:

之前:
 before

origStr = "yourtext*([^11^12^13])"replStr = "yourtext newtext\1"替换后

after

注意:这些表达式也适用于“查找和替换”对话框,只需确保启用“使用通配符”

答案 1 :(得分:0)

它不是真正的VBA问题,同样发生在"查找和替换"对话框。

将原始字符串替换为:

origStr = LArray(i, j - 1).Caption & ": <*>"