Какое максимальное количество элементов управления может содержать форма VBA?

В настоящее время я создаю приложение Excel 2003, которое требует ужасно сложной формы, и меня беспокоят ограничения на количество элементов управления. В настоящее время он имеет 154 элемента управления (подсчитано с использованием Me.Controls.Count — это должно быть точно, верно?), но, вероятно, завершена только треть. Рабочий процесс действительно подходит для одной формы, но я думаю, что могу разделить его, если мне действительно нужно.

В поиске Google я вижу доказательства того, что VB6 (обычно это включает VBA) имеет жесткое ограничение в 254 элемента управления в форме. Тем не менее, я создал фиктивную форму с более чем 1200 элементами управления, которые все еще загружались и работали нормально.

Я получил несколько ошибок «недостаточно памяти» при попытке добавить определенные комбинации элементов управления, скажем, 800 кнопок и 150 меток, что заставило меня подумать, что на любой предел могут повлиять требования к памяти для каждого типа элемента управления.

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


person Lunatik    schedule 22.04.2010    source источник
comment
ради бога наймите эксперта по человеческому фактору!   -  person jk.    schedule 22.04.2010
comment
Примите во внимание беспокойство, но это сложный процесс сбора данных, который напрямую передается в систему управления печатью. Как правило, пользователю одновременно отображается до 8 текстов или выпадающих списков, но проблема в том, что некоторые задания очень детализированы, поэтому может быть задействовано много информации. Сами данные загружаются из базы данных, но пользователь должен иметь возможность изменять любую их часть, и у каждого есть определенные правила проверки и зависимости, которые трудно обойти любым другим известным мне способом.   -  person Lunatik    schedule 22.04.2010
comment
В то время как количество элементов управления не является большой проблемой, вы, вероятно, столкнетесь с проблемами, если вы ссылаетесь более чем на ~411 элементов управления UF (Excel 97/2000/2003) напрямую в своем коде (например, через Label1.Caption = "...") вместо того, чтобы косвенно обращаться к ним как к элементам коллекции элементов управления. См. [Not-enough-memory-crash-when-loading-vba-userform] (stackoverflow.com/questions/50140753/)   -  person T.M.    schedule 19.05.2018


Ответы (4)


Большинство элементов управления MSForms не имеют окон (поскольку они не являются настоящими окнами, а рисуются непосредственно механизмом VBA Forms в виде графических объектов), которые по сравнению с ними «легкие». Это означает, что вы можете выгрузить в пользовательскую форму больше, чем при использовании эквивалентных элементов управления, отличных от MSForms, в форме VB6.

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

Тем не менее, такое количество элементов управления по-прежнему кажется слишком большим для пользователя!

person Alex K.    schedule 22.04.2010
comment
Ура, это соответствует тому, что я вижу. Теперь у меня есть форма, прекрасно работающая с нужным количеством элементов управления. - person Lunatik; 28.04.2010

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

К сожалению, у меня слишком много опыта в создании форм VBA со слишком большим количеством элементов управления. :(

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

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

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

person Stewbob    schedule 22.04.2010
comment
Я знаю, что вы имеете в виду по поводу элемента управления Frame, я избегаю их, если это вообще возможно, в настоящее время из-за проблем, которые вы подчеркиваете. - person Lunatik; 22.04.2010

Никаких жестких и мягких правил...


Не существует определенного количества элементов управления, которыми VBA ограничит вас.
Это полностью зависит от системы, в которой вы его запускаете.

Как общее правило:

  • Уменьшите количество элементов управления.
  • Используйте элементы управления сеткой вместо массивов кнопок.
  • Разделите его на логические формы для дальнейшего упрощения.
  • Используйте упрощенные элементы управления (элементы управления без дескриптора), так как они потребляют меньше памяти.

Кроме того, если вы все еще используете более 100 элементов управления на экране (как вы говорите), то вам пора нанять нового дизайнера пользовательского интерфейса для проекта.

Удачи!!

PS: попробуйте разделить форму, если это возможно.
Я не могу представить себе использование какой-либо программы, которая отображает 154 элемента управления на одном экране.
(MS-WORD довольно близок к этому). ;-))


ОБНОВЛЕНИЕ: кое-что для справки ниже...

person TheCodeArtist    schedule 22.04.2010
comment
Элементы управления не отображаются на экране одновременно, вложенные многостраничные элементы управления отображают только разделы, относящиеся к конкретной обрабатываемой работе. Просто рабочий процесс очень сложен, и есть вероятность, что придется зафиксировать много деталей. Я знаю, это звучит ужасно, но на самом деле работает очень хорошо в данный момент и очень хорошо соответствует потребностям пользователей. - person Lunatik; 22.04.2010
comment
Помогла ли вам эта штука с облегченным управлением?? support.microsoft.com/kb/184687 Это должно значительно увеличить количество поддерживаемых элементов управления. (даже на слабой системе) - person TheCodeArtist; 22.04.2010
comment
Что касается облегченных элементов управления, ответ Алекса К., похоже, указывает на то, что все формы VBA относятся к этому типу и изначально обрабатываются приложением, а не Windows. Кажется, я припоминаю, что где-то читал это раньше, и это имеет смысл, если учесть ограничения на VBA по сравнению с формами VB6. - person Lunatik; 22.04.2010
comment
В этом случае учтите следующее: любая база данных, какой бы сложной она ни была, будет иметь некоторую структуру. Некоторые поля всегда можно логически сгруппировать. Используйте такую ​​логику, чтобы распределить пользовательский интерфейс по нескольким экранам/формам. Разрешить пользователю возможность перемещаться вперед-назад по различным формам. Это должно снизить требования к памяти проекта в несколько раз. Удачи!! - person TheCodeArtist; 22.04.2010

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

person guitarthrower    schedule 22.04.2010