我安装了Word 2007和2010。我需要在Excel中打开Word,但我需要指定我需要在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
如果我使用
注册每个版本的Word "C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /regserver
"C:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /regserver
然后注册的版本打开但我无法打开未注册的版本。
有人可以帮忙并告诉我如何使用VBA在Excel中打开特定版本的Word吗?
谢谢
编辑:示例代码....
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
答案 0 :(得分: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
答案 1 :(得分: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,世界是一个快乐的地方。
在周末,我的计算机有了更新。我通过应用程序控制更新,这使我可以控制何时发生更新,以便观察我的配置更改。今天早上(2013年9月30日)我打开了一台有Word更新的电脑。直到我从上周开始运行我的应用程序之后才知道这一点。该应用程序正常运行并按预期调用Word 2002。
但后来我得到了标题页,告诉我正在安装的Word 2010更新。
之后,我运行了上周和今天一次对我有用的应用程序。现在,在Word更新(紧接在!之后)之后,尽管调用Word 2002的命令行没有更改,但相同的代码现在启动Word 2010。
这似乎有力证据表明Microsoft更新调整了以前允许VB代码按预期工作的设置。这可能是引起微软注意的一个好项目,所以看看我们是否可以在后续更新包中使这个项目稳定下来,以便在将来的版本中保持一致的行为。
我希望这很有帮助,
JeffK
答案 2 :(得分:1)
我浪费了半天的时间,并希望帮助阻止其他人这样做!我在同一台笔记本电脑上运行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代码编辑器正确显示,但复制和粘贴应该有效。
答案 3 :(得分:0)
这是一个VB.NET解决方案:
Sub Word_InfoLate()
Dim wordApp2007 As Object
Dim wordApp2010 As Object
这对某些人来说有点吓人,但可能有一个注册表编辑可以解决这个问题。 我无法测试,因为我只有一个版本的MS Office可用,但是,以前的版本仍然有剩余的注册表项。
我在注册表中找到了2007版本的Word,它的默认位置是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")
被调用它可以探测注册表中可执行文件的位置,并找到正确的路径。
答案 4 :(得分: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年打开,我的问题已修复。
我知道我的问题与你的问题有点不同,但我认为我的经验可以帮助我找到解决方案。我认为任何解决方案最终都会依赖于某些注册表编辑。