Недостаточно памяти для завершения этого действия.

Вопрос или проблема

У меня есть небольшая проблема с Excel. Каждый раз, когда я открываю лист, появляется эта ошибка:

enter image description here

через примерно 10-15 минут. Я пробовал несколько способов, найденных в интернете, вот список того, что я пробовал: добавление дополнительной памяти, переход с 32-битной на 64-битную версию и обратно, добавление виртуальной памяти, отключение и включение DDE, смена версий Office, а также несколько настроек реестра. Теперь я задумался, может быть, это макрос, который я использую, переключающийся между двумя листами через определённый интервал. Сначала я думал, что это проблема, когда я их открываю в общем доступе, поэтому я написал скрипт, который копирует их локально, но ошибка все равно возникает.

Обработчик ошибок

Dim RunTime1 As Date

Sub MacroSwitch()

     Application.DisplayFullScreen = True

     On Error GoTo Errhandler

     Application.ScreenUpdating = False

     Workbooks.Open Filename:= _
        ThisWorkbook.Path & "\Monteursplanning.extern.xls", ReadOnly:=True
     ActiveWindow.WindowState = xlMaximized

     Exit Sub

Errhandler:
     MsgBox "An error has occurred. The macro will end."

     Application.DisplayFullScreen = False
End Sub

Кнопка запуска переключения

Sub MacroAutoRun1() 

     Application.DisplayFullScreen = True

RunTime1 = Now + TimeValue("00:01:00")

    Application.OnTime RunTime1, "MacroAutoRun1"

    If IsWbOpen("Monteursplanning.extern.xls") Then

         Application.ScreenUpdating = False

         Workbooks.Open Filename:= _
            ThisWorkbook.Path & "\Monteursplanning.intern.xls", ReadOnly:=True
         ActiveWindow.WindowState = xlMaximized

         Windows("Monteursplanning.extern.xls").Activate
         ActiveWindow.Close

         Application.ScreenUpdating = True

    Else

         Application.ScreenUpdating = False

         Workbooks.Open Filename:= _
            ThisWorkbook.Path & "\Monteursplanning.extern.xls", ReadOnly:=True
         ActiveWindow.WindowState = xlMaximized

         Windows("Monteursplanning.intern.xls").Activate
         ActiveWindow.Close

         Application.ScreenUpdating = True

    End If
  End Sub

какие-нибудь идеи?

Вы могли бы использовать AutoIt скрипт, который периодически переоткрывает книгу, или вы могли бы сделать это с помощью источника данных в вашем файле “Display” и кода для переключения между листами этого файла.

  • Настройте соединение для Excel файла, используя Данные => Существующие соединения/Соединения => Другие элементы (внизу) и выберите ваш Monteurplannung.intern.xls, добавьте данные на ваш первый лист. Обязательно настройте свойства для автоматического обновления и измените определение, чтобы заменить Mode=Share Deny Write на Mode=Read, чтобы файлы открывались только для чтения.
  • Настройте второе соединение для другого файла и отображайте эти данные на втором листе. В параметрах можно указать интервал обновления.

Все это основано на информации из этой статьи справки.

После этого вам нужно будет настроить другой макрос для переключения между этими листами. Вы можете использовать часть вашего кода для этого.

Sub MacroAutoRun1()
    RunTime1 = Now + TimeValue("00:00:01")

    Application.OnTime RunTime1, "MacroAutoRun1"

    If ActiveSheet.Name = "Tabelle1" Then
        ThisWorkbook.Sheets("Tabelle2").Activate
    Else
        ThisWorkbook.Sheets("Tabelle1").Activate
    End If
End Sub

Ответ или решение

Ошибка, возникающая при открытии файла Excel и сообщающая об отсутствии памяти для выполнения действия, может быть вызвана рядом факторов. Для решения этого вопроса важно понять, что может приводить к перегрузке памяти при выполнении макросов и каким образом можно это исправить.

Теория:

Проблемы с недостатоком памяти в Excel часто связаны с ресурсами, используемыми во время выполнения макросов. Excel, особенно в 32-битной версии, ограничен в объеме доступной оперативной памяти, и использование больших файлов или выполнение сложных операций может быстро исчерпать эти лимиты. Кроме того, ошибки в коде макроса или некорректная работа самого файла Excel могут усугубить ситуацию.

Пример:

В представленном коде макросов вы переключаетесь между двумя рабочими книгами через регулярные промежутки времени. Открытие и закрытие массивных файлов или выполнение ресурсоемких операций в таком режиме может вызвать утечку памяти или вызывать перерасход памяти, что приведет к ошибке. Например, ваше условие, при котором каждую минуту проверяются и открываются файлы "Monteursplanning.extern.xls" и "Monteursplanning.intern.xls", может становиться причиной излишней нагрузки.

Применение:

  1. Оптимизация макроса: Убедитесь, что макросы освобождают ресурсы после их использования. Например, после открытия файла его необходимо закрыть не только визуально, но и программно. Проверьте, что используемые вами объекты не остаются заблокированными в памяти.

  2. Управление обновлениями: Убедитесь, что частота обновлений данных адекватна вашим нуждам. Возможно, текущая стратегия с ежеминутным переключением между файлами не оптимальна.

  3. Использование 64-битной версии: Хотя вы и упоминали, что пробовали менять конфигурацию на 64-битную, убедитесь, что оставили её включенной, так как 64-битная версия Excel может использовать больше оперативной памяти.

  4. Увеличение виртуальной памяти: Проверьте настройки виртуальной памяти системы. Хотя вы говорили, что уже настраивали эти параметры, проверьте, чтобы изменений хватало для текущих операций.

  5. Обновление пакета Office: Убедитесь, что у вас установлены последние обновления для пакета Office. Это может решить некоторые критические ошибки и улучшить устойчивость приложения.

  6. Оптимизация данных: Если оба файла содержат большой объем данных, рассмотрите возможность их предварительной фильтрации, чтобы загружать в Excel только нужную информацию.

По итогу изменения в коде макроса, уменьшение частоты обновлений, а также оптимизация структуры данных могут помочь решить проблему перегрузки памяти и предотвратить ошибки, связываемые с её нехваткой.

Оцените материал
Добавить комментарий

Капча загружается...