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