2010-07-21 34 views
5

我正在使用Microsoft Word中的拼写错误。只有少数拼写错误,访问SpellingErrors集合变得很慢(至少在For/Next或For/Each循环中)。Microsoft Word中的拼写错误

是否有办法快速获得列表(复制,复制条目,停止动态性质)?我只需要一个列表,一个快照,并且它不是动态的或实时的。

+0

为什么不能将SpellingErrors集合的当前内容复制到您分配的另一个集合中? – 2010-07-22 17:55:05

+0

通过停止动态收集,除非您专门检查它,否则什么都不会拼写错误,此时您将遇到缓慢的for/next循环问题。我想我不了解这个问题... – 2010-07-22 22:13:59

+0

这就是问题所在。首先访问结构的速度非常慢。我不知道为什么。我怀疑这是因为它是动态的,并且始终在文档中寻找新单词。 – ForEachLoop 2010-07-22 22:15:25

回答

5

这是我怎么会模拟创建和检查拼写错误:

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到XML的简单查询将足以获得所有拼写错误的单词的IEnumerable。您可以转储<w:proofErr/>元素的每个w:type="spellStart"w:type="spellEnd"属性之间的XML的所有.Value。上面生成的文档在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> 
+0

谢谢!这比我想象的更有趣。访问SpellingErrors的速度确实会随着更多词语的增加而增加。超越了单词的数量。循环中每个单词约2秒钟可粘贴2000次粘贴的五个拼写错误的单词。在我的文档中,每个单词有20-33秒。看起来,这在VBA中无法解决。这留下了OpenXML,这让我觉得我们会再次谈论。感谢您的信息。 – ForEachLoop 2010-07-23 15:36:19

相关问题