标准 SUMIFS 公式中的用户定义函数

User defined function inside standard SUMIFS formula

我写了一个函数来检查要划掉的单元格:

Function isCrossedout(myRange As Range)
    isCrossedout = myRange.Font.Strikethrough
End Function

我有一列数字“A:A”,我想在其中仅对划掉的元素求和。

我可以在任何单元格中插入带有用户定义函数的标准函数 SUMIFS 吗? 当我尝试这个时:

someCell.FormulaR1C1 = "=SUMIFS('Page'!RC1:RC1, isCrossedout)"

它 returns 应用公式时的零值。

我知道有一种方法可以通过循环以纯 VBA 方式对此类单元格求和,但我想尝试将其与 Excel SUMIFS 公式一起使用。

首先,你需要isCrossedout到return一个布尔值数组Font.Strikethrough 不会 return 数组,所以使用循环:

Function isCrossedout(ByVal myRange As Range) As Boolean()
    Dim arr() As Boolean
    ReDim arr(1 To myRange.Rows.Count, 1) ' assumes myRange has one column
    
    Dim cell As Range
    For Each cell In myRange
        Dim counter As Long
        counter = counter + 1
        
        arr(counter, 1) = cell.Font.Strikethrough
    Next
    
    isCrossedout = arr
End Function

接下来,我将使用 SUMPRODUCT 和双一元 -- 将布尔数组强制转换为 1 和 0 的数组。

=SUMPRODUCT(A2:A5*--isCrossedout(A2:A5))

对于可以处理 multi-column 输入的版本:

Function isCrossedout(myRange As Range) As Boolean()
    Dim arr() As Boolean
    ReDim arr(1 To myRange.Rows.Count, 1 To myRange.Columns.Count)
    
    Dim i As Long, j As Long
    For i = 1 To myRange.Rows.Count
        For j = 1 To myRange.Columns.Count
            arr(i, j) = myRange.Cells(i, j).Font.Strikethrough
        Next
    Next
    
    isCrossedout = arr
End Function