Vba 识别无效字符

Vba 识别无效字符,vba,ms-word,Vba,Ms Word,我需要遍历word文档的每个字母,并将每个字母与有效字符列表进行比较。如果当前字符不在列表中,则应更改其字体颜色 我是VBA的新手,已经编写了一个小循环代码,但即使是一个小word文件也需要很长时间。代码如下- Sub LoopThruFile() Dim doc As Document Dim CurrChar As String Application.ScreenUpdating = False Set doc = ActiveDocument For i = 1 To doc.Ra

我需要遍历word文档的每个字母,并将每个字母与有效字符列表进行比较。如果当前字符不在列表中,则应更改其字体颜色

我是VBA的新手,已经编写了一个小循环代码,但即使是一个小word文件也需要很长时间。代码如下-

Sub LoopThruFile()
Dim doc As Document
Dim CurrChar As String

Application.ScreenUpdating = False

Set doc = ActiveDocument

For i = 1 To doc.Range.Characters.Count
    CurrChar = doc.Range.Characters(i)
    If InStr("01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-_()/@:&\%", CurrChar) = 0 Then
        doc.Range.Characters(i).Font.ColorIndex = wdRed
    End If
Next

Application.ScreenUpdating = True
End Sub

是否有更好更快的代码来执行此操作?

循环单个字符的速度很慢。在您的示例中,可以提高性能的一件事是减少直接针对范围的层次结构级别的数量:

Dim doc as Document
Dim docRange as Range
Dim CurrChar as String

Set doc = ActiveDocument
Set docRange = doc.Content
注意Document.Range实际上是一个需要两个参数的方法;Content会自动将整个范围作为属性返回,因此更为正确

然后,角色对象实际上是一个范围对象。VBA必须将代码行转换为包含Text属性,以便将CurrChar分配给字符串。可能没有多大区别,但更正确,可能更快:

CurrChar = docRange.Characters(i).Text
有时,如果从文档末尾运行到开头,循环会更快:

For i = docRange.Characters.Count to 1 Step -1
  CurrChar = docRange.Characters(i).Text
  If InStr("01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-_()/@:&\%", CurrChar) = 0 Then
    docRange.Characters(i).Font.ColorIndex = wdRed
  End If
Next
您还可以尝试使用For Each,这可能是本场景中最快的,因为您保存了对doc.Range.Charactersi的多个调用,每个调用都会消耗资源

Dim CurrChar as Range

For Each CurrChar in docRange.Characters
  If InStr("01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-_()/@:&\%", CurrChar.Text) = 0 Then
    CurrChar.Font.ColorIndex = wdRed
  End If
Next

以下几点对我有用。试试这个:

With ActiveDocument.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .text = "[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9\,\.\-_\(\)\/\\\@\:\&\%]"
    .Replacement.text = ""
    .Replacement.Font.Color = wdColorRed
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
End With

嗨,辛迪。解释得很好。速度非常快。但是,需要在有效列表中再添加几个字符-尤其是双引号。这是怎么写的?是\还是别的什么。此外,对于所有三种解决方案,单词列表编号不被视为数字,并且被选为无效。与项目符号相同,例如-。我如何才能将它们声明为有效字符。@dhatul好吧,既然我使用了您的代码,这些问题肯定已经存在,因此不是原始问题的一部分。按理说,你应该为此提出一个新问题。对于引号,请在您的字符串末尾使用:&Chr34,后面是Hi,这是最好的,它会飞起来。谢谢然而,令人惊讶的是,它并没有选择一些其他语言字母作为无效字母,尽管其他脚本确实如此。原因可能是什么。有效的字符串是相同的,只是您在\前面加了符号。您能告诉我们哪些字符漏掉了,应该被捕获吗?这些是一些字符。这些都是印地语的德夫纳加里文字वा लो कु मा गहा बंअँ सी भाजीटीसी बेलापुवी मुं मोबा是的,我可以复制这个。我不明白,但我可以复制它。Unicode范围也不起作用。使用Cindy的解决方案或准备Word之外的解决方案。