CallByName не работает для всех объектов / функций - PullRequest
0 голосов
/ 07 апреля 2020

В VBA большинство функций Excel доступны через Application.WorksheetFunction или VBA

Взять sinh и sin, например:

Функция листа

Debug.Print Application.WorksheetFunction.sinh(5)
 74,2032105777888

Функция VBA

Debug.Print VBA.sin(5)
-0,958924274663138

Вопрос:

Почему CallByName не работает как с функциями рабочего листа, так и с функциями VBA?

Функция рабочего листа

Debug.Print CallByName(Application.WorksheetFunction, "sinh", VbGet, 5)
 74,2032105777888

Функция VBA

Debug.Print CallByName(VBA, "sin", VbGet, 5)

enter image description here

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

В VBA большинство функций Excel доступны через Application.WorksheetFunction или VBA

Нет. Функции Excel доступны как вызовы с поздней привязкой к глобальному объекту Excel.Application (если вы размещены в Excel), а некоторые из них имеют «эквивалент» с ранней привязкой (стратегия обработки ошибок должна отличаться) в * Интерфейс 1006 * (на самом деле вы получаете Application.WorksheetFunction).

Члены библиотеки VBA, глобальные или нет, не имеют ничего общего с Excel: на стандартную библиотеку VBA ссылаются все Проект VBA, независимо от его хост-приложения (Word, Excel, Access, ... SolidWorks, Sage300 и др. c.). Если функция выглядит так, как будто она существует как в библиотеках VBA, так и в библиотеках Excel, то, вероятно, теоретически предпочтительной должна быть функция VBA.

Используйте обозреватель объектов (F2) для обнаружения членов стандартной библиотеки VBA, включая и, возможно, особенно его Math модуль.

1 голос
/ 07 апреля 2020

Подпись вызова CallByName ..., которая на самом деле является членом VBA.Interaction, как показано ниже (поэтому ваш фрагмент эквивалентен VBA.Interaction.CallByName(VBA, "sin", VbGet, 5) или просто VBA.CallByName..., в любом случае побочная точка):

enter image description here

является

CallByName(Object As Object, ProcName As String, CallType As VbCallType, Args() As Variant)

Поскольку VBA не является Object, но в стандартной библиотеке VBA это приводит к ошибке несоответствия типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...