Какое максимальное количество измерений может содержать массив в Excel

Обновлено: 05.07.2024

Я автоматизирую Excel 2010 из приложения C++. Когда я пытаюсь назначить массив (больше 567978 x 18 или 1022396 x 10) для Range.Value2, происходит сбой с ошибкой COM 0x8007000E "Недостаточно памяти для завершения этой операции".

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

Сообщить о нарушении

Домогательство – это любое поведение, направленное на то, чтобы побеспокоить или расстроить человека или группу людей. К угрозам относятся любые угрозы самоубийства, насилия или причинения вреда другому человеку. Любой контент на тему для взрослых или неуместный для веб-сайта сообщества. Любое изображение, ссылка или обсуждение наготы. Любое поведение, которое является оскорбительным, грубым, вульгарным, оскверняет или демонстрирует неуважение. Любое поведение, которое может нарушать лицензионные соглашения с конечными пользователями, включая предоставление ключей продукта или ссылок на пиратское программное обеспечение. Незапрашиваемая массовая рассылка или массовая реклама. Любые ссылки на вирусы, шпионское ПО, вредоносное ПО или фишинговые сайты или их пропаганда. Любой другой неприемлемый контент или поведение, как это определено Условиями использования или Кодексом поведения. Любое изображение, ссылка или обсуждение, связанные с детской порнографией, детской наготой или другим жестоким обращением с детьми или их эксплуатацией.

Ответы (5) 

Если это одномерные массивы, я бы предположил, что пределом будет число или строки (или столбцы, если массив горизонтальный) на листе. Размер вашего массива значительно превышает это значение.

Сообщить о нарушении

Домогательство – это любое поведение, направленное на то, чтобы побеспокоить или расстроить человека или группу людей. К угрозам относятся любые угрозы самоубийства, насилия или причинения вреда другому человеку. Любой контент на тему для взрослых или неуместный для веб-сайта сообщества. Любое изображение, ссылка или обсуждение наготы. Любое поведение, которое является оскорбительным, грубым, вульгарным, оскверняет или демонстрирует неуважение. Любое поведение, которое может нарушать лицензионные соглашения с конечными пользователями, включая предоставление ключей продукта или ссылок на пиратское программное обеспечение. Незапрашиваемая массовая рассылка или массовая реклама. Любые ссылки на вирусы, шпионское ПО, вредоносное ПО или фишинговые сайты или их пропаганда. Любой другой неприемлемый контент или поведение, как это определено Условиями использования или Кодексом поведения. Любое изображение, ссылка или обсуждение, связанные с детской порнографией, детской наготой или другим жестоким обращением с детьми или их эксплуатацией.

Был ли этот ответ полезен?

Извините, это не помогло.

Отлично! Благодарим за отзыв.

Насколько вы удовлетворены этим ответом?

Спасибо за ваш отзыв, он помогает нам улучшить сайт.

Насколько вы удовлетворены этим ответом?

Спасибо за отзыв.

Это двумерные массивы (567978 строк по 18 столбцов и 1022396 строк по 10 столбцов), и они работают. Когда я добавляю хотя бы еще одну строку, Excel возвращает «Недостаточно памяти». Ограничение меньше, чем количество строк на количество столбцов на листе, которое составляет 1048 576 строк на 16 384 столбца (спецификации и ограничения Excel).

Сообщить о нарушении

Домогательство – это любое поведение, направленное на то, чтобы побеспокоить или расстроить человека или группу людей. К угрозам относятся любые угрозы самоубийства, насилия или причинения вреда другому человеку. Любой контент на тему для взрослых или неуместный для веб-сайта сообщества. Любое изображение, ссылка или обсуждение наготы. Любое поведение, которое является оскорбительным, грубым, вульгарным, оскверняет или демонстрирует неуважение. Любое поведение, которое может нарушать лицензионные соглашения с конечными пользователями, включая предоставление ключей продукта или ссылок на пиратское программное обеспечение. Незапрашиваемая массовая рассылка или массовая реклама. Любые ссылки на вирусы, шпионское ПО, вредоносное ПО или фишинговые сайты или их пропаганда. Любой другой неприемлемый контент или поведение, как это определено Условиями использования или Кодексом поведения. Любое изображение, ссылка или обсуждение, связанные с детской порнографией, детской наготой или другим жестоким обращением с детьми или их эксплуатацией.

Был ли этот ответ полезен?

Извините, это не помогло.

Отлично! Благодарим за отзыв.

Насколько вы удовлетворены этим ответом?

Спасибо за ваш отзыв, он помогает нам улучшить сайт.

Насколько вы удовлетворены этим ответом?

Спасибо за отзыв.

