Я уже несколько дней борюсь с проблемой Excel 2007. Ниже приведен список всех фактов, которые, как я могу думать, могут иметь значение:
-
IDetailSheet - это класс, объявленный в проекте VBA несколькими способами, и который вызывает ошибку в его инициализаторе класса, так что он не может быть создан (делая его абстрактным).
-
Параметр Explicit устанавливается во всех модулях.
-
Десять рабочих листов проекта VBA реализуют IDetailSheet и компилируются (как и весь проект).
-
CDetailSheets - это класс, объявленный в проекте VBA, который обертывает объект Collection и предоставляет объект Collection в виде коллекции IDetailSheet. Он также предоставляет некоторые дополнительные методы для выполнения определенных методов IDetailSheet для всех сборщиков.
-
В своем инициализаторе класса (вызванном из обработчика события Workbook_ Open и назначаемом глобальной переменной), CDetailSheet выполняет следующий код для заполнения частной коллекции DetailSheets:
Dim sht as EXCEL.WorkSheet For Each sht in ActiveWorkbook.Worksheets If TypeOf sht is IDetailSheet Then Dim DetailSheet as IDetailSheet Set DetailSheet = sht DetailSheets.Add DetailSheet, DetailSheet.Name End If Next sht
-
В некоторых обратных вызовах ленты выполняется следующий код:
If TypeOf ActiveWorkbook.ActiveSheet is IDetailSheet Then Dim DetailSheet as IDetailSheet Set DetailSheet = ActiveWorkbook.ActiveSheet DetailSheet.Refresh *[correction]* End If
-
Все элементы ActiveX были удалены из рабочей книги, после того как были идентифицированы с другими проблемами стабильности (первоначально было несколько десятков). Для замены функций, первоначально связанных с элементами управления ActiveX, была создана свободная интерфейсная лента.
-
Существует надстройка Hyperion от корпоративного шаблона, но она не используется в этой книге.
Когда все сказано и сделано, появляется следующий симптом, когда рабочая книга запущена:
- Любое количество экземпляров IDetailSheet распознается в Инициализаторе CDetailSheets по TypeOf Is, от 1 (наиболее часто встречающегося) до иногда 2 или 3. Никогда не ноль, не более 3, и, конечно же, никогда не доступны 10 доступных. (Не всегда один и тот же, хотя и находится рядом с передним рядом с набором, по-видимому, увеличивает вероятность признания.)
- Каковы бы ни были экземпляры реализации IDetailSheet в инициализаторе CDetailSheets (и как только я могу определить, только такие экземпляры) также распознаются с помощью TypeOf... Является ли обратная связь ленты.
Может кто-нибудь объяснить, почему большая часть TypeOf... Не работает ли операция? Или как решить проблему?
Я прибегал к ручному созданию v-таблиц (т.е. Больших уродливых операторов Select Case... End Select), чтобы заставить работать функциональность, но на самом деле мне кажется довольно неловко иметь мое имя рядом с таким кодом. Кроме того, я вижу, что это будущий кошмар.
Думая, что это могут быть устаревшие проблемы с p-кодом, я пошел до степени удаления файла Project.Bin из расширенного zip файла XLSM, а затем вручную импортировал весь код VBA. Без изменений. Я также попытался добавить имя проекта ко всем обычаям IDetailSheet, чтобы сделать их miFab.IDetailSheet, но опять же безрезультатно. (miFab - название проекта.)