Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как из-под макроса запустить стороннюю прогу?

248
07 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Я хочу при выполнении макроса запустить программу верстки (открыть файл для работы). Чтобы пока макрос выполняется, "там" бы уже открывался документ, в который я и буду вставлять результаты работы макроса.
Пока для теста написал так:

[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), окно с запущенной программой остается все время активным? а мне бы надо опять вернуться в Ворд, из-под которого я и запускал.
251
07 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
vbMinimizedNoFocus (то есть 6) должно помогать. Не могу сказать, почему у тебя так. Кода-то нету...
248
07 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Вот код:
Код:
'RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe D:\Down\CPK\Slovar Macros\Slovar.pmd", 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]

Т.е. главная задача, что бы в открываемом приложении открылся и нужный документ.
Короче говоря, как повторить мои ручные действия:
  1. Запускаю в Ворде макрос.
  2. Пока он крутится, переключаюсь в Total Commander и давлю Enter на нужном мне документе и он открывается (ессно).
  3. В конце макроса активируется Ворд, выскакивает окошко "Готово". Я жму ОК. Ворд сворачивается и активным вновь становится программа верстки. И уже в ней я вставляю содержимое буфера, который заполнился в результате выполнения макроса.
Итак, хотелось бы из-под макроса выполнить пункт 2. Остальное крутится без претензий.
251
07 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Попробуй подавить пробелы в пути к файлу. ПРОблы могуть мешать (Program Files). Например,, сделай что-т типа того: """c:\program files\prog.exe"""
248
07 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Цитата: SkyM@n
Попробуй подавить пробелы в пути к файлу. ПРОблы могуть мешать (Program Files). Например,, сделай что-т типа того: """c:\program files\prog.exe"""


Не понял, а в чем тут секрет? В тройных кавычках? Пробел в программ Филес все равно остается. ТЕм более, что его же убрать нельзя (кроме как перестановкой всего запускаемого приложения).

251
07 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Для примера, запусти cmd.exe и напиши там например это: c:\Program Files\Windows Media Player\wmplayer.exe. Ты увидишь, что ничего не запустится. А если сделать вот так: "c:\Program Files\Windows Media Player\wmplayer.exe" (т.е. в кавычках), то мы увидим загрузившиеся мелкософтовское приложение (если конечно оно у тебя есть :) ). То есть вывод: кавычки обязательны и именно в комманду shell это все надо передать в кавычках. Как? Я написАл выше. Ведь в Visual Basic'е чтобы написать знак кавычки в других кавычках - надо их написать вот так: "" (то есть, двойные). Напрример, в языке PHP кавычки ставятся проще: 'сейчас будет кавычка"конец'. Или вот так: "Сейчас будет кавычка\"конец". Знаком \ (обр. слэш) мы экранировали ее. В барсике такого, к сожалению, нет. (В барсике много чего нет, ггг). Но это ппц.
Пробуй заключать в двойные кавычки весь путь.
248
07 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Сделал вот таким позорным способом:
 
Код:
RetVal = Shell("C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe", 6)
AppActivate "Adobe PageMaker", True
SendKeys "%fo", True 'вызвали окно открытия файла
doc$ = "D:\Down\CPK\Slovar_Macros\Slovar.pmd"
SendKeys doc$ & "{Enter}", True 'вписали название дока и нажали Enter
Application.WindowState = wdWindowStateMinimize

:o
405
11 сентября 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
... Так вот если дополнительно указываю рабочий файл, то программа верстки пишет cant open... (хотя если из-под PageMaker'a открывать, то такой файл, ессно открывается.)...


Причина ошибки, как уже и заметил SkyM@n, в наличии "неудобного" пробела. Только вот "неудобным" он является не в пути к приложению, а в пути к документу.
Вот нормально работающий пример:

[color=blue]Shell "C:\Program Files\Adobe\PageMaker 7.0\Pm70.exe " & """D:\Down\CPK\Slovar Macros\Slovar.pmd""", vbMinimizedNoFocus[/color]

Кроме того, можно воспользоваться средствами WSH:

 
Код:
Sub Example()
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.
248
11 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Не пойму в чем дело, но теперь документ открывается такой командой
[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.

Еще раз спасибо, потому что пока работает.
251
11 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Dmitry2064
А на WHS говорит, что, мол, Виндузу не удалось найти такой-то файл. Хотя, ессно, расширение зарегистрировано, как файл Page'a.


C:\WINDOWS\system32\Wscript.exe
------------
Windows Shell Host

248
11 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Цитата: SkyM@n
C:\WINDOWS\system32\Wscript.exe



А как же быть, если у меня это сидит в c:\XP\...?

251
11 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Dmitry2064
А как же быть, если у меня это сидит в c:\XP\...?


%SYSTEMROOT%\System32:
path$=environ$("windir") & "\system32\wscript.exe"

405
12 сентября 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
Не пойму в чем дело, но теперь документ открывается такой командой
[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"

Цитата: Dmitry2064
... А на WHS говорит, что, мол, Виндузу не удалось найти такой-то файл...


1. Не WHS, а WSH (Windows Script Host).
2. Я привёл пример кода, предназначенного для использования именно в качестве макроса, а не в качестве сценария. Поэтому знать, где расположен файл wscript.exe, не требуется.
3. Если хотите обнаружить причину ошибки, то "пройдитесь" отладчиком по этому примеру (с Вашими именами приложения и публкации и путями к ним, разумеется) и сообщите:
- на какой строке останавливается выполнение макроса;
- какое именно сообщение выдаётся.

248
12 сентября 2007 года
Dmitry2064
590 / / 06.12.2006
Цитата:
А так пробовали:
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 оч. полезно знать. Мало ли когда пригодится. Спасибо большое.

405
12 сентября 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
... Значит [COLOR="Red"]наличие пробелов в пути к исполняемому файлу [COLOR="DarkRed"]не критично[/COLOR], а к рабочему - [COLOR="DarkRed"]критично[/COLOR]. [/COLOR] Интересная зависимость (записать на скрижалях истории)...


Всё очень просто (и на скрижалях истории давно записано) :
- все пробелы, стоящие в строке описания пути к приложению, воспринимаются ОС как часть "длинного имени", поэтому нормально обрабатываются;
- первый пробел, стоящий после имени приложения, уже воспринимается как символ-разделитель между именем приложения и списком передаваемых приложению аргументов, а все последующие пробелы - как разделители между аргументами.
- следовательно, пробел в названии каталога Slovar Macros, делит строку с описанием пути к документу на два строковых аргумента, передаваемых приложению.

Цитата: Dmitry2064
... А с VHS (ой, WSH) все открывается и без учета есть/нет пробел в пути рабочего файла. Т.е. все работает...


У метода ShellExecute просто другой алгоритм работы по сравнению с функцией Shell(). Он, например, заведомо "знает", что строка с пробелами, переданная ему в качестве третьего параметра, всего-навсего является описанием пути к документу.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог