【问题标题】:How to fix slowness when getting the spelling errors in Word VBA?在 Word VBA 中出现拼写错误时如何解决缓慢问题?
【发布时间】:2020-01-04 14:49:44
【问题描述】:

我正在尝试使用here 中的以下代码在其他文档中列出活动文档的拼写错误。我的实际文件大约 7MB 和 1400 页,拼写错误数约为 2400。

我看到的是每次 For Each 循环运行下一项时代码都会卡住。

有没有办法提高这段代码的性能?谢谢

Sub GetSpellingErrors()
    Dim DocThis As Document
    Dim iErrorCnt As Integer
    Dim J As Integer

    Set DocThis = ActiveDocument
    Documents.Add

    iErrorCnt = DocThis.SpellingErrors.Count
    For J = 1 To iErrorCnt
        Selection.TypeText Text:=DocThis.SpellingErrors(J)
        Selection.TypeParagraph
    Next J
End Sub

我昨天已经在微软答案论坛上问过了,但没有得到任何答案。

【问题讨论】:

  • 这可能更适合Code Review,但我猜你可以在数组或集合中建立列表。
  • 看看这个docs.microsoft.com/en-us/office/vba/api/…,你可以尝试基于ProofreadingError对象的for each循环
  • @BigBen 感谢您的回答。实际上,我尝试将拼写错误集合的内容存储在一个数组中,但是是相同的。它停留了几分钟,在大约 10 分钟内只打印了 20 个拼写错误
  • @Nathan_Sav 感谢您的回答。我认为我帖子中的代码正在执行您的建议。如果不是,您的建议如何?
  • 我认为这种方法在处理大型文档时速度非常慢。在我的快速谷歌搜索中没有明显的解决方法。

标签: vba ms-word


【解决方案1】:

对于大型文档,通过SpellingErrors 集合所需的时间似乎有很大(超出比例)增加,因此如果您一个接一个地检查较小的块,您可能会看到更好的性能 - 例如将依次检查每个段落与一次检查整个文档进行比较:

Sub GetSpellingErrors()
    Dim DocThis As Document
    Dim i As Long, n As Long, nT As Long
    Dim t, errs As ProofreadingErrors
    Dim p As Paragraph, w

    Set DocThis = ActiveDocument

    'accessing errors for the whole document
    t = Timer
    Set errs = DocThis.Range.SpellingErrors
    n = errs.Count
    For i = 1 To n
        w = errs(i)
    Next i
    Debug.Print "Full doc", Timer - t & "sec", n & " Errors" '~250 sec

    'accessing errors by paragraph
    t = Timer
    For Each p In DocThis.Range.Paragraphs
        Set errs = p.Range.SpellingErrors
        n = errs.Count
        nT = nT + n 'sum the erors
        For i = 1 To n
            w = errs(i) 'just accessing the item...
        Next i
    Next p
    Debug.Print "By Paragraph", Timer - t & "sec", nT & " Errors" '~11 sec

End Sub

结果(页数与处理时间):

【讨论】:

  • 嗨蒂姆。真棒你的答案。我测试了您的原始代码,仅按段落执行错误需要 52 秒,整个文档执行超过 10 分钟,我需要停止它。然后我按段落将错误打印到文本文件中,耗时 5.5 分钟(报告了 337 秒和 2451 个错误)。如果我可以对这个答案给予更多的支持,我会这样做。非常感谢。
  • 这是一个很好的答案。谢谢。但就微软而言,这似乎没有充分的理由花费这么长时间。
【解决方案2】:

将每个拼写错误反复写入输出文档势必会减慢速度。试试:

Sub GetSpellingErrors()
    Dim DocSrc As Document, DocTgt As Document
    Dim SpellErr, StrOut As String
    Set DocSrc = ActiveDocument
    For Each SpellErr In DocSrc.SpellingErrors
        StrOut = StrOut & SpellErr & vbCr
    Next
    Set DocTgt = Documents.Add
    DocTgt.Range.Text = StrOut
End Sub 

【讨论】:

  • 感谢您的帮助。我测试过,问题不在于将错误写入另一个文件,当尝试读取 For each 循环中的每个新拼写错误时,代码会卡住。我试过你的代码,我需要在 7 分钟后停止它。似乎唯一有帮助的是蒂姆所做的那样,按段落而不是整个文档进行搜索
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多