单词VBA查找被动语态

单词VBA查找被动语态,vba,ms-word,find,Vba,Ms Word,Find,我写了一个查找被动结构的程序,例如“was solved”、“been writed”,即以“ed”或“en”结尾的被动结构,但不是像“was exportive”这样的东西。将为每个查找插入注释。 我就快到了-但无法修复几个异常: 它适用于“was solved.”、“was solved.”“was solved.”和“was solved.”(其中两个空格中的NB)但不适用于“was solved today”,即在最后一个动词后面有更多单词的地方。最后一个错误是我希望修复的错误。 它还发

我写了一个查找被动结构的程序,例如“was solved”、“been writed”,即以“ed”或“en”结尾的被动结构,但不是像“was exportive”这样的东西。将为每个查找插入注释。 我就快到了-但无法修复几个异常: 它适用于“was solved.”、“was solved.”“was solved.”和“was solved.”(其中两个空格中的NB)但不适用于“was solved today”,即在最后一个动词后面有更多单词的地方。最后一个错误是我希望修复的错误。 它还发现了“正在完成”中的被动词,即两个助动词一起,无论空格是否跟在最后一个动词后面。这是一个额外的奖励,除了发现会显示两次之外。 我怀疑这与我的is_Alpha函数有关,它去掉了主动词末尾的标点符号。 谢谢各位,谢谢你们的帮助

Sub Passives3()
Dim P_Flag As Boolean
Dim P_Cmt As Comment
Dim P_Rng As Range
Dim P_Rng2 As String
Dim P_New As String
Dim P_Fnd As Boolean
Dim Cmt As Comment
Dim P_Range As Range
Dim P_Ctr As Long
Dim Com_plete As Integer
Dim P_Word(7) As String
    P_Word(0) = "am "
    P_Word(1) = "are "
    P_Word(2) = "be "
    P_Word(3) = "been "
    P_Word(4) = "being "
    P_Word(5) = "is "
    P_Word(6) = "was "
    P_Word(7) = "were "
For P_Ctr = LBound(P_Word) To UBound(P_Word)
Set P_Rng = ActiveDocument.Range
    With P_Rng.Find
        .ClearFormatting
        .text = P_Word(P_Ctr)
        Debug.Print .text
        .MatchCase = False
        .MatchWholeWord = True
        While .Execute
            If P_Rng.Find.Found Then
                Dim P_test As Range
                Set P_test = P_Rng.Duplicate
                With P_test
                   .MoveEnd wdWord, 2
                   .Select
                    P_New = P_test
                    Call Is_Alpha(P_New, P_Flag)
                    If P_Flag = False Then
                        P_New = Left(P_New, Len(P_New) - 1)
                    End If
                End With
                If (Right(Trim(P_New), 2)) = "ed" _
                Or (Right(Trim(P_New), 2)) = "en" Then
                    Set P_Cmt = P_Rng.Comments.Add(Range:=P_Rng, text:="Passive? " & P_New)
                    P_Cmt.Author = "Passives"
                    P_Cmt.Initial = "PSV "
                    P_Cmt.Range.Font.ColorIndex = wdGreen
                End If
            End If
        Wend
    End With
Next
End Sub

Function Is_Alpha(P_New As String, P_Flag As Boolean) As Boolean
If Asc(Right(P_New, 1)) > 64 And Asc(Right(P_New, 1)) < 90 Or _
       Asc(Right(P_New, 1)) > 96 And Asc(Right(P_New, 1)) < 123 Then
       P_Flag = True
       Else
       P_Flag = False
