Ecco come vorrei simulare creare e verificare gli errori di ortografia:
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
Testing questo sul mio lato corre estremamente veloce, sia in Word 2003 e Word 2010. Si noti che questo vi darà sei errori di ortografia, non quattro. Sebbene "barbabietola" e "rito" siano parole in inglese, sono considerate "errate" nel contesto di questa frase.
Avviso Application.Options.CheckSpellingAsYouType = False
. Disattiva il rilevamento automatico degli errori di ortografia (squigglies rossi). È un'impostazione a livello di applicazione - non solo per un singolo documento - quindi la migliore pratica sarebbe quella di riaccenderlo se è ciò che l'utente finale si aspetta in Word come ho fatto alla fine.
Ora, se il rilevamento è in Word 2007/2010 (questo non funziona per il 2003 e precedenti), si può semplicemente leggere le parole errate in XML (WordprocessingML). Questa soluzione è più complicata da configurare e gestire e dovrebbe essere utilizzata solo se non si sta utilizzando VBA per programmare, ma piuttosto Open XML. Una semplice query con Linq-to-XML sarebbe sufficiente per ottenere un IEnumerable di tutte le parole errate. Dovresti scaricare tutto lo .Value
dell'XML tra ogni attributo w:type="spellStart"
e w:type="spellEnd"
dell'elemento <w:proofErr/>
. Il documento prodotto sopra ha questo paragrafo in 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>
fonte
2010-07-23 01:13:32
Perché non è possibile copiare il contenuto corrente della raccolta SpellingErrors in un'altra raccolta allocata? –
Arrestando la raccolta dinamica, non verrà eseguito alcun errore di ortografia a meno che non lo si verifichi specificamente, momento in cui si verificherà il problema dei cicli lenti 'for/next'. Immagino di non capire il problema qui ... –
Questo è esattamente il problema. L'accesso alla struttura per iniziare è proibitivamente lento. Non so perché. Sospetto sia perché è dinamico e cerca sempre nuove parole nel documento. – ForEachLoop