Войти

Показать полную графическую версию : [решено] Excel invisible, но UserForm visible


corbis
29-11-2014, 18:44
Скрипт запускается планировщиком и копирует данные между книгами 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
Но при работе на экране появляется форма с кнопкой. Excel 2010.
Это код для формы. Собственно, когда скрипт начинает работать с листом, показывается форма. »
Для чего показывается?

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

Iska
29-11-2014, 22:53
corbis, непонятно, что таки Вам нужно.

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

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

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

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

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

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

corbis
30-11-2014, 01:33
119535

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

Iska
30-11-2014, 01:54
corbis, спасибо, ясно. Попробуйте задать свойство приложения .EnableEvents (http://msdn.microsoft.com/en-us/library/office/ff821508%28v=office.15%29.aspx) равным «$false» сразу после создания экземпляра объекта «Excel.Application», наподобие:

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

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

corbis
30-11-2014, 02:27
Спасибо. Проблему устраняет, но не ясно как управлять видимостью формы через comObject. А может и нельзя..

Iska
30-11-2014, 03:00
но не ясно как управлять видимостью формы через comObject. »
А оно Вам нужно, в скрипте-то?

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

Iska
30-11-2014, 13:03
corbis, это возможно, но с существенным понижением безопасности, поскольку требует разрешения на программный доступ к проекту VBA.

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

Iska
30-11-2014, 16:55
corbis, вот это — How To Create and Call an Excel Macro Programmatically from VB (https://support.microsoft.com/kb/194611/en-us):
$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 (http://support.microsoft.com/kb/282830/ru).

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

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

$oVBComponent.Visible = $True

или

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

Iska
30-11-2014, 17:41
corbis, в версиях до Office XP не было запрета программного доступа к проекту. Но расплодилось много макровирусов — и прикрыли лавочку.

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




© OSzone.net 2001-2012