Voilà comment je simuler la création et la vérification des erreurs d'orthographe:
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
Test sur mon côté fonctionne de manière extrêmement rapide, à la fois dans Word 2003 et Word 2010. Notez que cela vous donnera six fautes d'orthographe, non quatre. Bien que "betterave" et "rite" soient des mots en anglais, ils sont considérés comme "mal orthographiés" dans le contexte de cette phrase.
Notez le Application.Options.CheckSpellingAsYouType = False
. Ceci désactive la détection automatique des erreurs d'orthographe (squigglies rouges). C'est un paramètre à l'échelle de l'application - pas seulement pour un seul document - donc la meilleure pratique serait de le réactiver si c'est ce que l'utilisateur final attend dans Word comme je l'ai fait à la fin.
Maintenant, si la détection est activée dans Word 2007/2010 (cela ne fonctionne pas pour 2003 et avant), vous pouvez simplement lire les mots mal orthographiés dans le fichier XML (WordprocessingML). Cette solution est plus compliquée à mettre en place et à gérer, et ne devrait vraiment être utilisée que si vous n'utilisez pas VBA pour programmer mais plutôt Open XML. Une requête simple avec Linq-to-XML suffirait pour obtenir un IEnumerable de tous les mots mal orthographiés. Vous devez vider tous les .Value
du code XML entre chaque w:type="spellStart"
et les attributs de l'élément <w:proofErr/>
. Le document produit ci-dessus a ce paragraphe dans 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>
Pourquoi ne pouvez-vous pas copier le contenu actuel de la collection SpellingErrors dans une autre collection que vous allouez? –
En arrêtant la collection dynamique, rien ne sera mal orthographié à moins que vous ne vérifiiez spécifiquement, à ce moment vous aurez le problème des boucles 'for/next' lentes. Je suppose que je ne comprends pas le problème ici ... –
C'est exactement le problème. Accéder à la structure pour commencer est extrêmement lent. Je ne sais pas pourquoi. Je suppose que c'est parce que c'est dynamique et cherche toujours dans le document de nouveaux mots. – ForEachLoop