繁体   English   中英

MS Word VBA 在 word 2003 中保存的文档中导致 2010 64 位错误

[英]MS Word VBA in document saved in word 2003 causes error in 2010 64 bit

我有一个文档,其中包含 VBA 宏,当我尝试在 word 2010 64bit 中打开它时,它抱怨应该更新代码以在 64 位系统上使用。 我添加了条件编译子句#If Not 64Bit 但这没有帮助。 还有什么可以做的吗?

您是否使用任何 ActiveX 控件? 例如,如果您的 Word 应用程序显示一个自定义用户窗体,那么它上的控件(包括一些内置的)很可能无法正常工作。

这里

ActiveX 控件和 COM 插件兼容性

第三方和 Microsoft 提供的现有 32 位 ActiveX 控件与 64 位版本的 Office 2010 不兼容。对于 ActiveX 控件和 COM 对象,有三种可能的解决方案:

  • 如果有源代码,可以自己生成64位版本,

  • 您可以联系供应商获取更新版本,

  • 您可以搜索替代解决方案。

Office 2010 中的本机 64 位进程无法加载 32 位二进制文件。 其中包括 MSComCtl 的常用控件(TabStrip、Toolbar、StatusBar、ProgressBar、TreeView、ListViews、ImageList、Slider、ImageComboBox)和 MSComCt2 的控件(Animation、UpDown、MonthView、DateTimePicker)。的 Microsoft Office 并由 32 位 Office 2010 安装。必须为现有的 Microsoft Office VBA 解决方案找到替代方案,当代码迁移到 64 位 Office 2010 时使用这些控件。64 位 Office 2010 不提供 64-通用控件的位版本。


使用 64 位版本的 Office 时, Declare语句也会受到影响:

在之前的 VBA 版本中,没有特定的指针数据类型,因此使用了 Long 数据类型。 由于 Long 数据类型始终为 32 位,因此在具有 64 位 memory 的系统上使用时会中断,因为高 32 位可能会被截断或覆盖其他 memory 地址。 这些情况中的任何一种都可能导致不可预知的行为或系统崩溃。

旧的Declare语句示例:

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

为了解决这个问题,VBA 现在包含一个真正的指针数据类型:LongPtr。

新版本:

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

此数据类型和新的 PtrSafe 属性使您能够在 32 位或 64 位系统上使用此 Declare 语句。 PtrSafe 属性向 VBA 编译器指示 Declare 语句针对 64 位版本的 Office 2010。如果没有此属性,在 64 位系统中使用 Declare 语句将导致编译时错误。 请注意,PtrSafe 属性在 32 位版本的 Office 2010 上是可选的。这使现有的 Declare 语句能够像往常一样工作。

再次从这里引用的行情

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM