EXCEL VBA - несколько листов замедляют программу VBA - оптимизируют память - PullRequest
0 голосов
/ 24 октября 2019

У меня есть файл Excel и 7 листов. В 5 из них есть много предварительно заполненных формул, а в одной из них много текстовых данных (75000 строк).

И на 7-м и последнем листе есть некоторые данные, извлеченные из 6-го листа (примерно 6-7). % от этого). Для 7-го листа я создал макрос VBA, который будет выполнять некоторую обработку текста. Если я удаляю первые 6 листов, оставляю только последний и запускаю макрос, время выполнения подсвечивается быстро.

Проблема в том, что я предпочел бы сохранить первые 6 листов и запустить макрос,Но в этом случае время выполнения чрезвычайно медленное.

Существует ли какой-либо код или возможность каким-либо образом выгрузить первые 6 листов из памяти, чтобы выполнение макроса было быстрым?

Я попытался использовать следующие параметры для оптимизации памяти и времени выполнения, но ничего не помогло.

Public CalcState As Long
Public EventState As Boolean
Public PageBreakState As Boolean
Sub OptimizeCode_Begin()

Application.ScreenUpdating = False

EventState = Application.EnableEvents
Application.EnableEvents = False

CalcState = Application.Calculation
Application.Calculation = xlCalculationManual

PageBreakState = ActiveSheet.DisplayPageBreaks
ActiveSheet.DisplayPageBreaks = False

End Sub

Код, который я использую на 7-м листе:

Sub Itemsperlinestep1()

    'Optimize Code
    Call OptimizeCode_Begin

    Dim cell, ra3 As Range

    Set ra3 = Sheets("Sheet1").Range("B1:XFD1")

    Do While True
        CountAA = Range("A2").Value

        For Each cell In ra3:
            If InStr(cell.Value, "<itemdata") Or InStr(cell.Value, "<figure") Then
            ElseIf cell.Value <> "" Then
                cell.Offset(0, -1) = cell.Offset(0, -1).Value & " " & cell.Value
                Sheets("Sheet1").Columns(cell.Column).EntireColumn.Delete               
            End If

        Next cell

        Check = Range("A2").Value

        If CountAA = Check Then
            Exit Do
        End If

    Loop


    'Optimize Code
    Call OptimizeCode_End
    Set ra3 = Nothing

End Sub

1 Ответ

0 голосов
/ 24 октября 2019

Спасибо всем за ваши рекомендации, но большинство из этих решений только сокращают время выполнения на пару наносекунд ...

То, о чем я говорил, было разницей в доли секунды (Когда только1 лист) до пары часов, когда первые 6 листов остаются в файле.

Таким образом, очевидной проблемой было наличие этих 6 листов и содержимого этих 6 листов, а не кода Iработала на 7-м листе.

Поэтому единственное решение, которое я нашел, - это удалить предварительно заполненные формулы и условное форматирование с первых 5 листов и использовать другой макрос для их копирования после того, как я закончу обработку на 7-м листе иВставьте текст.

Это не лучшее решение, но теперь оно работает быстро. Я бы определенно предпочел способ как-нибудь заморозить или выгрузить некоторые листы из памяти ... возможно, это то, что Microsoft могла бы добавить в будущих выпусках.

...