Может ли UDF Excel VBA, вызванная из листа, когда-либо передаваться экземпляру какого-либо класса объектной модели Excel VBA, кроме «Range»? - PullRequest
2 голосов
/ 08 апреля 2010

Я на 99% уверен, что ответ «нет», но мне интересно, может ли кто-то, кто на 100% уверен, так сказать.

Рассмотрим UBA VBA:

Public Function f(x)

End Function

Когда вы вызываете это из таблицы, «x» будет числом, строкой, логическим значением, ошибкой, массивом или объектом типа «Range». Может ли это быть, скажем, экземпляр Chart, ListObject или любого другого класса объектной модели Excel-VBA?

(Вопрос возник из-за того, что я перешел в Excel 2007 и поиграл с таблицами, и подумал, могу ли я написать UDF, которые принимают их в качестве параметров вместо Range. Ответ на этот вопрос вроде бы нет, но потом я понял не знаю наверняка в общем.)

1 Ответ

1 голос
/ 08 апреля 2010

Ваши подозрения верны - вы можете передавать только ограниченные типы объектов. Например, если у меня есть таблица на активном рабочем листе, и я хотел бы узнать ее количество столбцов, я мог бы создать UDF с именем TableColumnCount и передать имя таблицы в функцию типа:

Function TableColumnCount(tn As String) As Integer
    Dim myTableName As ListObject
    Dim ActiveS As Worksheet
    Set ActiveS = ActiveWorkbook.ActiveSheet
    Set myTableName = ActiveS.ListObjects(tn)
    TableColumnCount = myTableName.Range.Columns.Count
End Function

и затем назовите его на листе с именем моего умения в виде строки, например =TableColumnCount("Table1").

Или как объект диапазона, например:

Function TableColumnCount(tn As Range) As Integer
    TableColumnCount = tn.Columns.Count
End Function

А затем назовите это как: =TableColumnCount(Table1)

...