标准 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
我写了一个函数来检查要划掉的单元格:
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