Вопрос по ms-word, vba, excel-vba, excel – Как открыть конкретную версию Word 2007/2010 в Excel

10

У меня установлены оба Word 2007 и 2010. Мне нужно открыть Word из Excel, но мне нужно указать, какую версию мне нужно открыть в VBA.

Я пробовал позднее связывание

Dim wordApp2007 As Object
Dim wordApp2010 As Object

Set wordApp2007 = CreateObject("Word.Application.12")
wordApp2007.Visible = True
Set wordApp2010 = CreateObject("Word.Application.14")
wordApp2010.Visible = True

но оба открывают Word 2010

Я также пробовал раннее связывание с помощью

Dim wordApp As Word.Application
Set wordApp2007 = New Word.Application
wordApp2007.Visible = True

и установка ссылок на объектную модель Word 12.0, но это по-прежнему открывает Word 2010 enter image description here

Если я зарегистрирую каждую версию Word, используя

"C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /regserver

"C:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /regserver

затем открывается зарегистрированная версия, но затем я не могу открыть незарегистрированную.

Может кто-нибудь помочь и показать мне, как открыть конкретную версию Word в Excel с помощью VBA?

Спасибо

Изменить: Пример кода ....

Option Explicit

Dim wordApp2007 As Word.Application

Sub Word_InfoEarly()
'early binding
Set wordApp2007 = New Word.Application
wordApp2007.Visible = True

    'other Stuff
    Stop

    wordApp2007.Quit
    Set wordApp2007 = Nothing

End Sub


Sub Word_InfoLate()
Dim wordApp2007 As Object
Dim wordApp2010 As Object

    Set wordApp2007 = CreateObject("Word.Application.12")
    wordApp2007.Visible = True
    Set wordApp2010 = CreateObject("Word.Application.14")
    wordApp2010.Visible = True

    'other Stuff
    Stop

    wordApp2007.Quit
    Set wordApp2007 = Nothing
    wordApp2010.Quit
    Set wordApp2010 = Nothing

End Sub
Не могли бы вы опубликовать код, который создает объект, а затем вызывает зарегистрированную версию MS Word? EastOfJupiter
Нет открытого приложения Word 2, оба являются текущей зарегистрированной версией Word. Я хочу открыть 2 приложения, но первое - Word2007, а второе - Word2010. user3357963
Мне не ясно. Я извиняюсь, но мне понравилась вся подпрограмма (ы). Трудно увидеть, что может отсутствовать или быть неправильным без целого блока. EastOfJupiter
Я отредактировал свой вопрос, чтобы показать как объявление, так и назначение объектов. user3357963
У вас загружаются оба документа, но только в одном экземпляре MS Word? Например, если вы минимизируете Word, все ли документы будут минимизированы вместе с ним, или только конкретный документ, оставляющий все остальные документы Word видимыми? EastOfJupiter

Ваш Ответ

5   ответов
3

Это работа вокруг:

TaskID = Shell("C:\Program Files\Microsoft Office\Office12\WINWORD.EXE",vbHide) '2007
'TaskID = Shell("C:\Program Files\Microsoft Office\Office14\WINWORD.EXE",vbHide) '2010
GetObject(,"Word.Application")

Вам также необходимо проверить, открыта ли предыдущая версия слова, или использовать что-то, кроме базовойGetObject активировать окно, иначе нет никаких гарантий, что оно получит правильную версию.

Другой способ - передать имя документа вShell команда, а затемGetObject может быть вызван с именем документа

Использование командной консоли запускает процесс настройки Office, если версия не является текущей зарегистрированной версией. Затем происходит сбой в GetObject, поскольку он не готов в течение нескольких минут. user3357963
Попробуйте использовать объект WshShell вместо встроенной функции Shell. Посмотриthis previous answer мой.
+1 По логике это должно соответствовать правильному приложению, если у MS нет раздражающей проверки, чтобы всегда запускать более новую версию
@ Jean-Fran & ois Corbett - спасибо за это. По существу, использование идеи Шона с WshShell работает. Не то, что я ожидал, и кажется немного хакерским, но пока что сделаю. Спасибо всем! user3357963
@ooo - немного взломать, но вы могли бы использоватьApplication.Wait сказать VBA немного поболтать, пока Shell делает свое дело.
0

У меня была похожая проблема, и я подумал, что подробно опишу свой опыт для тех, кто столкнется с этим в будущем.

В моей ситуации у меня был макрос Powerpoint, который должен был открыть диалоговое окно файла, чтобы пользователь мог выбрать некоторые файлы Excel и затем создать таблицы из данных; У меня не было проблем с этим, пока я недавно не установил Excel 2003. Теперь Powerpoint открывал диалоговое окно файла Excel 2003, которое вызывало ошибки при попытке выбрать файл * .xlsx. Это не имело значения, если бы я использовалExcel.Application.10 или жеExcel.Application.14 в моем коде для создания объекта Excel это всегда было диалоговое окно файла Excel 2003.

Я заметил в Проводнике, что файлы * .xlsx должны были открываться в Excel 2010, а файлы * .xls - открываться в Excel 2003. Я пытался обычным способом сбросить файлы * .xls, которые будут открыты в 2010 году, но безрезультатно. , В итоге мне пришлось удалить ключ реестра и восстановить Office 2010. Теперь, когда все файлы Excel открылись в 2010 году, моя проблема была исправлена.

