Мне нужно использовать ряд Windows API
функций в классе, который я разрабатываю. Некоторые из этих функций требуют использования AddressOf
, но согласно Документация Microsoft , его использование в модуле класса запрещено. Кто-нибудь знает функцию или какой-нибудь стандартный метод, который может эмулировать оператор AddressOf
, или это вообще возможно?
Пример: я использую функцию SetTimer
для вызова функции в определенное время. Вы могли бы сказать, что вы могли бы просто использовать Application.OnTime
. Вы были бы правы в любое другое время, но в этом случае я не могу, потому что вызывающая функция, которая используется для создания экземпляра класса и вызова метода, - это UDF
, вызываемая из рабочего листа, которая игнорирует OnTime
вызовы. Я пытаюсь избежать неуклюжей реализации размещения публичной функции в стандартном модуле (который будет зависеть от экземпляра класса), где я мог бы использовать оператор AddressOf
, хотя и безобразно.
Редактировать: Как уже упоминалось в комментариях, изначально я намеренно не раскрывал, что именно я пытался сделать, чтобы не слышать "ты не должен этого делать", смеется. У меня есть рабочий класс, который делает именно то, что я хочу, (возвращает массивы на лист, используя стандартный метод Ctrl+Shift+Enter
), но я хотел попробовать и эмулировать Dynamic Array Functions
, который в настоящее время проходит бета-тестирование Команда разработчиков Excel, которая не требует выбора диапазона и ввода массива с помощью Ctrl+Shift+Enter
. Я знал, что если бы я спросил что-то вроде «как я могу вернуть массив в WorkSheet из UDF без Ctrl+Shift+Enter
», все бы предоставили существующие ответы и / или позорили бы меня за то, как реализовать что-то, что противоречит тому, как работают функции Excel ( Я бы сделал то же самое с кем-то еще, ха).
Сказав это, у меня также есть еще одна версия моего класса, которая использует объект QueryTable
для размещения данных на листе и работает так же, как Dynamic Array Functions
. Я, вероятно, собираюсь опубликовать каждую реализацию на Code Review , чтобы увидеть, как я мог бы улучшить их / получить представление о том, какая реализация будет наиболее стабильной, т. Д.
Private Declare Function SetTimer Lib "user32" _
(ByVal HWnd As Long, ByVal nIDEvent As Long,
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Function Method1(varValsIn As Variant) As Variant
Dim lngWindowsTimerID As Long
'doing some stuff
'call API function after doing some stuff
lngWindowsTimerID = SetTimer(0&, 0&, 1, AddressOf DoStuff)
End Sub
Private Sub DoStuff
'Stuff to do
End Sub