Возврат адреса процедуры в переменную - PullRequest
0 голосов
/ 09 апреля 2020

сначала извините за мой Engli sh, это не мой родной язык.

Я бы хотел связать адрес процедуры, которую я создал, с переменной. На самом деле, я использую таймер 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" на общедоступный c переменная и для этого мне нужно получить адрес процедуры, но я не знаю, как это сделать. Я пытался написать

variable = AddressOf move2

И это не работает (тип переменной = long)

1 Ответ

0 голосов
/ 28 апреля 2020

Это легко реализовать. Единственное, что вы нам не сказали, это «битость» вашего Excel. Ну, я использую Excel2019 64Bit. Итак, в моем случае я использую LongLong целых чисел (8 байт). Если вы используете 32-битную версию, вы должны учитывать это. На 32-битных платформах у вас нет LongLongs , но только Long целых чисел (4 байта). Я просто упомянул это, потому что вы написали:

И это не работает (тип переменной = long )

Лучшее, что вы можете сделать - объявить переменную-указатель типа LongPtr . A LongPtr на самом деле не является собственным типом, а представляет собой замечательную функцию, которая была представлена ​​в VBA7. Любая целочисленная переменная, объявленная вами как тип LongPtr , представляет собой Long в 32-битных системах и 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

Теперь используйте следующую функцию, чтобы назначить указатель функции на переменную publi c в 64-битная система под управлением VBA 7 выглядит следующим образом:

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 Immediate Window!

  2. Вы должны сохранить ведущий "VBA". во всех вызывающих вариантах. Для получения дополнительной информации прочитайте этот вопрос SO: Разница между VBA.CBlah и CBlah

Надеюсь, это поможет: -)

...