2010-07-21 30 views
5

Sto lavorando con errori di ortografia in Microsoft Word. Con solo pochi errori di ortografia, l'accesso alla raccolta SpellingErrors diventa lento (almeno con For/Next o For/Each loop).Errori di ortografia in Microsoft Word

C'è un modo per ottenere l'elenco (fare una copia, copiare le voci, interrompere la natura dinamica della collezione) rapidamente? Ho solo bisogno di una lista, di un colpo istantaneo, e di non essere dinamico o in tempo reale.

+0

Perché non è possibile copiare il contenuto corrente della raccolta SpellingErrors in un'altra raccolta allocata? –

+0

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 ... –

+0

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

risposta

5

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> 
+0

Grazie! Questo si sta rivelando più interessante di quanto pensassi. La velocità di accesso a SpellingErrors aumenta con più parole. E oltre il solo numero di parole. Le stesse cinque parole errate incollate 2000 volte sono accessibili a circa 2 secondi per parola nel ciclo. Nel mio documento, sono 20 - 33 secondi per parola. Sembra che non possa essere risolto in VBA. Questo lascia OpenXML, il che mi fa pensare che parleremo di nuovo. Grazie per l'informazione. – ForEachLoop

Problemi correlati