在Word

时间:2019-09-23 08:46:06

标签: vba ms-word

我想通过删除注释中员工的签名来快速取消标识文件的身份(是的,我已经有一个删除标识信息的方法,而不仅仅是文本本身)。可以搜索所有员工姓名并替换为“”的宏非常有用。我敢肯定有一个简单的方法可以做到这一点。

我尝试过的所有方法都失败了,要么找不到注释中的文本,要么在我复制/粘贴用于“查找/替换”一个名称的记录代码并针对其他20-30个名称进行调整后无法正常工作。我尝试了四种可能适用于正文的不同查找/替换代码,但没有一种适用于注释。

Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "Employee Name 1"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "Employee Name 2"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

在所有20到30名员工之间复制/粘贴此操作会失败(没有错误,只是不能替换)。我敢肯定,无论如何,还有一种更优雅的方法,但是我对代码肯定不太熟悉。

1 个答案:

答案 0 :(得分:0)

问题的措词尚不清楚100%是否还需要用于删除注释作者和姓名缩写的代码,还是仅在注释中引用员工姓名的文本。因此,下面的代码可同时实现这两个功能。

首先,声明一个数组并用应删除的员工姓名填充。这样可以更轻松地管理列表并缩短代码量(无需为每个员工复制/粘贴)。

然后,循环注释集合并执行两个测试。

  • 注释 text 是否包含任何员工的姓名。为了确定这一点,循环使用员工姓名数组,并使用Instr检查姓名的存在。如果存在名称,则在Comment.Range上运行查找/替换。 (注意:此代码仅包含准系统Find属性,如果需要更多属性,则可能需要添加一些内容。)
  • 删除AuthorInitial信息。在这里,作者姓名列表是Case测试的一部分。如果注释中包含其中之一,则AuthorInitial信息将设置为空字符串。

请注意,该评论的Range不会包括评论的作者或姓名缩写信息,仅包括评论的内容(您可能知道,但其他阅读此内容的人可能没有)。 / p>

Sub RemoveAuthorFromAllComments() ' TestLoopCommentWords()
    Dim C As Word.Comment, rng As Word.Range
    Dim employees() As Variant, e As Variant

    employees = Array("Cindy Meister", "John Doe", "Mary Jane")

    For Each C In ActiveDocument.Comments
        Set rng = C.Range
        For Each e In employees
            If InStr(rng, e) <> 0 Then
                With rng.Find
                    .Text = e
                    .Replacement.Text = ""
                    .Execute Replace:=wdReplaceAll
                End With
            End If
        Next
        Select Case C.Author
            Case "Cindy Meister", "John Doe", "Mary Jane"
                C.Author = ""
                C.Initial = ""
            Case Else
                Debug.Print C.Author
        End Select
    Next
End Sub