Невозможно добавить OLEObject в PowerPoint, когда ячейка находится в режиме редактирования в отдельном окне Excel

Сначала откройте новый документ PowerPoint и Excel, затем щелкните первую (или любую) ячейку в документе Excel, пока не станет виден текстовый курсор, вернитесь в PowerPoint и запустите следующий код VBA (при условии, что у вас есть хотя бы один пустой слайд уже присутствует):

ActivePresentation.slides(1).Shapes.AddOLEObject 30, 30, 100, 100, "Excel.Sheet"

Я получаю следующую ошибку (в нескольких системах):

-2147467259 Ошибка метода AddOLEObject объекта Shapes.

Если вы закроете отдельное окно Excel, команда будет работать нормально, если вы выберете другую ячейку без видимого текстового курсора, команда тоже будет работать нормально. Что-то в том, что редактирование ячейки в отдельном окне Excel, кажется, приводит к сбою метода «AddOLEObject».

Это одна из самых странных ошибок VBA, с которыми я когда-либо сталкивался. Я проверил это поведение на трех разных машинах, а в версиях Office 2013 и 2010 кто-нибудь знает, почему это происходит?


person David Rogers    schedule 29.07.2016    source источник
comment
Это не ошибка. Когда Excel находится в режиме Edit, он вроде как полностью зависает :)   -  person Siddharth Rout    schedule 29.07.2016
comment
Excel не может обрабатывать COM-запросы в режиме редактирования (по понятным причинам). Что такое .Value в Range, который активно редактируется?   -  person Comintern    schedule 29.07.2016
comment
@Comintern Очевидные причины для меня не очевидны, не очевидны и после поиска в Google COM-запросов Excel в режиме редактирования, это где-то задокументировано? Также Value, который я редактирую, может быть любой ячейкой в ​​документе Excel, но обычно я использую A1 для репликации проблемы.   -  person David Rogers    schedule 29.07.2016
comment
Думайте об этом как о блокировке записи в базе данных. Если кто-то редактирует значение, следует ли возвращать значение до редактирования? Разные базы данных обрабатывают это по-разному. Excel решает проблему путем блокировки.   -  person Comintern    schedule 29.07.2016
comment
@Comintern За исключением того, что в этом примере аналогия не работает, потому что я должен иметь доступ к совершенно отдельному объекту (то есть к базе данных), но я думаю, что знаю, куда вы идете с этим, я думаю, что ключ в том, чтобы понять, что сеансы Excel обмениваются информацией друг с другом, возможно, superuser.com/questions / 21602 / open-excel-files-in-new-window актуально? Поправьте меня, если я ошибаюсь, но два отдельных документа Excel (один в PPTM, а другой в XLXS) должны быть осведомлены и даже зависеть друг от друга.   -  person David Rogers    schedule 29.07.2016
comment
Более или менее - в COM приложение представляет собой COM-сервер, который обрабатывает запросы от COM-клиентов. Поскольку режим обрабатывается на уровне приложения, а не на уровне документа, он блокируется для всех документов.   -  person Comintern    schedule 29.07.2016
comment
Пропустил часть про ссылку SU. Это не изменит поведения, потому что даже если вы разделите окна Excel, они все равно будут обслуживаться одним и тем же приложением. Вы можете проверить это позже, заглянув в диспетчер задач - вы увидите только один экземпляр EXCEL.EXE.   -  person Comintern    schedule 29.07.2016
comment
@SiddharthRout Я не уверен, что зависания полностью точно описывает, что происходит в этой ситуации, возможно, сбой с общим сообщением об ошибке будет выделен ближе. Кроме того, если это не ошибка, то это должно быть по дизайну, но я бы назвал это очевидным.   -  person David Rogers    schedule 29.07.2016
comment
Позвольте нам продолжить это обсуждение в чате.   -  person David Rogers    schedule 29.07.2016
comment
1. Откройте редактор VBA в Excel 2. Перейдите к листу 1 и нажмите F2 или дважды щелкните ячейку A1. т.е. переведите ячейку в режим редактирования. 3. Перейдите в редактор VBA и попробуйте ввести текст в области кода. Теперь вы поймете, что я имею в виду под замораживанием :)   -  person Siddharth Rout    schedule 29.07.2016
comment
@SiddharthRout Да, в этом примере я понял вашу точку зрения, если это не ошибка, то расширьте ее по дизайну, верно? Может быть, неизбежно, но все же я не знаю другого приложения, которое можно было бы заморозить по дизайну .... Как странно :(   -  person David Rogers    schedule 29.07.2016
comment
Надеюсь, объяснение и альтернатива, которые я вам дал, помогут вам? ;)   -  person Siddharth Rout    schedule 30.07.2016