Я знаю, что моя проблема немного отличалась от вашей, но я думаю, что мой опыт может помочь найти решение. Я думаю, что любое решение будет зависеть от редактирования реестра.

0

Я потратил на это полдня и хочу помочь другим сделать то же самое! Я использую Windows 7 и Office 2013 и 2010 на одном ноутбуке. Я хотел, чтобы Access VBA открывал старую версию Word, поскольку вызовы Word 2013 печатаются с толстыми черными полями.

Перепробовав множество вариантов, вот мой код, который работал:

Sub GetWordReference()

'finally got Access to open old version of Word

'open Word 2010
Shell "C:\Program Files (x86)\Office 2010\Office14\winword.exe"

'open Word 2013
'Shell "C:\Program Files\Microsoft Office 15\root\office15\winword.exe"

TryAgain:

    On Error GoTo NoWord
    Set word2010 = GetObject(, "Word.Application")
    On Error GoTo 0

    word2010.Visible = True

    'word2010.Documents.Add
    'word2010.Selection.TypeText "This is Word " & word2010.Version

    Exit Sub

NoWord:
    Resume TryAgain

End Sub

Я не могу заставить редактор кода SO показать это правильно, но копирование и вставка должны работать.

0

Это решение VB.NET:

Sub Word_InfoLate()
Dim wordApp2007 As New Object
Dim wordApp2010 As New Object

Для некоторых это немного пугает, но может быть редактирование реестра, которое может решить эту проблему. Я не могу выполнить тестирование, поскольку у меня есть только одна версия MS Office, однако в предыдущих версиях все еще остаются разделы реестра.

Я обнаружил версию Word 2007 в реестре, и ее расположение по умолчанию - C: \ program Files \ Microsoft Office \ Office14 \ WINWORD.EXE & quot; указывает, что более старые версии Word зарегистрированы в месте установки самой новой версии, так как это новое значение по умолчанию.

Что вы могли бы сделать, это перейти к месту в реестре

HKEY_CLASSES_ROOT\Word.Documet.12\shell\Open\Command 

Измените ключ (по умолчанию) на «C: \ program Files \ Microsoft Office \ Office12 \ WINWORD.EXE» & quot; / n "% 1"

В теории всякий раз, когда

Set wordApp2007 = CreateObject("Word.Application.12")

вызывается, он может проверить реестр на наличие исполняемого файла и найти правильный путь.

@CaBieberach - у ОП уже была эта строка кода, которая не работает. В последнее время я потратил довольно много времени на разработку .NET, и я понял, что это ошибка, но я ошибался.
Dim wordApp2007 As New Object не компилируется. user3357963
броситьNew, использованиеDim wordApp2007 As Object
1

Это может дополнительно объяснить, почему код работает один раз, а другой нет.

Мои наблюдения за ситуацией команды

'Set wordAppxxxx = CreateObject("Word.Application.xx")'

работает или нет на вашем компьютере, является то, что это функция последнего обновления, которое вы получаете от Microsoft.

Почему я верю в это:

У меня есть приложение, которое преобразует текстовый файл в документ Word для обратной совместимости с некоторыми устаревшими приложениями. Лучший план включает использование версии Word, аналогичной версии, для которой были разработаны старые приложения. В результате я искал, как вызвать унаследованную версию Word, в отличие от версии по умолчанию на моем компьютере, которая является Word 2010.

Решение, отмеченное в этой цепочке обсуждений, дало ответ на мой вопрос. (Спасибо вкладчикам Stack Overflow!) Я хотел использовать Word XP, поэтому я посмотрел на свои каталоги и заметил, что Word XP (он же Word 2002) является членом Office 10, поэтому я создал команду

'Set wordApp2002 = CreateObject("Word.Application.10")'

и моя программа запустила Word 2002, и мир стал счастливым местом.

За неделю у меня было обновление для моего компьютера. Я контролирую обновления через приложение, которое дает мне контроль над тем, когда обновления происходят так, что я могу наблюдать изменения в моей конфигурации. Этим утром (30.09.13) я включил компьютер с обновлением Word. Я не знал этого до тех пор, пока не сделал один прогон своего приложения с прошлой недели. Приложение работало нормально и вызывало Word 2002, как и ожидалось.

Но затем я получил баннерную страницу, информирующую меня об обновлении Word 2010, которое само устанавливалось.

После этого я запустил приложение, которое так хорошо работало для меня на прошлой неделе и сегодня. Теперь, после обновления Word (сразу после!), Тот же код теперь запускает Word 2010, несмотря на то, что командная строка, вызывающая Word 2002, не изменилась.

Это является убедительным доказательством того, что обновление Microsoft изменило настройки, которые ранее позволяли коду VB работать должным образом. Это может быть хорошим элементом для привлечения внимания Microsoft, поэтому посмотрим, сможем ли мы стабилизировать этот элемент в последующих пакетах обновлений, чтобы обеспечить согласованное поведение в будущих выпусках.

Я надеюсь, что это полезно,

JeffK

Похожие вопросы