2010-07-21 13 views
5

Estoy trabajando con errores ortográficos en Microsoft Word. Con solo unos pocos errores ortográficos, el acceso a la colección SpellingErrors se vuelve completamente lento (al menos con For/Next o For/Each loops).Errores ortográficos en Microsoft Word

¿Hay alguna manera de acceder a la lista (hacer una copia, copiar las entradas, detener la naturaleza dinámica de la colección) rápidamente? Solo necesito una lista, una instantánea de ella, y para que no sea dinámica o en tiempo real.

+0

Por qué no puedes copiar el contenido actual de la colección SpellingErrors en otra colección que se puede asignar? –

+0

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

+0

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

Respuesta

5

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

¡Gracias! Esto está resultando ser más interesante de lo que pensaba. La velocidad de acceso a SpellingErrors aumenta con más palabras. Y más allá del número de palabras. Las mismas cinco palabras mal escritas pegadas 2000 veces se acceden a aproximadamente 2 segundos por palabra en el ciclo. En mi documento, son 20 - 33 segundos por palabra. Parece que eso no se puede solucionar en VBA. Eso deja a OpenXML, lo que me hace pensar que hablaremos de nuevo. Gracias por la información. – ForEachLoop

Cuestiones relacionadas