В этом случае единственный соответствующий пункт, который я нашел в справке VBA, это "Максимальный размер массива зависит от вашей операционной системы и объема доступной памяти".

Возможно, происходит что-то еще.

У меня нет опыта в том, что именно вы делаете, но вы пишете, что пытаетесь присвоить массив Range.Value2. Я знаю, что в VBA это было бы невозможно. Вы сможете присвоить только одно значение .Value2. Вы можете назначить массив диапазону, который имеет ту же размерность, что и массив, с одним элементом массива в каждой ячейке. Или вы можете создать константу массива и присвоить ее свойству .formulaarray, но вы довольно быстро столкнетесь с ограничением размера формулы.

В VBA вы должны сделать что-то вроде:

Dim v(от 1 до 500000, от 1 до 18)
'установить содержимое массива
Set R = range(cells(1,1), Cells(500000,18)) < бр />R = v

Вы можете настроить цикл, но это займет много времени.

Сообщить о нарушении

Домогательство – это любое поведение, направленное на то, чтобы побеспокоить или расстроить человека или группу людей. К угрозам относятся любые угрозы самоубийства, насилия или причинения вреда другому человеку. Любой контент на тему для взрослых или неуместный для веб-сайта сообщества. Любое изображение, ссылка или обсуждение наготы. Любое поведение, которое является оскорбительным, грубым, вульгарным, оскверняет или демонстрирует неуважение. Любое поведение, которое может нарушать лицензионные соглашения с конечными пользователями, включая предоставление ключей продукта или ссылок на пиратское программное обеспечение. Незапрашиваемая массовая рассылка или массовая реклама. Любые ссылки на вирусы, шпионское ПО, вредоносное ПО или фишинговые сайты или их пропаганда. Любой другой неприемлемый контент или поведение, как это определено Условиями использования или Кодексом поведения. Любое изображение, ссылка или обсуждение, связанные с детской порнографией, детской наготой или другим жестоким обращением с детьми или их эксплуатацией.

Размер – это направление, в котором вы можете изменять спецификацию элементов массива. Массив, содержащий общую сумму продаж за каждый день месяца, имеет одно измерение (день месяца). Массив, содержащий общий объем продаж по отделам на каждый день месяца, имеет два измерения (номер отдела и день месяца). Количество измерений массива называется его рангом.

Вы можете использовать свойство Rank, чтобы определить, сколько измерений имеет массив.

Работа с параметрами

Вы указываете элемент массива, указывая индекс или подстрочный индекс для каждого из его измерений. Элементы являются смежными по каждому измерению от индекса 0 до самого высокого индекса для этого измерения.

На следующих рисунках показана концептуальная структура массивов с разными рангами. Каждый элемент на иллюстрациях показывает значения индекса, которые к нему обращаются. Например, вы можете получить доступ к первому элементу второй строки двумерного массива, указав индексы (1, 0).

Одно измерение

Многие массивы имеют только одно измерение, например количество людей каждого возраста. Единственным требованием для указания элемента является возраст, для которого этот элемент содержит счетчик. Поэтому такой массив использует только один индекс. В следующем примере объявляется переменная для хранения одномерного массива значений возраста от 0 до 120 лет.

Два измерения

Некоторые массивы имеют два измерения, например количество офисов на каждом этаже каждого здания в кампусе. Спецификация элемента требует как номер здания, так и этаж, и каждый элемент содержит количество для этой комбинации здания и этажа. Следовательно, такой массив использует два индекса. В следующем примере объявляется переменная для хранения двумерного массива количества офисов для зданий с 0 по 40 и этажей с 0 по 5.

Двумерный массив также называется прямоугольным массивом.

Три измерения

Некоторые массивы имеют три измерения, например значения в трехмерном пространстве. Такой массив использует три индекса, которые в данном случае представляют координаты x, y и z физического пространства. В следующем примере объявляется переменная для хранения трехмерного массива температур воздуха в различных точках трехмерного объема.

Более трех измерений

Хотя массив может иметь до 32 измерений, редко бывает больше трех.

Когда вы добавляете измерения в массив, общий объем памяти, необходимый для массива, значительно увеличивается, поэтому используйте многомерные массивы с осторожностью.

Использование разных параметров

Предположим, вы хотите отслеживать суммы продаж за каждый день текущего месяца. Вы можете объявить одномерный массив с 31 элементом, по одному на каждый день месяца, как показано в следующем примере.

Теперь предположим, что вы хотите отслеживать одну и ту же информацию не только для каждого дня месяца, но и для каждого месяца года. Вы можете объявить двумерный массив с 12 строками (для месяцев) и 31 столбцом (для дней), как показано в следующем примере.

