Автоматизация Excel через PIA делает VBA шатким
Я абсолютно не знаю, как начать диагностировать это, и просто подумал, есть ли у кого-нибудь какие-либо предложения. Я генерирую электронную таблицу Excel, вызывая некоторые макросы из приложения C#, и в процессе генерации она как-то ломается. У меня есть класс VBA, содержащий всю мою логику регистрации / обработки ошибок, которую я создаю с помощью метода доступа singleton-esque, показанного здесь:
Private mcAppFramework As csys_ApplicationFramework
Public Function AppFramework() As csys_ApplicationFramework
If mcAppFramework Is Nothing Then
Set mcAppFramework = New csys_ApplicationFramework
Call mcAppFramework.bInitialise
End If
Set AppFramework = mcAppFramework
End Function
Приведенный выше код отлично работает до того, как я сгенерировал электронную таблицу, но впоследствии не работает. Проблема, кажется, следующая строка;
Set mcAppFramework = New csys_ApplicationFramework
который я никогда не видел неудачу раньше. Если я добавлю часы в назначаемую здесь переменную, тип отобразится как csys_ApplicationFramework/wksFoo, где wksFoo - это случайный лист в той же книге. Кажется, что происходит то, что, хотя переменная имеет правильный тип, а не заполняет этот слот новым экземпляром моего каркасного класса, она вместо этого указывает на существующий рабочий лист, эквивалент
Set mcAppFramework = wksFoo
что является ошибкой компилятора, как и следовало ожидать. Еще более странно, если я поставлю точку останова на строку с ошибкой, отредактирую строку и затем продолжу выполнение, это сработает. Например, я удаляю слово "Новый", удаляю строку, возвращаюсь, повторно набираю "Новый" и возобновляю выполнение. Это как-то "исправляет" рабочую книгу, и она работает долго и счастливо, с типом переменной в моем окне просмотра, показанной как csys_ApplicationFramework/csys_ApplicationFramework, как и следовало ожидать.
Это подразумевает, что манипулирование рабочей книгой через PIA как-то временно нарушает ее. Все, что я делаю в PIA - это открываю книгу, вызываю несколько макросов с помощью Excel.Application.Run() и снова сохраняю ее. Я могу опубликовать еще несколько деталей, если кто-то считает, что это актуально.
Я не знаю, как VBA создает объекты за кулисами или как отлаживать это. Я также не знаю, как способ выполнения кода может измениться без изменения самого кода.
Как уже упоминалось ранее, VBA, откровенно говоря, немного пошутил по мне... Есть мысли?
2 ответа
Я предположил бы, что так или иначе PIA не работают правильно. Я бы порекомендовал отменить их регистрацию, удалить все экземпляры с вашего ПК, а затем восстановить их.
Конечно, это не то рациональное объяснение, которое я хотел бы дать, но иногда кажется, что COM просто не хочет себя вести. Я хотел бы знать, что на самом деле происходит, когда такие вещи рушатся, но единственное, что мне когда-либо показалось работой, это множество уколов в темноте, за которыми следует попытка найти рациональное объяснение, как только странный отказ от работы случайно исчезает снова,
Извините за отсутствие "РЕАЛЬНОГО" ответа
Если вы посмотрите в диспетчере задач, есть ли экземпляры Excel, работающие в фоновом режиме? Просто любопытно, если он создает объект Excel и не удаляет его должным образом.