todas - La colocación de una macro de Word en muchos párrafos de lista causa problemas de memoria
habilitar macros en excel 2016 (3)
Estoy abordando el problema con una macro vba razonablemente sencilla para Microsoft Word que está diseñada para solucionar algunos problemas que estamos viendo con sangría de lista cuando creamos versiones de PDF desde el documento de Word.
La macro básicamente recorre cada lista en el documento, y para cada párrafo de lista asociado con la lista, establece la viñeta y la posición de texto de la plantilla de lista para que coincida con lo que se aplica en el nivel de párrafo (el código debe usarse con Word 2000 para que no usando estilos de lista).
Cuando se trata de documentos grandes (más de 60 listas, ~ 350 párrafos de lista), la macro se ejecuta bien por primera vez, pero la segunda vez muere a mitad de camino con un "Este método o propiedad no está disponible porque hay un problema de memoria o disco" .
He seguido la ruta habitual de desarmar cualquier referencia de objeto utilizada durante el ciclo, por lo que no puedo ver qué podría estar reteniendo la memoria.
El código es bastante simple y consiste en un único procedimiento, actualmente almacenado en ThisDocument:
Option Explicit
Sub test2()
Dim i As Integer, n As Integer
Dim curList As List, curPar As Paragraph, templ As ListTemplate
Dim gapSize As Double, level As Integer
Application.ScreenUpdating = False
Application.Options.Pagination = False
For i = 1 To Lists.Count
Set curList = Lists(i)
For n = 1 To curList.ListParagraphs.Count
Set curPar = curList.ListParagraphs(n)
Set templ = curPar.Range.ListFormat.ListTemplate
level = curPar.Range.ListFormat.ListLevelNumber
gapSize = templ.ListLevels(level).TextPosition - templ.ListLevels(level).NumberPosition
templ.ListLevels(level).NumberPosition = curPar.LeftIndent - gapSize
templ.ListLevels(level).TextPosition = curPar.LeftIndent
templ.ListLevels(level).TabPosition = curPar.TabStops.After(curPar.LeftIndent - gapSize).position
Set templ = Nothing
Set curPar = Nothing
Next n
UndoClear
Set curList = Nothing
Next i
Application.ScreenUpdating = True
Application.Options.Pagination = True
End Sub
Además de UndoClear, también puede guardar el documento en cada ciclo.
Sin embargo, podría tener un gran impacto en su rendimiento macro.
Hay un problema similar aquí http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/de7a88b4-914f-4895-a88a-659b732e8d87/
Espero que esto ayude.
Tu código se ve bien y mis sugerencias serán solo ideas para intentar hacer lo mismo de otra manera ...
Idea 1: inserte un DoEvents en algún lugar en el bucle interno, para facilitar la recolección de basura.
Idea 2: simplifique su código utilizando FOR EACH constructs:
For Each curlist in Lists
For each curPar in curList.ListParagraphs
With curPar.Range.ListFormat.ListTemplate
.....
End With
Next curPar
Next curList
He encontrado una solución desagradable y sucia que soluciona un poco el problema, pero que realmente es una solución muy pobre. Básicamente, una vez que hayamos completado una ejecución completa de la macro, cierre y guarde el documento y vuelva a abrirlo de inmediato. Esto permite que la macro vuelva a ejecutarse inmediatamente o en cualquier etapa porque parece que al cerrar el documento se vaciará la memoria. Obviamente, esto solo se puede usar si el usuario está feliz de guardar como parte de ejecutar la macro, pero en mi caso es