我养成了通过改变细胞样式来标记外围数据的习惯。我想在excel中编写一个UDF来将Range
个单元格作为输入,并返回该范围的未标记为异常值的子集。
这就是我的尝试:
Function ValidCells(rCells As Range) As Range
Dim c As Range
For Each c In rCells
If c.Style <> "Bad" Then
Set ValidCells = Range(c, ValidCells)
End If
Next
End Function
我的目的是能够=Sum(ValidCells(A1:D1))
,并且只对非样式数据求和。
但是,ValidCells
似乎每次都返回一个空范围。我做错了什么?
答案 0 :(得分:1)
你确定它会返回一个空的范围吗?当我尝试运行它时,VBA会在“设置”行上引发错误。如果从工作表中将例程调用为UDF,则不会看到VBA错误,但UDF应该停止执行并返回#VALUE!。
无论如何,你可以做你想做的事,但有一个很大的警告。首先,代码:
Function ValidCells(rCells As Range) As Range
Dim valid As Range
Dim c As Range
For Each c In rCells
If c.Style <> "Bad" Then
If valid Is Nothing Then
Set valid = c
Else
Set valid = Union(valid, c)
End If
End If
Next
Set ValidCells = valid
End Function
我们的想法是使用VBA的“联盟”方法建立一个多区域范围。因此,例如,如果我在C8中放置一个坏单元,并调用ValidCells(B7:D9),则返回多区域范围$ B $ 7:$ D $ 7,$ D $ 8,$ B $ 8:$ B $ 9, $ C $ 9:$ d $ 9然后,您可以将结果与SUM一起使用。
需要注意的是,更改单元格样式不会触发此UDF重新计算。通常,您可以添加如下所示的行:
Call Application.Volatile(True)
到您的UDF,它将重新计算工作簿的每次更改。然而,似乎改变细胞样式并不符合波动性目的的“变化”。所以,你可以从UDF中得到你想要的东西,但是就重新计算而言,似乎没有真正的方法让它像“正常”那样工作,即使你把它标记为易变的。如果你使用它,你必须要注意这一点。