una todas seguridad que puede macro mac libro las hayan han habilitar habilita este eliminar disponible deshabilitado debido configuracion como list vba for-loop ms-word

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



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