Вопрос или проблема
У меня есть небольшая проблема с Excel. Каждый раз, когда я открываю лист, появляется эта ошибка:
через примерно 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", может становиться причиной излишней нагрузки.
Применение:
-
Оптимизация макроса: Убедитесь, что макросы освобождают ресурсы после их использования. Например, после открытия файла его необходимо закрыть не только визуально, но и программно. Проверьте, что используемые вами объекты не остаются заблокированными в памяти.
-
Управление обновлениями: Убедитесь, что частота обновлений данных адекватна вашим нуждам. Возможно, текущая стратегия с ежеминутным переключением между файлами не оптимальна.
-
Использование 64-битной версии: Хотя вы и упоминали, что пробовали менять конфигурацию на 64-битную, убедитесь, что оставили её включенной, так как 64-битная версия Excel может использовать больше оперативной памяти.
-
Увеличение виртуальной памяти: Проверьте настройки виртуальной памяти системы. Хотя вы говорили, что уже настраивали эти параметры, проверьте, чтобы изменений хватало для текущих операций.
-
Обновление пакета Office: Убедитесь, что у вас установлены последние обновления для пакета Office. Это может решить некоторые критические ошибки и улучшить устойчивость приложения.
-
Оптимизация данных: Если оба файла содержат большой объем данных, рассмотрите возможность их предварительной фильтрации, чтобы загружать в Excel только нужную информацию.
По итогу изменения в коде макроса, уменьшение частоты обновлений, а также оптимизация структуры данных могут помочь решить проблему перегрузки памяти и предотвратить ошибки, связываемые с её нехваткой.