Многочисленные источники, которые я обнаружил, предполагают, что размер массивов для кода VBA зависит от объема памяти в машине.
Было бы неплохо, если бы была функция Application.UseMoreMemory()
, которую мы могли бы просто call: -)
Увы, я не знаю ни одного.
Все документы, которые я видел, говорят, что они ограничены памятью, но проблема не в физической памяти, а в виртуальном адресе пространство, которое у вас есть.
Следует помнить, что увеличение с 500 до 600 выглядит лишь как умеренное увеличение (хотя 20% само по себе достаточно), потому что вы делаете что в трех измерениях он почти удваивает требования к хранилищу.
Из памяти Excel 2007 использовал короткие целые числа (16 бит) для логического типа, поэтому, как минимум, ваш массив 5003 будет занимать около 250M (500x500x500x2).
Увеличение всех размеров до 600 даст вам 600x600x600x2 или около 432M.
Все в пределах доступного адресного пространства 2G что у вас, вероятно, есть в 32-разрядной машине (я не знаю, что Excel 2007 имел 64-разрядную версию), но эти вещи не малы, и вы должны разделить это адресное пространство с другими вещами.
Было бы интересно узнать, с какого момента вы начали получать ошибки.
В качестве первого шага я хотел бы изучить необходимость в таком большом массиве. Это может быть осуществлено другим способом, например, разделением массива так, чтобы только одна его часть находилась в памяти в любой момент времени (своего рода ручная виртуальная память).
Маловероятно, что это будет хорошо для действительно произвольного доступа но не должен быть слишком плох для более последовательного доступа и, по крайней мере, поможет вам (медленное решение предпочтительнее нерабочего).
Другая возможность - абстрагироваться от обработки битов так, чтобы ваш логические значения на самом деле хранятся в виде битов, а не слов.
Вы должны будете предоставить функции для getBool
и setBool
, используя операторы битовой маски для массива слов, и, опять же, производительность не будет cra sh -hot, но вы по крайней мере сможете тогда go до эквивалента:
' Using bits instead of words gives 16 times as much. '
Dim arr(8000, 8000, 8000) As Boolean
Как всегда, это зависит от того, для чего вам нужен массив, и его использования шаблоны.
Надеюсь, я смог вам помочь.