wordvba中的条件机制
我有一个.dot文件,其中有一行代码,当且仅当安装了Word 2003或更高版本时,必须在Microsoft Word宏中执行,否则将忽略它。我尝试这样实现它,希望VisualBasicforWord只在需要执行时才编译一行。相关代码如下(Word 2003为11.0) 我仍然希望带有宏的.dot文件在早期版本的Microsoft Word中可用,例如Microsoft Word 2000 但是,如果我尝试运行.dot文件,它在Word 2000上会失败,并出现编译错误,因为wordvba中的条件机制,vba,ms-word,extensibility,Vba,Ms Word,Extensibility,我有一个.dot文件,其中有一行代码,当且仅当安装了Word 2003或更高版本时,必须在Microsoft Word宏中执行,否则将忽略它。我尝试这样实现它,希望VisualBasicforWord只在需要执行时才编译一行。相关代码如下(Word 2003为11.0) 我仍然希望带有宏的.dot文件在早期版本的Microsoft Word中可用,例如Microsoft Word 2000 但是,如果我尝试运行.dot文件,它在Word 2000上会失败,并出现编译错误,因为ActiveWind
ActiveWindow.View.ReadingLayout
在Word 2000中不是有效的方法。也就是说,即使在Word 2000上永远不会执行该行,因为Application.Value
将为9.0,Word仍会尝试编译该行
在Visual Basic中,Word是否有任何方法可以添加编译器指令,从而使某些代码不会根据Word版本进行编译?这两种方法可以使其正常工作: (一) 为仅在特定office版本中工作的函数添加一个模块,并向其中添加子例程 (二) 在需要调用函数的地方,添加特定Office版本的测试,然后使用
应用程序调用子例程。运行
原始模块将具有:
If Val(Application.Version) >= 11 Then
Application.Run "office11module.disableReadingLayout"
End If
而您的特定模块office11module
将
Public Sub disableReadingLayout()
ActiveWindow.View.ReadingLayout = False
End Sub
这是因为Word在需要时才编译Office11模块,我们通过应用程序确保它。运行调用Word时,Word在运行前不知道我们需要它。我们最终通过后期绑定实现了它,这是一个非常小的调整:
If Val(Application.Version) >= 11 Then
Dim obj As Object
Set obj = GetObject(, "Word.Application")
obj.ActiveWindow.View.ReadingLayout = False
End If
我们的Word VBA产品需要数字签名
我们使用MS Office 2000作为基础开发应用程序,以便尽可能与我们的一些客户向后兼容
我们使用jonas_jonas(2014年1月16日17:59)提供的解决方案多年,同时在Windows XP开发平台上使用Word 2000
但是-升级到Windows 7 Pro开发平台后,解决方案不再有效,在对Word文件进行数字签名后尝试保存Word文件时,会出现“磁盘已满”错误
然后,我们尝试并成功地使用了Pep(2014年1月18日23:23)提供的答案(如上),该答案在您需要对Word文件进行数字签名时有效
我们认为“磁盘已满”错误是在保存之前试图编译项目的结果
If Val(Application.Version) >= 11 Then
Dim obj As Object
Set obj = GetObject(, "Word.Application")
obj.ActiveWindow.View.ReadingLayout = False
End If
你知道什么是条件编译吗?我检查了可用于条件编译的编译器常量,它们似乎都与Office版本无关。Visual Basic版本有常量,但Office版本没有常量。一种非常糟糕的方法是检查应用程序版本,然后根据结果以编程方式创建模块并添加代码?如果你考虑这个方法,我可以给你一个solution@mehow我正在考虑创建第二个.dot文件,该文件实际上称为ActiveWindow.View.ReadingLayout=False指令。您的意思是说,对于您的解决方案,不需要创建一个单独的.dot文件,该文件仅在Val(Application.Version)>=11时执行?按照我的方法,您不需要创建另一个文件。将会发生的事情将使用Doc文件的Open事件。一旦打开,它将检查单词版本。如果版本为2003或更高版本,则它将执行一个子模块,该子模块将自动(以编程方式)向VBA项目添加一个模块(字面上是创建一个新模块并在其中放入代码),并在该模块中执行宏。
If Val(Application.Version) >= 11 Then
Dim obj As Object
Set obj = GetObject(, "Word.Application")
obj.ActiveWindow.View.ReadingLayout = False
End If