这很容易实现。您唯一没有告诉我们的是您的 Excel 的“位数”。嗯,我用的是 Excel2019 64Bit。所以,就我而言,我使用的是LongLong整数(8 字节)。如果您运行的是 32 位版本,则必须考虑到这一点。在 32 位平台上,您没有LongLongs,而只有 Long整数(4 字节)。我只是提到这一点,因为您写道:
而且它不起作用(变量类型= long)
您可以做的最好的事情是声明LongPtr类型的指针变量。LongPtr并不是它自己的类型,而是 VBA7 引入的一个简洁的功能。您声明为LongPtr类型的任何整数变量在 32 位系统上为Long ,在 64 位系统上为LongLong。
在模块的声明部分中,将变量设置为
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 问题:VBA.CBlah 和 CBlah 之间的区别
希望这可以帮助 :-)