【问题标题】:word vba conditional find and replaceword vba 条件查找和替换
【发布时间】:2018-01-10 01:41:20
【问题描述】:

如果下一个单词是“----”,我正在尝试让 MSWord 的 vba 替换一个单词:“an”与“a(n)”。我设法写了这个,但它似乎不起作用。任何想法为什么? (我也需要对具有相同条件的单词“a”做同样的事情,但还不能完成第一个,所以..) 对了,我没有设定范围,我需要扫描所有文档..

Sub Makro1()
With Selection
  Set Rng = .Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "an"
    .Forward = True
    .Wrap = wdFindStop
    .MatchCase = False
    .MatchWholeWord = True
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
  End With
  Do While .Find.Found
    If Selection.Next(Unit:=wdWord, Count:=1) = "---- " Then
    .Find.Replacement.Text = "a(n)"
    End If
    .Find.Execute
  Loop

End With

End Sub

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    你不需要宏;这一切都可以通过通配符查找/替换来完成,其中:

    查找 = [an]{1,2}( [_]{1,})

    替换 = a(n)\1

    当然,也可以使用通配符查找/替换宏:

    Sub Demo()
    With ActiveDocument.Range.Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "[an]{1,2}( [_]{1,})"
      .Replacement.Text = "a(n)\1"
      .Forward = True
      .Wrap = wdFindContinue
      .Format = False
      .MatchWildcards = True
      .Execute Replace:=wdReplaceAll
    End With
    End Sub
    

    【讨论】:

      【解决方案2】:

      请尝试以下代码。它采用稍微不同的方法,因为它查找“----”而不是“a”或“an”。

      Sub ConditionalReplace()
          ' 10 Jan 2018
      
          Dim Pos As Long
          Dim n As Integer
      
          With Selection
              .HomeKey Unit:=wdStory
              .Find.Text = "---- "
      
              Do While .Find.Execute = True
                  Pos = .Start + 1
                  .Collapse wdCollapseStart
                  .MoveStart wdWord, -1
                  If (StrComp(Trim(.Text), "a", vbTextCompare) = 0) Or _
                     (StrComp(Trim(.Text), "an", vbTextCompare) = 0) Then
                     .Delete
                     n = n + 1
                  End If
                  .SetRange Pos, ActiveDocument.Characters.Count
              Loop
              .HomeKey Unit:=wdStory
          End With
          MsgBox n & " replacements were made."
      End Sub
      

      为了寻找另一个标记,例如一个由12个下划线组成的字符串,修改.Find.Text = "---- "这一行变成

      .Find.Text = "____________"
      

      如果您不能确定有多少下划线,可以考虑下面的代码 sn-p,它会发现出现六个下划线后跟任何其他文本,包括但不限于另外 6 或 4 个下划线。

      .Find.MatchWildcards = True
      .Find.Text = "______*"
      

      【讨论】:

      • 我只是注意到我忘了说替换会是什么。我编辑了这个问题。我会尝试定制你的答案。如果我不能,我会写评论。谢谢。
      • 嘿,谢谢!我管理了这部分,但我不能让它以相同的目的寻找“____________”(总共 12 个下划线):将“a ____________”替换为“a(n) ____________”。有什么想法吗?
      • 我已经修改了上面的答案,以包括搜索下划线的解决方案。
      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 2014-10-12
      • 2018-01-18
      • 2014-04-06
      • 1970-01-01
      • 2018-03-24
      • 2020-04-03
      • 2012-11-13
      相关资源
      最近更新 更多