2

我有一个带有一行代码的 .dot 文件,当且仅当安装了 Word 2003 或更高版本时,必须在 Microsoft Word 宏中执行该代码,否则它应该被忽略。我试图像这样实现它,希望 Visual Basic for Word 仅在需要执行它时才编译一行。有问题的代码如下(Word 2003 为 11.0)

If Val(Application.Version) >= 11 Then
    ActiveWindow.View.ReadingLayout = False
End If

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

但是,如果我尝试运行 .dot 文件,它会在 Word 2000 上失败并出现编译错误,因为它在 Word 2000ActiveWindow.View.ReadingLayout中不是有效方法。也就是说,即使该行永远不会在 Word 2000 上执行,因为Application.Value它将是 9.0, Word 仍会尝试编译该行。

Visual Basic for Word 中是否有任何方法可以添加编译器指令,以便根据 Word 版本不编译某些代码?

4

3 回答 3

1

我们最终用后期绑定来实现它,结果证明这是一个非常小的调整:

If Val(Application.Version) >= 11 Then
    Dim obj As Object
    Set obj = GetObject(, "Word.Application")
    obj.ActiveWindow.View.ReadingLayout = False
End If
于 2014-01-18T23:23:57.080 回答
0

他们有两个技巧来让它工作:

1)为仅在特定办公版本中工作的功能添加一个模块,并将您的子程序添加到其中。

2)在你必须调用你的函数的地方,为特定的Office版本添加一个测试,然后调用你的子例程Application.Run

原始模块将具有:

If Val(Application.Version) >= 11 Then
    Application.Run "office11module.disableReadingLayout"
End If

你的特定模块office11module会有

Public Sub disableReadingLayout()
    ActiveWindow.View.ReadingLayout = False
End Sub

这是因为 Word 在需要之前不会编译 office11module,并且我们通过Application.Run调用确保 Word 在运行前不知道我们需要它。

于 2014-01-16T17:59:20.420 回答
-1

我们的 Word VBA 产品需要数字签名。

我们使用 MS Office 2000 作为基础开发应用程序,以便尽可能向后兼容我们的一些客户。

在 Windows XP 开发平台上使用 Word 2000 时,我们多年来一直使用 jonas_jonas(2014 年 1 月 16 日 17:59)提供的解决方案。

但是 - 升级到 Windows 7 Pro 开发平台后,该解决方案不再有效,在对 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
于 2016-11-22T17:53:36.740 回答