Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Excel invisible, но UserForm visible (http://forum.oszone.net/showthread.php?t=291830)

corbis 29-11-2014 18:44 2437333

Excel invisible, но UserForm visible
 
Скрипт запускается планировщиком и копирует данные между книгами Excel.
Работает в режиме Hidden. Excel соответственно .Visible = $False
Но при работе на экране появляется форма с кнопкой. Excel 2010.
Это код для формы. Собственно, когда скрипт начинает работать с листом, показывается форма.

Код:

Private Sub Worksheet_Activate()
    FormSend.Show
End Sub

Private Sub Worksheet_Deactivate()
    FormSend.Hide
End Sub

Вот не могу найти решение, как эту форму скрыть. Или выгрузить совсем на время работы скрипта.

Iska 29-11-2014 21:48 2437412

Цитата:

Цитата corbis
Но при работе на экране появляется форма с кнопкой. Excel 2010.
Это код для формы. Собственно, когда скрипт начинает работать с листом, показывается форма. »

Для чего показывается?

corbis 29-11-2014 22:37 2437437

Форма нужна, чтобы пользователь подтвердил действие.
Я уже нашел вариант обхода, но интересно найти решение. Полагаю, что оно есть и моих знаний недостаточно.
Вот и решил спросить.
Должно же быть где-то в comОбъекте управление userform.

Iska 29-11-2014 22:53 2437441

corbis, непонятно, что таки Вам нужно.

У Вас есть рабочая книга. В ней содержится приведённый выше код. Этот код при работе Вашего скрипта вызывает отображение формы, которая требует интерактивного вмешательства, что мешает автоматизированной работе из-под Планировщика. Правильно я понимаю ситуацию? Если — «да», покажите Ваш код.

P.S. Если — «нет», то всё равно покажите код, и объясните ещё раз.

corbis 29-11-2014 23:18 2437451

Скрипт работает, когда за компом никого нет и никому не мешает. Просто сортирует и переносит данные.
И делает это в инвизе. Ни окна PS нет, ни Excel. Только форма появляется. Что забавно.

Форма, по сути это одна кнопка, нужна, когда с книгой работает пользователь в течение дня.
Выделил строку - нажал кнопку.

Меня интересует, есть ли у comObject excel.application возможность управления userform. А конкретнее показывать/прятать.
В VBA это именно тот код, который я привел выше. Можно ведь написать в скрипт $excel. visible = $false и excel исчез. Вот и с этой
кнопкой так же хочу, только не знаю как.

Iska 30-11-2014 00:34 2437476

Цитата:

Цитата corbis
Скрипт работает, когда за компом никого нет и никому не мешает. Просто сортирует и переносит данные. »

Повторяю второй раз: покажите Ваш код. Он нужен для того, чтобы попытаться воспроизвести Вашу ситуацию и попытаться с ней разобраться. Мы можем ещё долго перебрасываться ничего не значащими фразами, но это ничего не изменит. Покажите Ваш код. Выложите исходную рабочую книгу в объёме, достаточном для отображения указанной формы при работе Вашего кода.

corbis 30-11-2014 01:33 2437493

Вложений: 1
  • Test.rar (0 bytes, скачиваний: 0)
Файл 119535

Часть строк зарэмил, чтобы можно было воспроизвести это многократно; часть убрал, иначе пришлось бы заливать кучу папок и файлов, по которым происходит выборка. Кнопку видно, если просто запустить скрипт.

Iska 30-11-2014 01:54 2437496

corbis, спасибо, ясно. Попробуйте задать свойство приложения .EnableEvents равным «$false» сразу после создания экземпляра объекта «Excel.Application», наподобие:
Код:


$oExcel = New-Object -ComObject Excel.Application
$oExcel.EnableEvents = $false

$oWorkbook = $oExcel.Workbooks.Open($sPathOrd)


corbis 30-11-2014 02:27 2437504

Спасибо. Проблему устраняет, но не ясно как управлять видимостью формы через comObject. А может и нельзя..

Iska 30-11-2014 03:00 2437505

Цитата:

Цитата corbis
но не ясно как управлять видимостью формы через comObject. »

А оно Вам нужно, в скрипте-то?

corbis 30-11-2014 12:10 2437552

В этом нет. Но возник вопрос и нужно найти ответ. Это в целях повышения самообразованности. Но это уже лирика, конечно.
Еще раз спасибо.

Iska 30-11-2014 13:03 2437569

corbis, это возможно, но с существенным понижением безопасности, поскольку требует разрешения на программный доступ к проекту VBA.

corbis 30-11-2014 14:41 2437597

Значит, все таки, возможно. Если не трудно, расскажите, пожалуйста. Я почти со всем разобрался, что касается управления Excel, а этот вопрос попал в категорию "временно не решенные".

Iska 30-11-2014 16:55 2437640

corbis, вот это — How To Create and Call an Excel Macro Programmatically from VB:
Код:

$oExcel = New-Object -ComObject "Excel.Application"

$oExcel.Visible = $true
$oExcel.EnableEvents = $false

$oWorkbook = $oExcel.Workbooks.Open("E:\Песочница\0411\Test\Заказчики 2014.xls")

$oVBComponent = $oWorkbook.VBProject.VBComponents.Add(1)

$oVBComponent.Name = "MyModule"
$oVBComponent.CodeModule.AddFromString(@"
Public Sub MyProc()
    FormSend.Show
End Sub
"@)

$oExcel.Run("MyProc")

должно работать после разрешения программного доступа к проекту VBA: Запрещен программируемый доступ к проекту на VBA для Office.

P.S. Не забудьте вернуть настройку безопасности вобрат.

corbis 30-11-2014 17:28 2437657

Ага, ну, видимо поэтому я и нашел сразу прямого управления модулями. Их просто нет из соображений безопасности.
Я-то предполагал, что возможно это делать не через код VBA, а например:

Код:

$oVBComponent.Visible = $True
или

Код:

$oVBComponent.Visible()
$oVBComponent.Hide()


Iska 30-11-2014 17:41 2437661

corbis, в версиях до Office XP не было запрета программного доступа к проекту. Но расплодилось много макровирусов — и прикрыли лавочку.

Цитата:

Цитата corbis
Я-то предполагал, что возможно это делать не через код VBA, а например: »

Не предусмотрено. Коллекция форм принадлежит не объекту «Excel.Application», а глобальной области видимости VBA — VBA.Global, посему прямого доступа к экземплярам объектов форм из объекта «Excel.Application» нет.


Время: 21:06.

Время: 21:06.
© OSzone.net 2001-