【问题标题】:Returning the address of a procedure to a variable将过程的地址返回给变量
【发布时间】:2023-04-05 11:36:01
【问题描述】:

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

我想将我创建的过程的地址关联到一个变量。实际上,我使用的是 Windows Timer,在 Timer 代码中,函数 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

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

【问题讨论】:

标签: excel vba timer addressof


【解决方案1】:

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

请注意两点:

  1. 您无法在 VBE 即时窗口中测试分配!

  2. 您必须保留前导“VBA”。在所有调用变体中。有关更多信息,请阅读此 SO 问题:Difference between VBA.CBlah and CBlah

希望这会有所帮助:-)

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2014-05-14
    • 2013-07-25
    • 2013-05-22
    • 1970-01-01
    • 2021-04-28
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多