我正在使用Microsoft Word中的拼写错误。只需几个拼写错误,访问SpellingErrors集合就变得缓慢(至少对于For/Next或For/Each循环而言)。
有没有办法快速进入列表(制作副本,复制条目,停止集合的动态性质)?我只需要一个列表,它的快照,并且它不是动态的或实时的。
最佳答案
这是我模拟创建和检查拼写错误的方法:
Sub GetSpellingErrors()
''# Turn off auto-spellchecking
Application.Options.CheckSpellingAsYouType = False
''# Set document
Dim d As Document
Set d = ActiveDocument
''# Insert misspelled text
d.Range.Text = "I wantedd to beet hym uup to rite some rongs."
''# Get spelling errors
Dim spellErrs As ProofreadingErrors
Set spellErrs = d.SpellingErrors
''# Dump spelling errors to Immediate window
For spellErr = 1 To spellErrs.Count
Debug.Print spellErrs(spellErr).Text
Next
''# Turn back auto-spellchecking
Application.Options.CheckSpellingAsYouType = True
End Sub
在Word 2003和Word 2010中,在我这方面进行测试的速度都非常快。请注意,这将给您六个拼写错误,而不是四个。尽管“甜菜”和“仪式”是英语单词,但在此句子的上下文中被视为“拼写错误”。
注意
Application.Options.CheckSpellingAsYouType = False
。这将关闭自动拼写错误检测(红色曲线)。这是一个应用程序范围的设置-不仅仅针对单个文档-因此,最佳实践是将其重新打开,前提是最终用户在Word中希望这样做,就像我最后所做的那样。现在,如果在Word 2007/2010中启用了检测功能(在2003及更早版本中则不起作用),则只需读取XML(WordprocessingML)中拼写错误的单词即可。该解决方案的设置和管理更加复杂,并且仅在不使用VBA进行编程而是使用Open XML的情况下才应使用。使用Linq-to-XML进行简单查询就足以获得所有拼写错误的单词的IEnumerable。您将在
.Value
元素的每个w:type="spellStart"
和w:type="spellEnd"
属性之间转储XML的所有<w:proofErr/>
。上面生成的文档在WordprocessingML中具有以下段落:<w:p w:rsidR="00A357E4" w:rsidRDefault="0008442E">
<w:r>
<w:t xml:space="preserve">I </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r>
<w:t>wa</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
<w:r>
<w:t>ntedd</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r>
<w:t xml:space="preserve"> to </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="003F2F98">
<w:t>b</w:t>
</w:r>
<w:r w:rsidR="005D3127">
<w:t>eet</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="005D3127">
<w:t xml:space="preserve"> </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="005D3127">
<w:t>hym</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="005D3127">
<w:t xml:space="preserve"> </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="005D3127">
<w:t>uup</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="005D3127">
<w:t xml:space="preserve"> to </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="005D3127">
<w:t>rite</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="005D3127">
<w:t xml:space="preserve"> some </w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="005D3127">
<w:t>rongs</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="005D3127">
<w:t xml:space="preserve">. </w:t>
</w:r>
</w:p>
关于vba - Microsoft Word中的拼写错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3301187/