Теперь предположим, что вы решили хранить информацию в своем массиве более одного года. Если вы хотите отслеживать объемы продаж за 5 лет, вы можете объявить трехмерный массив с 5 слоями, 12 строками и 31 столбцом, как показано в следующем примере.

Обратите внимание, что, поскольку каждый индекс варьируется от 0 до максимального значения, каждое измерение salesAmounts объявляется на единицу меньше требуемой длины для этого измерения. Обратите также внимание, что размер массива увеличивается с каждым новым измерением. Три размера в предыдущих примерах: 31, 372 и 1860 элементов соответственно.

Можно создать массив, не используя оператор Dim или предложение New.Например, вы можете вызвать метод CreateInstance, или другой компонент может передать вашему коду массив, созданный таким образом. Такой массив может иметь нижнюю границу, отличную от 0. Вы всегда можете проверить нижнюю границу измерения с помощью метода GetLowerBound или функции LBound.

Office 365 профессиональный плюс переименовывается в Приложения Microsoft 365 для предприятий. Для получения дополнительной информации об этом изменении прочитайте эту запись в блоге.

Обзор

В версиях Microsoft Excel, перечисленных в разделе «Относится к», в разделе справки «Спецификации вычислений» перечислены ограничения для работы с массивом. В этой статье описываются ограничения массивов в Excel.

Дополнительная информация

В Excel массивы на листах ограничены доступной оперативной памятью, общим количеством формул массива и правилом "весь столбец".

Доступная память

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

Правило "весь столбец"

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

В Microsoft Office Excel 2003 и более ранних версиях Excel в столбце 65 536 ячеек. В Microsoft Office Excel 2007 в столбце 1 048 576 ячеек.

Формулы максимального массива

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

Например, на Листе1 книги можно создать следующие элементы:

  • 65 472 формулы массива, ссылающиеся на Sheet2
  • 65 472 формулы массива, ссылающиеся на Sheet3
  • 65 472 формулы массива, ссылающиеся на Sheet4

Если вы попытаетесь создать более 65 472 формул массива, которые ссылаются на конкретный рабочий лист, формулы массива, введенные после номера формулы массива 65 472, могут исчезнуть при их вводе.

Примеры формул массива

Ниже приведен список примеров формул массива. Чтобы использовать эти примеры, создайте новую книгу и введите каждую формулу как формулу массива. Для этого введите формулу в строку формул, а затем нажмите CTRL+SHIFT+ВВОД, чтобы ввести формулу.

Excel 2007

Формула в ячейке A1 возвращает результат 1048576. Это правильный результат.

Формула в ячейке A2 возвращает результат 1048576. Это правильный результат.

Формула в ячейке A3 возвращает результат 9437184. Это правильный результат.

Вычисление результата формулой может занять много времени, поскольку формула проверяет более 1 миллиона ячеек.

Формула в ячейке A4 возвращает результат 9437184. Это правильный результат.

Вычисление результата формулой может занять много времени, поскольку формула проверяет более 1 миллиона ячеек.

При вводе этой формулы в ячейку A5 может появиться одно из следующих сообщений об ошибке:

У Excel закончились ресурсы при попытке вычислить одну или несколько формул. В результате эти формулы не могут быть вычислены.

Чтобы определить уникальный номер, связанный с полученным сообщением, нажмите CTRL+SHIFT+I. В правом нижнем углу этого сообщения отображается следующий номер:

101758

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

Кроме того, Excel может перестать отвечать на запросы в течение нескольких минут. Это связано с тем, что другие введенные вами формулы должны пересчитать свои результаты.

После пересчета результатов Excel отвечает ожидаемым образом. Формула в ячейке A5 возвращает значение 0 (ноль).

Excel 2003 и более ранние версии Excel

Формула в ячейке A1 возвращает результат 65 535. Это правильный результат.

Формула в ячейке A3 возвращает результат 589815. Это правильный результат.

Вычисление результата формулой может занять много времени, поскольку формула проверяет почти 600 000 ячеек.

При вводе формулы в ячейку A5 может появиться одно из следующих сообщений об ошибке:

Недостаточно памяти. Продолжить без отмены?

Недостаточно памяти.

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

Кроме того, Excel может перестать отвечать на запросы в течение нескольких минут.Это связано с тем, что другие введенные вами формулы должны пересчитать свои результаты.

После пересчета результатов Excel отвечает ожидаемым образом. Формула в ячейке A5 возвращает значение 0 (ноль).

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


Участник форума Регистрация 13.04.2014 Местоположение Барри, Он, Канада MS-Off Ver Excel 2016 Сообщений 175

Максимальный размер массива в Excel 2016

