【问题标题】:Can an Excel VBA UDF called from the worksheet ever be passed an instance of any Excel VBA object model class other than 'Range'?从工作表调用的 Excel VBA UDF 是否可以传递除“范围”以外的任何 Excel VBA 对象模型类的实例?
【发布时间】:2011-02-05 11:31:57
【问题描述】:

我 99% 确定答案是否定的,但我想知道是否有 100% 确定的人可以这么说。

考虑一个 VBA UDF:

Public Function f(x)

End Function

当您从工作表中调用它时,“x”将是数字、字符串、布尔值、错误、数组或“范围”类型的对象。例如,它可以是“Chart”、“ListObject”或任何其他 Excel-VBA 对象模型类的实例吗?

(问题源于我转向 Excel 2007 并使用表格,并想知道我是否可以编写接受它们作为参数而不是 Range 的 UDF。对此的答案似乎是否定的,但后来我意识到我一般不知道。)

【问题讨论】:

    标签: excel user-defined-functions vba


    【解决方案1】:

    你的怀疑是正确的——你只能传入有限的对象类型。例如,如果我在活动工作表上有一个表并且想知道它的列数,我可以创建一个名为 TableColumnCount 的 UDF,并将表名传递给如下函数:

    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
    

    然后在工作表上以 myable 的名称作为字符串调用它,例如 =TableColumnCount("Table1")

    或作为范围对象,如:

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

    然后这样称呼它:=TableColumnCount(Table1)

    【讨论】:

    • 谢谢。我只是希望有人使用过 2000 年后的 Excel 足以知道权衡!
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2011-02-27
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多