0

首先对不起我的英语,它不是我的母语。

我想将我创建的过程的地址关联到一个变量。实际上,我使用的是 Windows 定时器,在定时器代码中,函数 SetTimer 是这样使用的:

    Sub StartTimer()
    TimerSeconds = 0.1 ' how often to "pop" the timer.
    TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf move2)
End Sub

我想用公共变量替换“AddressOf move2”,为此我需要获取过程的地址,但我不知道该怎么做。我试着写

variable = AddressOf move2

而且它不起作用(变量类型=长)

4

1 回答 1

0

这很容易实现。您唯一没有告诉我们的是您的 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

请注意两点:

  1. 您不能在 VBE 即时窗口中测试分配!

  2. 你必须保持领先的“VBA”。在所有调用变体中。有关更多信息,请阅读此 SO 问题:VBA.CBlah 和 CBlah 之间的区别

希望这可以帮助 :-)

于 2020-04-27T22:37:29.523 回答