【问题标题】:Declare PtrSafe Compatibility in Excel在 Excel 中声明 PtrSafe 兼容性
【发布时间】:2015-01-05 11:17:08
【问题描述】:

我在 VBA 中使用这个语句

Private Declare PtrSafe Function GetTimeZoneInformationAny Lib "kernel32" Alias _
  "GetTimeZoneInformation" (buffer As Any) As Long

这适用于:

  • Win 64 位,Excel 2010 64 位
  • Win 64 位,Excel 1010 32 位

但是,我的客户报告了对单词 PtrSafe 的编译错误。他正在使用 Excel 2010。

我不知道为什么会这样。有什么想法吗?

【问题讨论】:

  • @chris 我不认为这是重复的,而且我认为 linked answer 在其“如果您使用 64 位那么”中是不正确的,因为 PtrSafe 有效在 32 位和 64 位上。
  • PtrSafe 在 Excel 2010 中工作。确保您的客户实际使用它(而不是 Excel 2003)。
  • 他确实说过,但话又说回来,他可能错了。只是为了确认上述语句在 Excel 2007 中是否可以正常工作?还有其他需要考虑的变量吗?我只对 Excel 2007 及更高版本感兴趣
  • Office 2007 没有 64 位版本,但具有 VBA 6。Office 2010 是第一个包含 VBA 7 和 64 位版本的版本。如果您需要支持 Office 2007 或更低版本,您应该使用#If VBA7 和declare your API twice。
  • GSerg 感谢您澄清这一点。我现在将声明两次,并在测试后通知您。

标签: excel vba


【解决方案1】:

好的,我已经重写了这个:

#If VBA7 Then
Private Declare PtrSafe Function GetTimeZoneInformationAny Lib "kernel32" Alias "GetTimeZoneInformation" (buffer As Any) As Long
#Else
Private Declare Function GetTimeZoneInformationAny Lib "kernel32" Alias "GetTimeZoneInformation" (buffer As Any) As Long
#End If

这在 Excel 2010 64 位的第二行产生了编译错误,该行保持红色,但当我再次编译时,错误不再出现。这是 Excel 的行为方式吗?

【讨论】:

  • 是的,在 IDE 中,如果您尝试手动更改,未使用的行将保持红色并导致出现错误消息框(除非它是 Office 2010+ 32 位,其中两行都是有效,因此两者都不会变红)。消息框一般来说非常烦人,不仅在声明 API 时,所以我个人更喜欢取消勾选Tools - Options - Editor - Auto Syntax Check。尽管有名字,但这会保持语法检查,只抑制消息框。
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2016-01-11
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多