Я не знаю, квалифицируется ли это как ответ, но код в этом событии OnOpen зависит от множества внешних функций. В частности, код назначает списки значений для RowSources группы комбинированных блоков. Непосредственный красный флажок, который мне приходит в голову, заключается в том, что источники строк, отличные от SQL, имеют конечную длину, а в Access 97 этот предел составлял 2048 символов (в Access 2003 это 32 750 - не спрашивайте меня, почему это число!).
Итак, самое непосредственное, что я вижу, это то, что, возможно, когда-либо данные управляют функциями, которые создают эти списки значений, начинают превышать 2048 символов в длину.
Если это фактический ответ, то вы можете написать функцию обратного вызова, которая будет возвращать значения в массивах, и она не будет иметь ограничения на возвращаемую длину. Вы должны установить RowsourceType в качестве имени вашей функции обратного вызова и оставить свойство Rowsource пустым.
Пример функции обратного вызова находится в справке A97 (хотя я не могу найти тот же пример в справке A2K3). В справке A97 вы можете найти это, выполнив поиск RowsourceType, а затем в окне справки нажмите на ссылку в предложении со словами «Вы также можете установить свойство RowSourceType с помощью ____ пользовательской функции ____.» * *
Чтобы проверить это, вам просто нужно узнать длину строки, возвращаемой из GetValueListArray () каждым массивом, на который есть ссылка в событии OnOpen.
Также может быть полезно добавить обработчик ошибок к событию OnOpen, особенно учитывая, что в этом конкретном подпрограмме в коде так много внешних зависимостей.
И, наконец, позвольте мне сказать, что это выглядит как ужасное программирование. Мне кажется, большая часть этого должна быть настроена с использованием свойств по умолчанию. Я также подвергаю сомнению такую зависимость от OpenArgs с таким недокументированным значением ввода. Что значит "5"? А что значит "1"? Это где-то задокументировано? Это просто ужас, ужасный код, на мой взгляд.
Я бы, скорее всего, сделал это с помощью автономного модуля класса, потому что это будет самодокументировано с точки зрения того, что делает что. Вы установили бы конкретное именованное свойство равным 5, и это управляло бы тем, что форма получает от методов модуля класса для заполнения полей со списком. Все это будет в одном месте, и вы можете использовать осмысленное имя свойства, чтобы прояснить, что представляют значения 5 и 1. Это особенно полезно, если у вас есть один и тот же код в событии OnOpen нескольких форм. В этом случае нетрудно переместить его из модулей формы, и единственный вопрос заключается в том, поместите ли вы его в обычный модуль или в отдельный модуль класса (как я предлагаю).
В любом случае, возможно, ничего из этого не имеется, но это может дать вам некоторые идеи.