Office365 Excel - Как закрыть окно, если Workbook.close не работает? - PullRequest
0 голосов
/ 05 мая 2020

У меня почему-то есть эта ошибка, когда другое приложение создало книгу Excel, и эта книга не закрывается из Excel. Приложение, создавшее книгу, было заказным приложением SAP. У нас нет доступа к этому приложению, но у нас есть доступ к VBA. Самое безумное - это vba:

myWorkbook.close

Не закрывает книгу и вместо этого сообщает Application Defined or Object Defined error.

В предыдущих версиях Excel вызов myWorkbook.close приводил к сбою VBA sh но оставьте Excel незатронутым, поэтому я уже знаю, что что-то не так, но не уверен, что ... В любом случае, вот некоторые вещи, которые я пытался обойти проблему:

  • On Error Resume Next - просто пропускает закрытие.
  • Закрытие приложения SAP, которое создало окно / книгу Excel.
  • Отправить ключи Alt + F4 - похоже, что отправленные ключи не регистрируются
  • Application.DisplayAlerts = false
  • Application.IgnoreRemoteRequests = false
  • Application.EnableEvents = false
  • CloseWindow(stdAcc.FromExcel().hwnd) вызов CloseWindow функция Win32 API
  • Используйте stdAcc.FromExcel().SendMessage(...) для отправки различных сообщений в окно приложения включая WM_CLOSE, WM_QUIT, WM_DESTROY, ... Это вызвало другое сообщение об ошибке Cannot quit Microsoft Excel.
  • Используйте stdAcc, чтобы щелкнуть красный крест - не кажется возможным, поскольку, по-видимому, красный крест виртуален и не реализует интерфейс IAccessible ...
  • Пользователь вручную нажимает на красный пересекать. Это работает, но грустно, что мы не можем это автоматизировать ...

Изменить:

После нескольких часов поиска кода ABAP я наконец наткнулся на как воспроизвести проблему:

$co = New-Object -ComObject "Excel.Sheet"
$co.parent.visible = $True

Это добавит объект листа к текущему активному экземпляру Excel. Теперь вы можете попытаться закрыть книгу, как указано выше, и все параметры не удастся. Вопрос в том, есть ли способ обойти это?

1 Ответ

0 голосов
/ 05 мая 2020

Я предполагаю, потому что другое приложение имеет «контроль» над книгой. Вам нужно сначала получить эту книгу с помощью сервера автоматизации vba, а затем закрыть ее.

Предполагая, что вы используете vba в excel, вам нужно будет найти книгу, которая есть в настраиваемом приложении SAP. открыт. Если ты знаешь его имя, будет проще! Я предполагаю, что это называется "книга1"

   Dim xlApp As Object
    On Error Resume Next
      Set xlApp = GetObject("Book1").Application
      xlApp.Workbooks("Book1").Close (False) 'false, assuming you don't want to save it
    On Error GoTo 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...