【问题标题】:Replace string and rest of line with other string用其他字符串替换字符串和其余行
【发布时间】:2017-01-02 20:11:04
【问题描述】:

这就是我想做的:

我有一个字符串 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

为什么我的旧值没有被删除?

提前致谢!

【问题讨论】:

    标签: vba replace ms-word find wildcard


    【解决方案1】:

    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"
    

    例子:

    之前:

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


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

    【讨论】:

    • 工作就像一个魅力!感谢您的努力!
    【解决方案2】:

    这不是真正的 VBA 问题,在“查找和替换”对话框中也发生了同样的情况。

    将原来的字符串替换为:

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

    【讨论】:

    • 谢谢,虽然没有解决。现在的结果是迪亚姆。 diastole, mm: 54,33(它只是删除了原始值中的第一个字符)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多