【问题标题】:PtrSafe VBA - updating an Excel document for Office 64-bitPtrSafe VBA - 为 Office 64 位更新 Excel 文档
【发布时间】:2016-12-19 23:35:37
【问题描述】:

我目前正在为我们公司更新一个在 64 位 Microsoft Office 套件上使用时不再运行的文档(32 位仍然可以)。

我了解函数和声明需要添加“Ptrsafe”字样 - 但是当我将它添加到此函数时,它告诉我语法错误

Private PtrSafe Function executeSingle(Optional rurl As String = vbNullString, _
                    Optional qry As String = vbNullString, _
                    Optional complain As Boolean = True, _
                    Optional sFix As String = vbNullString _
                    ) As cJobject

我不知道为什么...如果您删除 PtrSafe,它会正常工作。有什么想法吗?

【问题讨论】:

  • 你不要把PtrSafe放在你自己的函数或subs上,只能放在那些从windows API或DLL导入的函数上。

标签: vba excel


【解决方案1】:

当您在动态链接库 (DLL) 中声明对外部过程的引用时,您应该只需要使用“Declare”语句。始终建议您在执行此操作时使用 PtrSafe 关键字。就像A.S.H. 所说,您不需要为自己的功能执行此操作。请参阅此link 了解更多信息。

这是来自MSDN 的示例,说明使用 PtrSafe 的正确语法。它包括条件编译语法,这可能对您的情况有用:

Declare PtrSafe Function GetActiveWindow Lib "User32" () As LongPtr 
        #If Vba7 Then 
             ' Code is running in  32-bit or 64-bit VBA7. 
             #If Win64 Then 
                  ' Code is running in 64-bit VBA7. 
             #Else 
                  ' Code is not running in 64-bit VBA7. 
             #End If 
        #Else 
             ' Code is NOT running in 32-bit or 64-bit VBA7. 
        #End If 

【讨论】:

  • 声明语句没有End Function
  • 并且Declare语句应该在条件指令块内。
  • 好电话。我取出了结束函数语句。我想您可以将声明语句放在条件块中,但是为什么需要这样做呢?
  • 条件块的目的是根据何时需要将声明分开。因此,在 VB7 部分,您将使用 office 64 调用的声明(使用 PtrSafe 等),而在 else 分支中,您将声明没有 PtrSafe 的相同函数(因为如果不是,代码将无法在旧的Office 32 位)。
  • 例如,带有 PtrSafe 的代码在 Office 2007 上无法运行,因此如果您需要支持旧版本的 Office,则需要使用这种结构。
猜你喜欢
  • 2019-06-27
  • 2020-01-21
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多