Ответы (2)


К сожалению, большинство сообщений об ошибках MS Office VB - ДЕРЬМО!

Почему хреново? Потому что их сложно понять обычному пользователю. А когда вы нажимаете кнопку «Справка» в сообщении об ошибке, вы попадаете на нерелевантную ссылку / страницу в Интернете или в справке Excel. Я подумывал о применении в качестве «средства записи сообщений об ошибках» в Microsoft: D

Проработав с ним более 18 лет, я могу распознать большинство из них, но время от времени, когда я сталкиваюсь с новым сообщением об ошибке, мне действительно приходится искать в Google, чтобы найти, что означает эта ошибка !!!

В любом случае...

Как я уже сказал: «Когда Excel находится в режиме редактирования, он вроде как полностью зависает»

А чтобы увидеть это в действии и действительно понять, что происходит, сделайте следующее.

  1. Открыть Excel
  2. Добавить новый рабочий лист
  3. Перейдите на любой лист и нажмите F2 или дважды щелкните ячейку A1. т.е. переведите ячейку в режим редактирования
  4. Открыть PowerPoint
  5. Добавить новую презентацию
  6. Щелкните ВСТАВИТЬ | ОБЪЕКТ | Лист Microsoft Excel (Создать новый), как показано на изображении ниже.

введите описание изображения здесь

Вы заметите, что теперь получите более "понятную ошибку".

введите описание изображения здесь


Альтернатива

Мы знаем, что Excel позволяет создавать несколько экземпляров Excel. Итак, что мы будем делать сейчас, это

  1. Создать новый экземпляр Excel
  2. Добавить новый рабочий лист
  3. Сохраните пустую книгу во временном каталоге пользователя.
  4. Добавьте этот файл в PowerPoint
  5. Удалить этот файл

Плюсы

Вы сможете добавить форму

Минусы

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

Код

'~~> API to get user's temp path
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Const MAX_PATH As Long = 260

Sub Sample()
    Dim oxlapp As Object, oxlwb As Object
    Dim filePath As String

    '~~> Create a temporary file name
    filePath = TempPath & Format(Now, "ddmmyyhhmmss") & ".xlsx"

    '~~> Create a new instance
    Set oxlapp = CreateObject("Excel.Application")

    '~~> Add a new workbook
    Set oxlwb = oxlapp.workbooks.Add

    '~~> Save it to the temp directory
    oxlwb.SaveAs filePath, 51

    '~~> Add the shape
    ActivePresentation.Slides(1).Shapes.AddOLEObject 30, 30, 100, 100, , filePath, msoFalse, , , , msoFalse

    oxlwb.Close (False)
    oxlapp.Quit

    Kill filePath
End Sub

Function TempPath() As String
    TempPath = String$(MAX_PATH, Chr$(0))
    GetTempPath MAX_PATH, TempPath
    TempPath = Replace(TempPath, Chr$(0), "")
End Function

Когда вы запустите этот код, вы увидите вот что

введите описание изображения здесь

person Siddharth Rout    schedule 30.07.2016

Чтобы обобщить все комментарии и предоставить всем желающим план действий в будущем, вот соответствующие факты и решения, которые я принял в своем заявлении, чтобы избежать проблемы:

  • Вы не можете отправлять команды VBA в Excel, пока он находится в режиме редактирования, это приведет к его зависанию или, если это делается через внешнее приложение (например, PowerPoint), будет выведено ранее указанное сообщение об ошибке. (@ SiddharthRout)

  • «В COM приложение представляет собой COM-сервер, который обрабатывает запросы от COM-клиентов. Поскольку режим обрабатывается на уровне приложения, а не на уровне документа, он блокируется для всех документов». Это означает, что решение, размещенное здесь, не будет работать. (@ Comintern)

  • Такое поведение является преднамеренным, а не ошибкой (@SiddharthRout), нет возможности изменить режим редактирования Excel из PowerPoint, если у пользователя открыто окно Excel в режиме редактирования, невозможно запустить команду «AddOLEObject» из Силовая установка.

Решение

Что я сделал, так это создал специальный случай в моем обработчике ошибок для вывода сообщения:

Не удалось подключиться к Excel (ошибка -2147467259). Убедитесь, что Excel установлен и не находится в «режиме редактирования». Закройте все открытые копии Excel и повторите попытку.

Остальное будет зависеть от пользователя ...

person David Rogers    schedule 29.07.2016