Это легко реализовать. Единственное, что вы нам не сказали, это «битость» вашего 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
Обратите внимание на две вещи:
Вы не можете проверить назначение в VBE Immediate Window!
Вы должны сохранить ведущий "VBA". во всех вызывающих вариантах. Для получения дополнительной информации прочитайте этот вопрос SO: Разница между VBA.CBlah и CBlah
Надеюсь, это поможет: -)