Hier ist, wie ich würde simuliert die Erstellung und Überprüfung von Rechtschreibfehlern:
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 dies auf meiner Seite sehr schnell läuft, sowohl in Word 2003 und Word 2010. Beachten Sie, dass diese Ihnen sechs Rechtschreibfehler geben, nicht vier. Obwohl "Rüben" und "Ritus" Wörter auf Englisch sind, gelten sie im Kontext dieses Satzes als "falsch geschrieben".
Beachten Sie die Application.Options.CheckSpellingAsYouType = False
. Dies deaktiviert die automatische Rechtschreibfehlererkennung (rote Squigglies). Es ist eine anwendungsweite Einstellung - nicht nur für ein einzelnes Dokument -, also wäre es am besten, sie wieder einzuschalten, wenn der Endbenutzer dies in Word erwartet, wie ich es am Ende getan habe.
Jetzt, wenn die Erkennung in Word 2007/2010 aktiviert ist (dies funktioniert nicht für 2003 und früher), können Sie einfach die falsch geschriebenen Wörter im XML (WordprocessingML) lesen. Diese Lösung ist komplizierter einzurichten und zu verwalten und sollte eigentlich nur verwendet werden, wenn Sie nicht VBA zum Programmieren verwenden, sondern Open XML. Eine einfache Abfrage mit Linq-to-XML würde ausreichen, um eine IEnumerable aller falsch geschriebenen Wörter zu erhalten. Sie würden alle .Value
des XML zwischen jedem w:type="spellStart"
und w:type="spellEnd"
Attribute des Elements <w:proofErr/>
Dump. Das oben erstellte Dokument enthält diesen Absatz 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>
Warum können Sie den aktuellen Inhalt der SpellingErrors-Auflistung nicht in eine andere von Ihnen zugewiesene Auflistung kopieren? –
Wenn Sie die dynamische Sammlung stoppen, wird nichts mehr falsch geschrieben, es sei denn, Sie suchen gezielt nach. Zu diesem Zeitpunkt haben Sie das Problem mit langsamen 'for/next'-Schleifen. Ich denke, ich verstehe das Problem hier nicht ... –
Das ist genau das Problem. Der Zugriff auf die Struktur zu Beginn ist prohibitiv langsam. Ich weiß nicht warum. Ich vermute, es liegt daran, dass es dynamisch ist und immer nach neuen Wörtern im Dokument sucht. – ForEachLoop