2010-07-21 22 views
5

Ich arbeite mit Rechtschreibfehlern in Microsoft Word. Mit nur ein paar Rechtschreibfehlern wird der Zugriff auf die SpellingErrors-Sammlung langsam gähnend (zumindest mit For/Next oder For/Each-Loops).Fehlbuchungen in Microsoft Word

Gibt es einen Weg, um die Liste (kopieren, kopieren Sie die Einträge, stoppen Sie die dynamische Natur der Sammlung) schnell? Ich brauche nur eine Liste, eine Momentaufnahme davon, und nicht dynamisch oder in Echtzeit.

+0

Warum können Sie den aktuellen Inhalt der SpellingErrors-Auflistung nicht in eine andere von Ihnen zugewiesene Auflistung kopieren? –

+0

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

+0

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

Antwort

5

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

Danke! Das wird interessanter, als ich dachte. Die Geschwindigkeit beim Zugriff auf SpellingErrors erhöht sich mit mehr Wörtern. Und über die Anzahl der Wörter hinaus. Die gleichen fünf falsch geschriebenen Wörter, die 2000 Mal eingefügt wurden, werden mit ungefähr 2 Sekunden pro Wort in der Schleife abgerufen. In meinem Dokument sind es 20 - 33 Sekunden pro Wort. Es sieht so aus, als ob das in VBA nicht möglich ist. Das lässt OpenXML, was mich denken lässt, dass wir uns wieder unterhalten werden. Danke für die Information. – ForEachLoop

Verwandte Themen