End If
End Function
    




    
Sub-被动式3()
Dim P_标志为布尔值
Dim P_Cmt作为评论
变暗P_Rng As范围
尺寸P_Rng2为字符串
将P_调暗为新字符串
作为布尔值的Dim P_Fnd
Dim Cmt作为评论
变暗P_范围作为范围
变暗P_中心,如长
作为整数的Dim complete
将P_字(7)变暗为字符串
P_字(0)=“am”
单词(1)=“是”
单词(2)=“be”
P_单词(3)=“已经”
P_单词(4)=“存在”
P_单词(5)=“是”
P_单词(6)=“是”
P_单词(7)=“是”
对于P_Ctr=LBound(P_字)到UBound(P_字)
设置P_Rng=ActiveDocument.Range
用P_Rng.Find
.ClearFormatting
.text=P_字(P_中心)
调试.打印.文本
.MatchCase=False
.MatchWholeWord=True
执行
如果P_Rng.Find.Find那么
Dim P_测试作为范围
设置P_test=P_Rng.Duplicate
用P_检验
.MoveEnd wdWord,2
.选择
P_新=P_测试
调用为_Alpha(P_New,P_标志)
如果P_Flag=False,则
P_New=左(P_New,Len(P_New)-1)
如果结束
以
如果(右侧(修剪(P_New),2))=“ed”_
或(右(修剪(P_New),2))=“en”然后
设置P_Cmt=P_Rng.Comments.Add(范围:=P_Rng,文本:=“被动?”&P_New)
P_Cmt.Author=“被动”
P_Cmt.Initial=“PSV”
P_Cmt.Range.Font.ColorIndex=wdGreen
如果结束
如果结束
温德
以
下一个
端接头
函数是布尔函数(P_新为字符串,P_标志为布尔值)
如果Asc(右(P_New,1))>64且Asc(右(P_New,1))<90或_
Asc(右(P_New,1))>96,Asc(右(P_New,1))<123
P_标志=真
其他的
P_标志=False
如果结束
端函数
那么:

Sub Passives()
Dim i As Long, j As Long, Cmt As Comment, P_Words, X_Words
P_Words = Array("am ", "are ", "be ", "been ", "being ", "is ", "was ", "were ")
X_Words = Array("am ", "are ", "being ", "is ", "was ", "were ", "has ", "have ")
For i = LBound(P_Words) To UBound(P_Words)
  With ActiveDocument.Range
    With .Find
      .ClearFormatting
      .Text = "<" & P_Words(i) & "[! ]@e[dn]>"
      .MatchWildcards = True
    End With
    Do While .Find.Execute
      For j = LBound(X_Words) To UBound(X_Words)
        If .Words.First.Previous.Words.First.Text = X_Words(j) Then
          .Start = .Words.First.Previous.Words.First.Start
        End If
      Next
      Set Cmt = .Comments.Add(Range:=.Duplicate, Text:="Passive?")
      With Cmt
        .Author = "Passives"
        .Initial = "PSV "
        .Range.Font.ColorIndex = wdGreen
      End With
      .Collapse wdCollapseEnd
    Loop
  End With
Next
End Sub
Sub-Passives()
Dim i为Long,j为Long,Cmt为Comment,P_单词,X_单词
P_Words=数组(“am”、“are”、“be”、“been”、“being”、“is”、“was”、“were”)
X_Words=数组(“am”、“are”、“being”、“is”、“was”、“was”、“was”、“has”、“have”)
对于i=LBound(P_单词)到UBound(P_单词)
使用ActiveDocument.Range
和…一起找
.ClearFormatting
.Text=“”
.MatchWildcards=True
以
执行While.Find.Execute
对于j=LBound(X_单词)到UBound(X_单词)
如果.Words.First.Previous.Words.First.Text=X_单词(j),则
.Start=.Words.First.Previous.Words.First.Start
如果结束
下一个
设置Cmt=.Comments.Add(范围:=.replicate,文本:=“被动?”)
使用Cmt
.Author=“被动”
.Initial=“PSV”
.Range.Font.ColorIndex=wdGreen
以
.倒塌
环
以
下一个
端接头

请提供完整的信息,包括输入/输出数据以及您需要的输出。您也可以考虑使用正则表达式。我也将使用正则表达式——参见。尽管这个问题谈论了很多关于Excel的内容,但几乎所有内容都同样适用于使用Word中的VBScript正则表达式库。非常感谢,非常感谢。但是您能解释一下.text通配符行是如何工作的吗?<表示单词的开头,>表示单词的结尾。[!]@指定空格以外的任何字符系列。[dn]指定d或n。因此,P_单词(i)必须出现在单词的开头,下一个单词必须以ed或en结尾。有关更多信息,请参阅: