2010-07-21 13 views
5

Je travaille avec des fautes d'orthographe dans Microsoft Word. Avec seulement quelques fautes d'orthographe, l'accès à la collection SpellingErrors devient très lent (au moins avec les boucles For/Next ou For/Each).Misspellings dans Microsoft Word

Existe-t-il un moyen d'obtenir le à la liste (faire une copie, copier les entrées, arrêter la nature dynamique de la collection) rapidement? J'ai juste besoin d'une liste, d'un instantané, et que ça ne soit pas dynamique ou en temps réel.

+0

Pourquoi ne pouvez-vous pas copier le contenu actuel de la collection SpellingErrors dans une autre collection que vous allouez? –

+0

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

+0

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

Répondre

5

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

Merci! Cela s'avère être plus intéressant que je ne le pensais. La vitesse d'accès à SpellingErrors augmente avec plus de mots. Et au-delà du nombre de mots. Les cinq mêmes mots mal orthographiés collés 2000 fois sont accessibles à environ 2 secondes par mot dans la boucle. Dans mon document, il y a 20 à 33 secondes par mot. On dirait que cela ne peut pas être travaillé dans VBA. Cela laisse OpenXML, ce qui me fait penser que nous reparlerons. Merci pour l'information. – ForEachLoop