|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Выяснить открыта ли книга Excel и если открыта, подключится к ней |
|
PowerShell - [решено] Выяснить открыта ли книга Excel и если открыта, подключится к ней
|
Пользователь Сообщения: 114 |
Профиль | Отправить PM | Цитировать
Вот такая возникла заморока и никак не найду способ реализации.
С выяснением того, что книга открыта я придумал такой вариант: Но вот как подключится к открытой книге не пойму. Вариант с закрытием и последующим открытием через скрипт не подходит. Если кто-то с книгой работает, прерывать работу нельзя. Такой код списка открытых книг не выдает, хотя автор привел этот пример именно для этой цели. Намучался с поиском ответа, прошу помощи. |
|
Отправлено: 02:13, 27-11-2014 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать А если не открыта — тогда что делать?
Не знаю, как у Вас, а у нас — выдаёт: Скрытый текст
Ещё вариант: Converting VBScript's GetObject Function. Что-то наподобие…
function Release-Ref ($ref) { ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0) [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers() } [reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic") | Out-Null $oWorkBook = [Microsoft.VisualBasic.Interaction]::GetObject("E:\Песочница\0410\Книга1.xls") $oExcel = $oWorkBook.Application $oExcel.Visible = $true $oExcel.Windows.Item(1).Visible = $true $oWorkBook.Path, $oWorkBook.Name $oWorkBook.Worksheets.Item(1).Cells.Item(1, 1).Value() $oWorkBook.Close($false) $oExcel.Quit() Release-Ref($oWorkBook) Release-Ref($oExcel) |
Отправлено: 04:46, 27-11-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать Если книга закрыта, то открыть через comObject, тогда вообще никаких проблем.
У меня вышеприведенный код выдает ошибку: Исключение при вызове "GetActiveObject" с "1" аргументами: "Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))" строка:1 знак:1 + $xl = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : COMException $xl = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') $xl.Workbooks | ForEach-Object {$_.FullName} Может это уже проблемы Windows? Win 8.1, Office 2010 Проверил на Win 7 и Office 2007. Та же картина. |
Последний раз редактировалось corbis, 27-11-2014 в 13:43. Отправлено: 13:04, 27-11-2014 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата corbis:
Форумы caduser.ru When CoCreateInstance returns 0x80080005 (CO_E_SERVER_EXEC_FAILURE) - Antimail - Site Home - MSDN Blogs и попробуйте проверить аналогичную методику с try и повторным запросом. У меня, кстати, в отличие от Вас, тоже XP (как у автора по первой ссылке), и проблема тоже не воспроизводится. Цитата corbis:
P.S. Поройтесь ещё здесь: powershell GetActiveObject Exception from HRESULT 0x800401E3 MK_E_UNAVAILABLE - Поиск в Google, может чего найдёте. |
|||
Отправлено: 14:14, 27-11-2014 | #4 |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать Супер!! тема с try catch прокатила. Спасибо за наводку. Работает, конечно, с задержкой, но мне в данном случае это безразлично.
Привожу свой вариант, может кому пригодится. [reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic") | Out-Null $oWorkBook = [Microsoft.VisualBasic.Interaction]::GetObject("C:\Users\User\Test\Заказы.xls") try { $oExcel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') $oExcel.Workbooks | ForEach-Object {$_.FullName} } catch [Microsoft.Office.Interop.Excel.Application] { $oExcel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') $oExcel.Workbooks | ForEach-Object {$_.FullName} } $oWorkBook.Path, $oWorkBook.Name $oWorkSheet = $oWorkBook.WorkSheets.Item(1) $oWorkSheet.Cells.Item(1, 1).Value() |
|
Отправлено: 15:37, 27-11-2014 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать corbis, если где-нибудь, когда-нибудь, в будущем наткнётесь на объяснение причин возникновения данной проблемы под новыми ОС и методами их решения — не сочтите за труд, отпишитесь здесь.
|
Отправлено: 15:56, 27-11-2014 | #6 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Если папка уже открыта в проводнике, повторное ее открытие уменьшает окно на 50% | vanvanov | Microsoft Windows 2000/XP | 3 | 14-10-2014 18:00 | |
На Google+ открыта свободная регистрация | OSZone News | Новости информационных технологий | 0 | 22-09-2011 12:30 | |
Microsoft: открыта регистрация на семинары TechDays | OSZone News | Новости и события Microsoft | 0 | 13-10-2010 20:30 | |
[решено] brother 7010 открыта задняя крышка | clop1000 | Непонятные проблемы с Железом | 2 | 10-06-2008 22:57 | |
Семинары Microsoft TechNet Весна 2006 - открыта регистрация | BigMac | Новости и события Microsoft | 8 | 19-03-2006 10:58 |
|