Страницы: 1
RSS
Открытие нужной версии Excel
 
Добрый день, знатоки Excel!
Подскажите пжл можно ли из VBA Excel открыть нужную версию Excel (2003, 2007 или 2010)?
Эти версии не очень дружат между собой и зачастую портят файлы (например файл 2003 после открытия и сохранения в 2010, но в формате 2003, может местами глючить). Поэтому и есть потребность в открытии конкретной необходимой версии Excel (которые конечно же установлены на компе).

Стандартный код открытия нового excel открывает конечно же подобный себе excel (из 2003 открывает 2003, из 2010 открывает 2010).
dim ex as new excel.application
set ex=createobject("excel.application")

А как из 2010 открыть 2003?

Всем неравнодушным заранее СПАСИБО.
 
Скорее всего через Shell запуск файла EXCEL.EXE.
После этого можно попробовать обратиться через GetObject(по логике GetObject обращается к последнему запущенному).
Не пробовал, поэтому все вышесказанное лишь измышления.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Excel 2003 можно заказать так:

Код
Sub test()
  With CreateObject("Excel.Application.11")
    .Visible = True
    .Workbooks.Add
  End With
End Sub
 
 
ZVI, я уже пробовал так делать. Хоть из 2003, хоть из 2010 у меня всё равно запускается 2010 (

попробовал как The_Prist предложил - через shell открыть нужный excel получается, но как теперь обращаться к этому новому excel, чтобы необходимые изменения в нужном файле делать в нем?

Спасибо.
Изменено: Сергей М - 17.12.2013 09:51:57 (попробовал предложения )
 
Через GetObject не пробовали?
Код
GetObject(, "Excel.Application")

GetObject(, "Excel.Application.11")

Сначала запустить через Shell, а потом через GetObject обратиться к приложению. Согласно уверениям Microsoft GetObject обращается к последнему запущенному экземпляру. Правда, не знаю как это на разных версиях работает(да и вообще, не все о чем они пишут работает).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Помнится, я пробовал GetObject на файл, запущенный в другом процессе - выдал ошибку. Открывает либо закрытый файл, либо файл, запущенный в том же процессе.
Но долго не испытывал. Один раз попробовал.
 
у меня нормально открывает 2003 из 2010го

что интересно, по завершению макроса, закрывает открытый в нем экземпляр приложения автоматически
Живи и дай жить..
 
ps - по методу ZVI
Живи и дай жить..
 
The_Prist, вот что написано у microsofta (нашел после продолжительных поисков) "Если запущено несколько экземпляров Microsoft Excel, GetObject присоединяется к экземпляру, запущенному первым. Если первый экземпляр будет закрыт, другое обращение к GetObject присоединится ко второму запущенному экземпляру приложения и так далее." http://support.microsoft.com/kb/288902  Что мне не подходит.

Но, там же есть и путь решения проблемы:
Присоединить можно и конкретный экземпляр приложения, если знать имя открытого в этом экземпляре документа. Например, если экземпляр Excel запущен с открытой книгой под названием Book2, с помощью следующего кода можно успешно присоединить этот экземпляр в том случае, если он был запущен не первым:

Set xlApp = GetObject("Book2").Application


Т.е. теперь привязаться к этому файлу я могу. Но я обнаружилась новая проблема )  
Файл при загрузке через shell (shell "весь путь для нужного\excel.exe " & """" & имя_файла & """"), как я понимаю, не всегда успевает загрузиться. Если делать пошагово и ответить на выскакивающие вопросы об ограниченном доступе к файлу, то всё ОК.
но при работе макроса в обычном режиме пока вопрос о доступе висит макрос идет дальше и getobject определяет не тот экземпляр приложения.

Т.е. нужно заставить макрос затормозить (Doevents что-то не помог) пока не будет ответа на вопрос при открытии файла при помощи shell.
Ну или заставить открыться файл без этих вопросов.  

Что посоветуете?
 
Application.OnTime, Application.Wait

P.S. да, это я попутал - GetObject обращается к первому экземпляру.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, с Application.Wait получилось.
Спасибо.
Страницы: 1
Читают тему
Наверх