Así es como me gustaría simular la creación y comprobación de errores de ortografía:
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
Prueba esta de mi lado se ejecuta muy rápido, tanto en Word 2003 y Word 2010. Tenga en cuenta que esto le dará seis errores de ortografía, no las cuatro. Aunque "remolacha" y "rito" son palabras en inglés, se consideran "mal escritas" en el contexto de esta oración.
Observe Application.Options.CheckSpellingAsYouType = False
. Esto desactiva la detección automática de errores ortográficos (squigglies rojos). Es una configuración para toda la aplicación, no solo para un solo documento, por lo que la mejor práctica sería volver a activarla si eso es lo que espera el usuario final en Word, como lo he hecho al final.
Ahora, si la detección está activada en Word 2007/2010 (esto no funciona en 2003 y antes), simplemente puede leer las palabras mal escritas en el XML (WordprocessingML). Esta solución es más complicada de configurar y administrar, y solo debería utilizarse si no está utilizando VBA para programar, sino más bien Open XML. Una simple consulta con Linq-to-XML sería suficiente para obtener un IEnumerable de todas las palabras mal escritas. Debería volcar todos los .Value
del XML entre los atributos w:type="spellStart"
y w:type="spellEnd"
del elemento <w:proofErr/>
. El documento elaborado por encima de este párrafo tiene en 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>
Por qué no puedes copiar el contenido actual de la colección SpellingErrors en otra colección que se puede asignar? –
Al detener la recopilación dinámica, nada se escribirá mal a menos que lo compruebe específicamente, momento en el que tendrá problemas con los bucles "para/siguiente" lentos. Supongo que no estoy entendiendo el problema aquí ... –
Ese es exactamente el problema. El acceso a la estructura para comenzar es prohibitivamente lento. No sé por qué. Sospecho que es porque es dinámico y siempre busca nuevas palabras en el documento. – ForEachLoop