【问题标题】:Multiple Function Declaration Flagging Compiler Error VBA Excel多个函数声明标记编译器错误 VBA Excel
【发布时间】:2018-03-12 15:31:22
【问题描述】:

我的函数声明已更新以适应 64 位和 32 位 Windows(VBA6 和 VBA7)。我想保留这两个声明,因为我们的一些客户仍在使用 Excel 2007。

问题在于,在打开应用程序时,VBA6 声明(在 Else 语句之后)似乎有时(尽管并非总是)在 Excel 2016(在 Office 365 上测试,64 位)中引发编译器错误,即使它永远不会被阅读

(编译错误:此项目中的代码必须更新才能在 64 位系统上使用。请查看并更新 Declare 语句并使用 PtrSafe 属性对其进行标记。)

有什么办法可以避免吗?

#If VBA7 Then
Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long


Private Declare PtrSafe Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal 
dwProcessId As Long) As Long

#Else
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
#End If

【问题讨论】:

  • have been updated to accommodate both 64-bit and 32-bit Windows - 他们没有。它们已被标记为 PtrSafe 关键字,但参数类型仍然错误 (Long)。它们会在 x64 上崩溃。
  • 关于实际错误,我怀疑是 #else 块中的函数。当您标记所有内容PtrSafe时,您可能错过了一个功能。

标签: excel vba


【解决方案1】:

您对 PtrSafe 函数 WaitForSingleObject 的声明是错误的。这是正确的版本。

Declare PtrSafe Function WaitForSingleObject Lib "kernel32" _
                  Alias "WaitForSingleObject" ( _
                        ByVal hHandle As LongPtr, _
                        ByVal dwMilliseconds As Long _
                        ) As Long

【讨论】:

  • OpenProcess 的声明也是错误的,但 VBA 也不知道。它不会导致 OP 的错误。
  • @SGerg 确实如此。我忽略了这一点。 OpenProcess 的返回值是 VB7 版本的 LongPtr 类型。我对错误消息的处理方法是首先消除已知错误,并希望不再存在错误。 VBA 的错误消息并不总是反映错误的真正原因。
  • 将代码更新为:Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" _ (ByVal hHandle As LongPtr, ByVal dwMilliseconds As Long) As Long Private Declare PtrSafe Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPtr 仍然是同样的错误。仅供参考,Else 子句中的所有行都是红色字体,好像它们有误,并且软件一直在按原样使用代码。我只是想摆脱错误。
  • @SGerg 似乎比我聪明。显然他预见到麻烦正在酝酿。 :-) 尝试使用 WIN64 常量代替 VBA 7。在此处阅读该主题:msdn.microsoft.com/en-us/library/office/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多