Я пытаюсь использовать массив для заполнения столбца примерно из 300 000 строк. Подпрограмма дает N/A после 30 000 (10% от того, что я хочу). Каково максимальное количество элементов для массива (чтобы упростить его, скажем, одно измерение - redim arr (1 to bigNum) в excel 2016? Как я могу заставить его работать? Я не могу использовать циклы для заполнения, так как это занимает много времени , Приветствуется любая помощь!

Гуру форума Дата регистрации 03.10.2012 Местоположение Антверпен, Бельгия MS-Off Ver MO Prof Plus 2016 Сообщений 6 901

Избегайте использования Select, Selection и Activate в коде. Использовать с . Конец с вместо этого.
Вы можете выразить признательность тем, кто вам помог, нажав * в левом нижнем углу любого из их сообщений.


Участник форума Регистрация 13.04.2014 Местоположение Барри, Он, Канада MS-Off Ver Excel 2016 Сообщений 175

Это базовая манипуляция, такая как взятие одного столбца с заменой некоторых значений. У вас вообще не было проблем с размером массива? Может быть, это просто мой компьютер.


Я нашел решение, но я не могу удалить эту тему, так как у некоторых других может быть такая же проблема. Это один из способов сделать это, если размер слишком велик: redim save (1 to bigNum, 1 to 1). Это работает как по волшебству. Спасибо за ответ!

Forum Expert Дата регистрации 06.10.2008 Местоположение Канада MS-Off Ver 2007 / 2013 Сообщений 4368

Гуру форума Дата регистрации 10.03.2010 Местоположение Leeds MS-Off Ver 365 Win 11 Сообщений 7 197

Используете ли вы формулы рабочего листа, такие как транспонирование массива? Они могут вызвать этот симптом, не используйте их

Гуру форума Дата регистрации 03.10.2012 Местоположение Антверпен, Бельгия MS-Off Ver MO Prof Plus 2016 Сообщений 6 901

Redim Preserve очень требователен к ресурсам, особенно на больших массивах, поскольку y приходится каждый раз пересчитывать. Этого следует избегать, насколько это возможно.

Пример объявления массива из 60 измерений показан в коде 1, а связанное с ним представление Locals Windows — на рис. 1. Каждое измерение — это отдельный элемент.

declare-big-array


Рис. 1. Окно Locals. BigArray расширен до уровня 6 измерений

2. Превышение ограничения размера

  1. Строка 7: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
  2. Строка 8: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) как целое число
  3. возвращает ошибку компиляции: слишком много измерений

Другими словами, превышено ограничение в 60 размеров.

3. Увеличение количества элементов большого массива

В коде 1b объявление модуля включает Option Base 0 (строка 1), а верхний индекс каждого измерения имеет значение 1. Это эквивалентно Dim BigArray(0 to 1, 0 to 1, 0 to 1, , от 0 до 1)

Это объявление возвращает ошибку 7 Недостаточно памяти (в 64-разрядной версии Windows 10 с 64 ГБ ОЗУ), так как ресурсы Excel и VBA превышены. Есть 2^60 элементов. Сравните это с 2^34 ячейками на листе.


Код 1b: Sub BigArrayDeclare60b объявляет массив с 60 измерениями и 2 элементами целочисленного типа на измерение

4. Определение размерности массива

Нет встроенной функции VBA для возврата количества измерений для массива. В коде 2 макрос BigArrayDimensions подсчитывает количество измерений, проверяя наличие индекса нижней границы для измерения с помощью функции LBound.

Макрос BigArrayDimensions

Код 2 по номеру строки (выбранные операторы):

  1. Строка 1: объявление процедуры: Sub BigArrayDimensions()
  2. Строки с 3 по 8. Объявите статический массив BigArray с 60 размерами и типом Integer . Объем процедуры. Значение по умолчанию: 0 в элементе верхнего измерения. Это один оператор объявления с разрывами строк, добавленными для улучшения читаемости (пробел, подчеркивание, ввод в конце строк с 3 по 7).Написано в виде одной строки, нам нужно прокрутить вправо, чтобы прочитать код в этой альтернативной версии -
  3. Строка 12. Подавить сообщение об ошибке, выдаваемое функцией LBound (строка 14), в тех случаях, когда превышен предел размера массива, а затем передать управление оператору, непосредственно следующему за оператором, вызвавшим ошибку.
  4. Строки с 13 по 19: A For. Следующий цикл с 62 шагами (60 плюс произвольное поле)
  5. Строки 14. Возвращает номер индекса нижней границы измерения i и присваивает значение переменной ErrChk. В этом примере все значения равны нулю для допустимого размера. Если размер не существует, возвращается ошибка нижнего индекса или диапазона (номер ошибки 9)


Код 2. Sub BigArrayDimensions подсчитывает количество параметров, проверяя наличие индекса нижней границы для измерения

Читайте также: