VBA: Не работает команда Shell

  • Автор темы Автор темы CrazyMaxTM
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CrazyMaxTM

Участник
Топикстартер
Сообщения
15
Реакции
0
Я пишу макрос на VBA для CorelDraw 12. В этом макросе необходимо из корела запускать другое приложение, так вот у меня почему-то не работает команда Shell которая, как я понимаю, именно для этого и предназначена. Так например эта тестовая программа должна запускать калькулятор, но она ничего не запускает хотя и не выдает сообщений об ошибке.

Sub RunCalc()
VBA.Shell "C:\WINDOWS\system32\calc.exe", vbMaximizedFocus
End Sub

Нутром чую что это возможно какая-то настройка в системе безопасности: установил уровень Security в Low, поставил галку в Trust all installed GMS modules, убрал галку в Delay load VBA – ничего не помогает. Может это на уровне операционной системы (у меня Win XP) или антивируса (Kaspersky Personal Pro) что-то блокируется?
Сами мы не местные, помогите кто чем может.

CrazyMaxTM
 
Ответ: Не работает команда Shell

Kav и др.антивирусы в том числе и возможно фаерволы могут блокировать ActiveX доступ из макросов, в частности доступ к WinAPI через который видимо и осуществляется вызов команды Shell. Надо в настройках антивируса добавить доверенное приложение - CorelDraw, однажды успешно делал с kav5 и 6 вроде, но так как не пользуюсь антивирусами (Опера рулит), то не подскажу где это там
 
Ответ: Не работает команда Shell

Записанный в книге макрос может не работать по причине установленного антивируса. Например, установленный "Kaspersky Office Guard", входящий в состав "Антивирус Касперского", начисто отключает все вызовы VBA.


этот пример в Corel и Word работает.
 
Ответ: Не работает команда Shell

MetroidZ сказал(а):
этот пример в Corel и Word работает.

У Вас может и работает. А я пробовал не на одном компьютере - ни в какую ! На трех из них стоит Win XP, на одном Win 2000 Prof. Правда антивирус везде одинаковый!
По поводу того чтобы настроить Corel как доверенное приложение - обязательно попробую только найти бы где это настраивается!?
 
Ответ: VBA: Не работает команда Shell

CrazyMaxTM сказал(а):
Я пишу макрос на VBA для CorelDraw 12. В этом макросе необходимо из корела запускать другое приложение, так вот у меня почему-то не работает команда Shell которая, как я понимаю, именно для этого и предназначена.
Можно через API:
Код:
'  Объявляем функцию в Declaration:
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory _
As String, ByVal nShowCmd As Long) As Long

' Теперь ее можно спокойно юзать:
ShellExecute 0, "open",  "C:\WINDOWS\system32\calc.exe", "", "", 1
Однако в Вашем случае, на сколько я знаком с поставленными целями, этот вариант решения не самый лучший. Ибо файл указанный в пути будет открываться в той программе, коя установлена по умолчанию. А в большинстве случаев картинки у пользователей открываются в каких-нить просмотрщиках, а не в фотошопе. Поэтому лучше прибегнуть к библиотекам шопа. Например так:
Код:
Public Sub OpenInPhotoShop(myFullPathName As String)
Dim appRef
Dim docRef
If Dir(myFullPathName) = "" Then 'Если указанный в пути файл не существует то
          Msgbox "Нету файла"
Else
          Set appRef = CreateObject("Photoshop.Application")
          appRef.BringToFront ' Развернуть окно шопа
          Set docRef = appRef.Open(myFullPathName)  ' Открыть файл в шопе
End if
End Sub
ЗЫ Может поставите себе какую-нить другую задачу? Как бы упорство в этом вопросе безусловно во благо, однак зачем изобретать велосипед? Есть ведь еще куча всяких других задач. lev к примеру целых две подкинул, в соседнем топике, можете сами че-нить придумать...
 
Ответ: VBA: Не работает команда Shell

ЗЫ Может поставите себе какую-нить другую задачу? Как бы упорство в этом вопросе безусловно во благо, однак зачем изобретать велосипед? Есть ведь еще куча всяких других задач. lev к примеру целых две подкинул, в соседнем топике, можете сами че-нить придумать...

Просто у меня сильные подозрения что чужой код на моих компьютерах работать не будет (были уже печальные примеры). Так вот например данный отрывок кода:

Public Sub OpenInPhotoShop(myFullPathName As String)
Dim appRef
Dim docRef
If Dir(myFullPathName) = "" Then 'Если указанный в пути файл не существует то
Msgbox "Нету файла"
Else
Set appRef = CreateObject("Photoshop.Application")
appRef.BringToFront ' Развернуть окно шопа
Set docRef = appRef.Open(myFullPathName) ' Открыть файл в шопе
End if
End Sub

безусловно очень грамотно написан. Одна проблема - не работает!
А именно не выполняется команда

CreateObject("Photoshop.Application")

в переменной appRef оказывается пустая ссылка “Nothing”, после чего строка

appRef.BringToFront

вызывает ошибку ‘91’ объектная переменная не установлена.

Причина, как я и предполагал, в Антивирусе. Если я его отключаю - все нормально. Попытка добавить программу CorelDraw в список исключений антивируса не дала положительного результата. Может надо добавить в него какую нибудь другую программу? Мне бы взять да поставить другой антивирус (не такой придирчивый) да нельзя - корпоративные правила - у всех стоит одно и то-же чтобы легче было обслуживать.

Зато у меня работает такой код:

Dim obj As New Photoshop.Application
Dim myFullPathName As String
…………
obj.Open myFullPathName
AppActivate (obj.Name)

и никаких проблем с антивирусом при этом не возникает!
Конечно можно взять чужую программу и переделать в ней то что не работает, но кто хоть раз пытался это сделать - знает что легче новую написать.
 
Ответ: VBA: Не работает команда Shell

C трудом верится, что нет какой нибудь настройки/патча и т.п. для KAV.
Надо копать не в направлении - чем заменить команду, чем заменить антивирус, а именно искать регулировки макросов в антивирусе.
Какая версия KAV ?

Работа с постоянной проверкой макросов в Антивирусе Касперского 5.0 для Windows Workstations
http://www.kaspersky.ru/support/wks5_MP4/macro?qid=180593786

Антивирус Касперского 5.0 для Windows Workstations содержит в своем составе компонент, занимающийся проверкой VBA-макросов, содержащихся в документах формата MS Office, и носящий название Kaspersky Office guard. Данный компонент работает согласно уровням защиты, которые Вы меняете в настройках Постоянной проверки макросов (Уровни защиты постоянной проверки макросов в Антивирусе Касперского 5.0 для Windows рабочих станций). При обнаружении потенциально опасного макроса Антивирус Касперского 5.0 для Windows рабочих станций может либо разрешить его выполнение, либо запросить действие у пользователя, либо заблокировать выполнение подозрительного макроса, либо полностью блокировать скрипт, в данный момент исполняемый и содержащий этот подозрительный макрос - все зависит от установленных Вами настроек Постостоянной проверки VBA-макросов (Kaspersky Office guard). Для изменения настроек Постоянной защиты VBA-макросов Вам необходимо проделать следующие действия:

откройте главное окно Антивируса Касперского 5.0 для Windows рабочих станций
переключитесь на закладку Настройка...
 
Ответ: VBA: Не работает команда Shell

Кстати я смутно вспоминаю, что надо добавлять именно свой макрос в доверенные макросы, а не только CorelDraw.exe в приложения
 
Статус
Закрыто для дальнейших ответов.