Как открыть определенную версию Word 2007/2010 в Excel

У меня установлены 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

Ответ 1

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

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 можно вызвать с именем документа

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JeffK

Ответ 3

Я потратил полдня на это, и хочу помочь предотвратить то, что другие делают то же самое! Я использую 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-кода показать это правильно, но копирование и вставка должны работать.

Ответ 4

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

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

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

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

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

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

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

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

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

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

Ответ 5

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

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

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

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