2010-07-21 2 views
5

Я работаю с ошибками в Microsoft Word. Имея всего лишь несколько орфографических ошибок, доступ к коллекции SpellingErrors становится медленным (по крайней мере, с параметрами For/Next или For/Each).Ошибки в Microsoft Word

Есть ли способ получить список (скопируйте, скопируйте записи, остановите динамическую природу коллекции) быстро? Мне просто нужен список, легкий снимок, и для него не быть динамичным или реальным.

+0

Почему вы не можете скопировать текущее содержимое коллекции SpellingErrors в другую коллекцию, которую вы выделили? –

+0

Остановив динамическую коллекцию, ничего не будет исправлено, если вы специально не проверите ее, и в это время у вас будет проблема медленных циклов 'for/next'. Думаю, я не понимаю здесь проблему ... –

+0

В этом проблема. Доступ к структуре для начала является чрезмерно медленным. Я не знаю почему. Я подозреваю, что это потому, что он динамичен и всегда ищет в документе новые слова. – ForEachLoop

ответ

5

Вот как я бы имитировать создание и проверка орфографических ошибок:

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 

Тестирование это на моей стороне работает очень быстро, как в Word 2003 и Word 2010. Обратите внимание, что это даст вам шесть орфографических ошибок, не 4. Хотя «свекла» и «обряд» являются словами на английском языке, они считаются «ошибочными» в контексте этого предложения.

Обратите внимание, что Application.Options.CheckSpellingAsYouType = False. Это отключает автоматическое определение орфографической ошибки (красные squigglies). Это настройка на уровне приложения - не только для одного документа - поэтому лучшей практикой было бы включить его, если это то, чего ожидает конечный пользователь в Word, как я это сделал в конце.

Теперь, если обнаружение включено в Word 2007/2010 (это не работает в 2003 году и ранее), вы можете просто прочитать слова с ошибками в XML (WordprocessingML). Это решение сложнее настроить и управлять, и его следует использовать только в том случае, если вы не используете VBA для программирования, а скорее для Open XML. Простого запроса с Linq-to-XML было бы достаточно, чтобы получить IEnumerable всех слов с ошибками. Вы бы сбросили все .Value XML между атрибутами w:type="spellStart" и w:type="spellEnd" элемента <w:proofErr/>. В вышеприведенном документе указан этот пункт в 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

Спасибо! Это оказалось более интересным, чем я думал. Скорость доступа к SpellingErrors увеличивается с увеличением количества слов. И не только количество слов. Те же пять слов с орфографической ошибкой, вставленных в 2000 раз, получают доступ примерно через 2 секунды на каждое слово в цикле. В моем документе это 20 - 33 секунды за слово. Похоже, что в VBA нельзя работать. Это оставляет OpenXML, что заставляет меня думать, что мы поговорим снова. Спасибо за информацию. – ForEachLoop

Смежные вопросы