wordvba中的条件机制

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

我有一个.dot文件,其中有一行代码,当且仅当安装了Word 2003或更高版本时,必须在Microsoft Word宏中执行,否则将忽略它。我尝试这样实现它,希望VisualBasicforWord只在需要执行时才编译一行。相关代码如下(Word 2003为11.0)

我仍然希望带有宏的.dot文件在早期版本的Microsoft Word中可用,例如Microsoft Word 2000

但是,如果我尝试运行.dot文件,它在Word 2000上会失败,并出现编译错误,因为
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