升级到 Windows 10 - 宏损坏

升级到 Windows 10 - 宏损坏

问题:

我终于升级到了 Windows 10,Excel 2010 中一些我经常使用的宏不再起作用。当我运行它们时,它们会立即崩溃,我收到的只是“自动化错误“。它们不引用任何外部程序/文件;只是在几张表中进行大量的复制/粘贴和排序。这些宏似乎可以在其他人的计算机上(在 Windows 10 上)运行,就像以前一样。

我做过的事:

  • 强制重启
  • 修复 excel
  • 重新安装 excel
  • 摆弄宏权限
  • 使用可在其他计算机上运行的工作簿副本
  • 奇怪的东西:如果我创建一个新的宏启用工作簿,并将旧的宏 + 工作簿内容复制粘贴到其中并尝试运行宏,它们就会起作用。一旦我退出并重新打开,宏就会停止工作。这对于我尝试制作的非常简单的测试宏来说也是如此。将字母从一个单元格复制到另一个单元格的宏在保存它的工作簿关闭并重新打开后崩溃。

我觉得我忘记了一些我测试过的东西,但这应该涵盖了大部分内容。

答案1

由于您不再回复评论,我只能假设随着操作系统的升级,您也从 32 位升级到了 64 位。

如果您正在声明 API 调用,则需要进行这些调用PtrSafe

例如,考虑以下 DLL 调用:

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

任何内存地址指针和窗口句柄都需要定义为LongPtr,因为 64 位操作系统管理内存的方式。上述函数的返回类型可以保留为Long,因为它不寻址内存或句柄。

一旦完成了内存指针和窗口句柄的转换,您就需要通过将函数声明为以下内容来告诉 Excel 它可以“安全”使用PtrSafe(将内存指针视为“指针安全”):

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

注意三个变化在我们的声明中提出:

Declare Function 变成 Declare PtrSafe Function

(这告诉 Excel 所有指针都已更改,函数可以安全使用)

ByVal Key As Long 变成 ByVal Key As LongPtr

最后

ByVal NewKey As Long 变成 ByVal NewKey As LongPtr

所以现在问题仍然存在。如果我想将其分发到不同的操作系统架构该怎么办?

您很幸运,因为 VBA 允许您使用特殊If...Then语句来声明模块。因此,对于上述代码,您可以使用以下语句分发到 32 位和 64 位操作系统:

#If VBA7 Then '64-bit Office
    Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" ( _
        ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
#Else
    Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
        ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
#End If

相关内容