如何在Excel VBA中编写UDF以过滤一系列单元格?

时间:2011-03-05 16:04:35

标签: vba excel-vba excel

我养成了通过改变细胞样式来标记外围数据的习惯。我想在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似乎每次都返回一个空范围。我做错了什么?

1 个答案:

答案 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中得到你想要的东西,但是就重新计算而言,似乎没有真正的方法让它像“正常”那样工作,即使你把它标记为易变的。如果你使用它,你必须要注意这一点。