这很容易实现。您唯一没有告诉我们的是您的 Excel 的“位数”。嗯,我用的是 Excel2019 64Bit。因此,就我而言,我使用的是 LongLong 整数(8 字节)。如果您运行的是 32 位版本,则必须考虑到这一点。在 32 位平台上,您没有 LongLongs,而是 只有 Long 整数(4 字节)。我只是提到这一点,因为您写道:
而且它不起作用(变量类型 = long)
您可以做的最好的事情是声明类型为 LongPtr 的指针变量。 LongPtr 并不是它自己的类型,而是 VBA7 引入的一个简洁功能。您声明为 LongPtr 类型的任何整数变量在 32 位系统上都是 Long 并且是 LongLong 在 64 位系统上。
在模块的声明部分中,将变量设置为
Public LngPtrMove2 As LongPtr
如果你还在运行 VBA6,你可以使用
Public LngPtrMove2 As Long ' for 32Bit
或者,在 64 位系统上,如果必须支持向后兼容,则可以使用条件编译:
#If Win64 Then
Public LngPtrMove2 As LongLong
#Else
Public LngPtrMove2 As Long
#End If
现在,使用以下函数将函数指针分配给运行 VBA 7 的 64 位系统上的公共变量,如下所示:
Public Function LngPtrMove2() As LongPtr
LngPtrMove2 = VBA.CLngPtr(AddressOf move2)
End Function
在 64 位 VBA 6 和所有 32 位系统上使用:
Public Function LngPtrMove2() As Long
LngPtrMove2 = Vba.CLng(AddressOf move2)
End Function
请注意两点:
您无法在 VBE 即时窗口中测试分配!
您必须保留前导“VBA”。在所有调用变体中。有关更多信息,请阅读此 SO 问题:Difference between VBA.CBlah and CBlah
希望这会有所帮助:-)