【发布时间】:2018-04-03 16:37:40
【问题描述】:
以下函数在工作簿中使用时返回 0 值或 #VALUE,尽管作为子函数执行时返回正确的值。我尝试创建一个将以下代码作为子代码返回的函数,但我得到了相同的结果。我的函数搜索工作簿中的每个工作表,找到以“Budget*”开头的表格,并将单元格添加到用户指定的列中。张数未知,因此无法尝试将此函数编写为单元格的实际值。我被难住了!
Function IncomeSum(Month)
ColumnNumber = Month.Column
IncomeMonthSum = 0
Dim WS As Worksheet
For Each WS In Worksheets
If WS.Tab.Color = 255 Then Exit For
If WS.Index >= 4 Then
For Each Tbl In WS.ListObjects
If Tbl.Name Like "Budget*" Then
TableName = Tbl.Name
Exit For
End If
Next Tbl
ColumnSum = Application.WorksheetFunction.Sum(Range(TableName & "[[#All],[Column" & ColumnNumber & "]]"))
IncomeMonthSum = IncomeMonthSum + ColumnSum
End If
Next WS
IncomeSum = IncomeMonthSum
End Function
【问题讨论】:
-
UDF 不能
Activate其他工作表,例如。不要反对ActiveSheet。使用For Each ws In Worksheets迭代Worksheets集合,然后使用ws而不是ActiveSheet。Sheets集合不保证只包含Worksheet对象;当您迭代Sheets集合时,WS可以是从Chart到任何六种旧工作表类型中的任何一种。 -
同样
Month被假定为一个Range对象,但是该函数没有为它声明一个类型,所以它很乐意接受Variant可以容纳的任何东西(即字面上任何东西)。,并在Month.Column上出现运行时错误,而不是Range:明确声明参数As Range以避免这种情况。函数的返回值也应该是As Long,或As Double,或任何合适的值。它当前返回一个隐含的Variant。变量WS也应该被声明。Dim ws As Worksheet. -
您的代码也存在逻辑问题:如果任何工作表都没有名称中包含 Budget 的表格,则您的最后一个 值
ColumnSum将再次添加到IncomeMonthSum中。我强烈建议您使用Option Explicit选项 -
感谢您的意见! @MathieuGuindon,我提出了您的编辑建议,但公式仍然给出值 0。我不明白,函数不能像 sub 那样执行方法吗?查看我更新的代码以查看我所做的编辑。 Zac,我完全理解,但是,以我构建工作簿的方式,工作表不可能没有名为“Budget”的表。我不会打扰额外的代码。
-
WS.Activate在 UDF 中是非法的。是的,确实,从单元格公式调用的函数不能完成子/宏可以做的所有事情。函数接受输入、计算值、输出结果——仅此而已。