Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Выяснить открыта ли книга Excel и если открыта, подключится к ней

Ответить
Настройки темы
PowerShell - [решено] Выяснить открыта ли книга Excel и если открыта, подключится к ней

Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить PM | Цитировать


Изменения
Автор: corbis
Дата: 27-11-2014
Вот такая возникла заморока и никак не найду способ реализации.

С выяснением того, что книга открыта я придумал такой вариант:

Код: Выделить весь код
(Get-Process excel | Select-Object -Property MainWindowTitle) -match "Заказы_2014.xls"
Но вот как подключится к открытой книге не пойму. Вариант с закрытием и последующим открытием через скрипт не подходит.
Если кто-то с книгой работает, прерывать работу нельзя.

Код: Выделить весь код
$xl = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')
$xl.Workbooks
Такой код списка открытых книг не выдает, хотя автор привел этот пример именно для этой цели.
Намучался с поиском ответа, прошу помощи.

Отправлено: 02:13, 27-11-2014

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


А если не открыта — тогда что делать?

Не знаю, как у Вас, а у нас — выдаёт:
Скрытый текст
Код: Выделить весь код
$xl = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')
$xl.Workbooks | ForEach-Object -Process {$_.FullName}
Цитата:
Код: Выделить весь код
E:\Песочница\0410\Книга1.xls


Ещё вариант: 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
Благодарности: 13

Профиль | Отправить 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}
выдает:

Код: Выделить весь код
C:\Users\User\Test\Заказы.xls
Может это уже проблемы Windows? Win 8.1, Office 2010
Проверил на Win 7 и Office 2007. Та же картина.

Последний раз редактировалось corbis, 27-11-2014 в 13:43.


Отправлено: 13:04, 27-11-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата corbis:
У меня вышеприведенный код выдает ошибку:
Цитата:
Исключение при вызове "GetActiveObject" с "1" аргументами: "Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"
строка:1 знак:1
+ $xl = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : COMException
Это в случае, если файл открыт как обычно. »
Почитайте:
Форумы caduser.ru
When CoCreateInstance returns 0x80080005 (CO_E_SERVER_EXEC_FAILURE) - Antimail - Site Home - MSDN Blogs
и попробуйте проверить аналогичную методику с try и повторным запросом. У меня, кстати, в отличие от Вас, тоже XP (как у автора по первой ссылке), и проблема тоже не воспроизводится.

Цитата corbis:
Может это уже проблемы Windows? Win 8.1, Office 2010 »
Теоретически всё может быть. Я лично сталкивался с различным поведением одной и той же версии PowerShell на разных ОС в казалось бы весьма простой ситуации.

P.S. Поройтесь ещё здесь: powershell GetActiveObject Exception from HRESULT 0x800401E3 MK_E_UNAVAILABLE - Поиск в Google, может чего найдёте.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:14, 27-11-2014 | #4


Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


corbis, если где-нибудь, когда-нибудь, в будущем наткнётесь на объяснение причин возникновения данной проблемы под новыми ОС и методами их решения — не сочтите за труд, отпишитесь здесь.

Отправлено: 15:56, 27-11-2014 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Выяснить открыта ли книга Excel и если открыта, подключится к ней

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Если папка уже открыта в проводнике, повторное ее открытие уменьшает окно на 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




 
Переход