Как из-под макроса запустить стороннюю прогу?
Пока для теста написал так:
[COLOR="Navy"]RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe _ D:\Down\CPK\Slovar Macros\Slovar.pmd", 6)
[/COLOR]
Так вот если дополнительно указываю рабочий файл, то программа верстки пишет cant open... (хотя если из-под PageMaker'a открывать, то такой файл, ессно открывается.) Т.е. получается что можно запустить только голое приложение без документа?
Переменная RetVal взята из примера в Help'e. На самом деле она мне не нужна. И еще вопрос. Какой бы аргумент windowstyle я не писал в конце Shell (1,2,3,4,5,6), окно с запущенной программой остается все время активным? а мне бы надо опять вернуться в Ворд, из-под которого я и запускал.
RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe", 6)
'RetVal = Shell("D:\Down\CPK\Slovar Macros\Slovar.pmd", 6)
[COLOR="DarkBlue"]''нормально работает только отремленная строка, остальные ругаются, _
что нет такого дока, "говорит" верстка (1-я стр.) или ошибка _
в пути "говорит" VB (3-я стр.) [/COLOR]
Application.WindowState = wdWindowStateMaximize [COLOR="DarkGreen"]'вернули фокус в Ворд[/COLOR]
[COLOR="DarkGreen"]'набор инструкций, например какой-то цикл (для отладки)[/COLOR]
For i = 1 To 10000
X = X + 1
Next i
MsgBox X
Application.WindowState = wdWindowStateMinimize [COLOR="DarkGreen"]'т.е. свернули Ворд _
и фокус перешел на запущенное приложение[/COLOR]
Т.е. главная задача, что бы в открываемом приложении открылся и нужный документ.
Короче говоря, как повторить мои ручные действия:
- Запускаю в Ворде макрос.
- Пока он крутится, переключаюсь в Total Commander и давлю Enter на нужном мне документе и он открывается (ессно).
- В конце макроса активируется Ворд, выскакивает окошко "Готово". Я жму ОК. Ворд сворачивается и активным вновь становится программа верстки. И уже в ней я вставляю содержимое буфера, который заполнился в результате выполнения макроса.
Не понял, а в чем тут секрет? В тройных кавычках? Пробел в программ Филес все равно остается. ТЕм более, что его же убрать нельзя (кроме как перестановкой всего запускаемого приложения).
Пробуй заключать в двойные кавычки весь путь.
AppActivate "Adobe PageMaker", True
SendKeys "%fo", True 'вызвали окно открытия файла
doc$ = "D:\Down\CPK\Slovar_Macros\Slovar.pmd"
SendKeys doc$ & "{Enter}", True 'вписали название дока и нажали Enter
Application.WindowState = wdWindowStateMinimize
:o
Причина ошибки, как уже и заметил SkyM@n, в наличии "неудобного" пробела. Только вот "неудобным" он является не в пути к приложению, а в пути к документу.
Вот нормально работающий пример:
[color=blue]Shell "C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe " & """D:\Down\CPK\Slovar Macros\Slovar.pmd""", vbMinimizedNoFocus[/color]
Кроме того, можно воспользоваться средствами WSH:
Dim objApp As Object
Const strFileName = "Slovar.pmd"
Const argToOperation = ""
Const strPathToFile = "D:\Down\CPK\Slovar Macros"
Const strOperation = "open"
Const showMode = vbMinimizedNoFocus
Set objApp = CreateObject("Shell.Application")
objApp.ShellExecute strFileName, argToOperation, strPathToFile, strOperation, showMode
End Sub
Однако для нормальной работы этого способа необходимо, чтобы файлы с расширением .PMD были зарегистрированы за приложением PageMaker.
[COLOR="Navy"]Shell "C:\Program Files\Adobe\PageMaker 7.0\PM70.exe C:\Verstka\Slovar.PMT"[/COLOR]
А вот так выглядела первоначальная команда, с которой и возникла тема обсуждения:
[COLOR="DarkGreen"]RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe D:\Down\CPK\Slovar Macros\Slovar.pmd", 6)
[/COLOR]
Проверил: скобки не влияют, наличие переменной тоже не влияет и буква диска тоже, и пробелы почему-то не влияют (все перепробовал, что бы получить сбой, бесполезно, открывается "на раз" - просто беда :mad: ).
Может зависит от машины, на которой пускать? Хотя отлаживаю вроде на одном и том же ноутбуке.
Вобщем, спасибо большое за разъяснения. И про "вложенные кавычки" тоже понял (хотя и подозревал :) ).
А на WHS говорит, что, мол, Виндузу не удалось найти такой-то файл. Хотя, ессно, расширение зарегистрировано, как файл Page'a.
Еще раз спасибо, потому что пока работает.
C:\WINDOWS\system32\Wscript.exe
------------
Windows Shell Host
А как же быть, если у меня это сидит в c:\XP\...?
%SYSTEMROOT%\System32:
path$=environ$("windir") & "\system32\wscript.exe"
[COLOR="Navy"]Shell "C:\Program Files\Adobe\PageMaker 7.0\PM70.exe C:\Verstka\Slovar.PMT"[/COLOR]
А вот так выглядела первоначальная команда, с которой и возникла тема обсуждения:
[COLOR="DarkGreen"]RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe D:\Down\CPK\Slovar Macros\Slovar.pmd", 6)
[/COLOR]
Проверил: скобки не влияют, наличие переменной тоже не влияет и буква диска тоже, и пробелы почему-то не влияют (все перепробовал, что бы получить сбой, бесполезно, открывается "на раз" - просто беда)...
А так пробовали:
Shell "C:\Program Files\Adobe\PageMaker 7.0\PM70.exe C:\Ver stka\Slovar.PMT"
1. Не WHS, а WSH (Windows Script Host).
2. Я привёл пример кода, предназначенного для использования именно в качестве макроса, а не в качестве сценария. Поэтому знать, где расположен файл wscript.exe, не требуется.
3. Если хотите обнаружить причину ошибки, то "пройдитесь" отладчиком по этому примеру (с Вашими именами приложения и публкации и путями к ним, разумеется) и сообщите:
- на какой строке останавливается выполнение макроса;
- какое именно сообщение выдаётся.
Shell "C:\Program Files\Adobe\PageMaker 7.0\PM70.exe C:\Ver stka\Slovar.PMT"
Докладываю. Если путь к рабочему файлу содержит пробел, то РМ пишет cant open..., а если без пробелов, то пожалуйста, все открывается.
Значит [COLOR="Red"]наличие пробелов в пути к исполняемому файлу [COLOR="DarkRed"]не критично[/COLOR], а к рабочему - [COLOR="DarkRed"]критично[/COLOR]. [/COLOR] Интересная зависимость (записать на скрижалях истории) :cool:
А с VHS (ой, WSH) все открывается и без учета есть/нет пробел в пути рабочего файла. Т.е. все работает.
Другое дело, что мне надо открывать 10-15 разных документов, поэтому будет проще использовать вар-т с Shell, а не с WSH. Но для сведений про WSH оч. полезно знать. Мало ли когда пригодится. Спасибо большое.
Всё очень просто (и на скрижалях истории давно записано) :
- все пробелы, стоящие в строке описания пути к приложению, воспринимаются ОС как часть "длинного имени", поэтому нормально обрабатываются;
- первый пробел, стоящий после имени приложения, уже воспринимается как символ-разделитель между именем приложения и списком передаваемых приложению аргументов, а все последующие пробелы - как разделители между аргументами.
- следовательно, пробел в названии каталога Slovar Macros, делит строку с описанием пути к документу на два строковых аргумента, передаваемых приложению.
У метода ShellExecute просто другой алгоритм работы по сравнению с функцией Shell(). Он, например, заведомо "знает", что строка с пробелами, переданная ему в качестве третьего параметра, всего-навсего является описанием пути к документу.