Страницы: 1
RSS
Открыть файл в текущей сессии Excel - VBA (при наличии нескольких сессий), через CreateObject("wscript.shell").Run
 
Всем Привет!
Как можно запустить/открыть файл в текущей сессии Excel (при условии, что открыто несколько сессий, и текущая - не основная (не первая)) через
Код
CreateObject("wscript.shell").Run "...полный_путь\файл...", 1, True 
- (запускается по умолчанию в первой, соответственно файл недоступен в текущей)
Пока не пойму, есть ли вообще такая возможность, т.к. скрипт должен знать из какой сессии я запускаю его и если этот файл открывается Excel (может быть и другие типы файлов), открыть в текущей сессии (где скрипт запускается).
Зайти как-то через ProcessID, но нужно знать, о том какой прогой по умолчанию откроется нужный файл (если Excel - в текущий процесс, другой - по умолчанию как есть).
Есть идеи?
Изменено: bedvit - 24.11.2017 13:02:09
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Есть идеи?
Есть.Перебор процессов и книг в них.
Скрытый текст
 
Doober, поясните, пожалуйста, мысль.
«Бритва Оккама» или «Принцип Калашникова»?
 
Доброе время суток.
У Сергея в цикле While XLMAIN <> 0  перебираются все окна с таким заголовком. Далее кодом
Код
AccessibleObjectFromWindow EXCEL7, &HFFFFFFF0, G, ob  
Set xl = ob.Application 
получается ссылка на очередной объект Excel.Application, который вы можете по xl.Hwnd сопоставить в текущим нужным процессом и через xl.Workbook.Open выполнить открытие файла.
Сергей, спасибо. Уже видел подобный код на просторах, но до ума довести не хватило способностей.
Изменено: Андрей VG - 24.11.2017 18:52:37
 
Сергей и Андрей Спасибо. Возможно, я вас не так понял, но по-моему это немного не то. Дело в том, что через
Код
Workbooks.Open FileName:=...Name... 
и так открывается в нужной сессии (из этой же сессии), а вот через
Код
CreateObject("wscript.shell").Run "...полный_путь\файл...", 1, True
открывается именно в первой сессии (из второй, третий и т.д.). Как к скрипту прикрутить запуск нужного документа в нужной сессиии вот в чем вопрос.
Процесс по-моему можно вычислить еще и так (в топике это свойство отметил, но пока не пользовался):
Код
'Объект WshShell:ProcessID
'Возвращаемое значение: идентификатор запущенного процесса (PID).
'Замечание: только чтение.
'Пример:
 Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("notepad")
WScript.Sleep 2000
WshShell.AppActivate WshExec.ProcessID
WshShell.SendKeys "0123456789"
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Андрей VG написал:
Сергей, спасибо
Не за что.Я тот код с интернета под свои задачи переделал.
 
Виталий, пропустил, что вы выполняете из vbscript. Хотелось бы более подробного изложения задачи. Пока подозреваю, что вам, скорее всего, потребуется написать собственный COM-объект, реализующий код Сергея, которым можно будет воспользоваться для получения нужного экземпляра Excel. Скрипту же передавать Application.Hwnd того процесса Excel, который вы определяете как текущий.
 
Задача выглядит несложной на первый взгляд: из VBA запускать/открывать разные файлы приложением назначенным "по умолчанию" для этого типа файла, соответственно файлы Excel открывать в той же сессии, из которой этот код выполняется. Всё )
«Бритва Оккама» или «Принцип Калашникова»?
 
Тогда, на мой взгляд, анализировать расширение файла. Если это xls, xlsx  и т. д., то открывать через Workbooks.Open, иначе, как у вас, через wscript.shell
 
Пока решение сделал следующее: Сделал возможность выбирать опционально каким из способов открываем файл - 1. Workbooks.Open/Application.RegisterXLL - открывает в текущей сессии в Excel 2. wscript.shell - открывает в первой сессии приложением "по-умолчанию".
Появилась возможность открывать, к примеру txt  - excel-ем или текстовым редактором (к примеру блокнотом)
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх