Обратите внимание на тег: VBA, а не VB6, а не VB.NET.
Это относится к VBA в MS Access. Я создал набор методов в модуле, который я называю "Перечислимым". В нем много чего напоминают классы Enumerable и интерфейсы в .NET. Одна вещь, которую я хочу реализовать, - это метод ForEach, аналогичный методу .NET Enumerable.Select.
Я построил версию, которая использует метод Application.Run для вызова функции для каждого элемента, но приложение .Run работает только с пользовательскими методами. Например, следующие работы:
' User-defined wrapper function:
Public Function MyReplace( _
Expression As String, Find As String, StrReplace As String, _
Optional Start As Long = 1, _
Optional Count As Long = 1, _
Optional Compare As VbCompareMethod = vbBinaryCompare)
MyReplace = Replace(Expression, Find, StrReplace, Start, Count, Compare)
End Function
' Using Application.Run to call a method by name
Public Sub RunTest()
Debug.Print Run("MyReplace", "Input", "In", "Out")
End Sub
RunTest печатает "Выход", как и ожидалось. Не работает следующее:
Debug.Print Run("Replace", "Input", "In", "Out")
Он выдает ошибку времени выполнения 430: "Класс не поддерживает автоматизацию или не поддерживает ожидаемый интерфейс". Ожидается, что в документации указано, что Application.Run работает только для пользовательских методов.
У VBA есть оператор AddressOf, но это работает только при передаче указателей функций на внешние API-функции; указатели функций, созданные с помощью AddressOf, не расходуются в VBA. Опять же, это отмечается в документации (или см., Например, VBA - CallBacks = несколько центов меньше, чем доллар?).
Итак, есть ли другой способ идентифицировать и вызывать метод с использованием переменной? Или мои попытки обратного вызова будут ограничены пользовательскими функциями через метод Application.Run?