Может ли Excel VBA UDF, вызванный из листа, когда-либо передаваться экземпляр любого класса объектной модели Excel VBA, отличного от "Range"?

2 jtolle [2010-04-08 01:11:00]

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

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

Public Function f(x)

End Function

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

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

excel-vba excel user-defined-functions


1 ответ


1 Решение Todd Main [2010-04-08 04:53:00]

Ваши подозрения верны - вы можете передавать только ограниченные типы объектов. Например, если у меня есть таблица на активном листе и вы хотите узнать ее количество столбцов, я мог бы создать 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)