Может ли 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)