«Не удалось закрыть метод класса Workbook»: кто-нибудь еще недавно получал эту ошибку? - PullRequest
1 голос
/ 23 апреля 2020

После недавней партии Windows Updates мое приложение получает эту ошибку:

Сбой метода закрытия класса Workbook

Самый простой способ продемонстрировать это:

  1. Создание нового файла Excel.
  2. Создание нового макроса и вставка в следующие строки:
Dim workbook As Object
Set workbook = CreateObject("Excel.Sheet")
workbook.Close
Запустите макрос.

На компьютере с последними обновлениями я получаю сообщение об ошибке. На компьютере, на котором нет обновлений, он работает.

Вопросы:

  • Кто-нибудь еще заметил это?
  • Какая спецификация c Windows Обновление запускает это?
  • Знает ли Microsoft об этом и / или что-то с этим делает?
  • Кто-нибудь знает какие-либо решения или работу -округ?

1 Ответ

1 голос
/ 24 апреля 2020

Этот пример никогда не работал, он последовательно выдает «ActiveX не может создать объект», потому что вы просто не можете создать объект Excel.Sheet - Excel, во-первых, даже не определяет какой-либо класс Sheet, а во-вторых. . * edit: Я исправлен, там есть Excel.Sheet ключ реестра ProdID и CreateObject("Excel.Sheet"), похоже, "работает", но мои эксперименты закончились тем, что Excel загорелся, не рекомендую .

Worksheet объекты (обычно?) живут в коллекции объектов Sheets, которая принадлежит объекту Workbook, который сам живет в коллекции объектов Workbooks, который принадлежит и управляется объектом Application - и , который является классом, который вы можете создать с помощью CreateObject - для создания Workbook объекта вам необходимо использовать коллекцию Workbooks объектной модели класс (т. е. книга не может существовать в воздухе, она должна быть дочерним объектом родительской коллекции книг, которая сама принадлежит объекту Application):

With CreateObject("Excel.Application")

    With .Workbooks.Add
        '...
        .Close
    End With

    .Quit

End With

Однако, если ваш код размещен в Excel, библиотека Excel уже Ссылка на dy: использование CreateObject для получения типа, который компилятор уже знает, как решить, - это большая работа впустую (почему go ищет строку ProgID в реестре, когда тип, который вы ищете - буквально тут же ). Избегайте кодирования против Object, когда у вас есть доступ во время компиляции к соответствующим типам.

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

With New Excel.Application

    With .Workbooks.Add
        '...
        .Close
    End With

    .Quit

End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...