无法将Excel数组公式与自定义VB函数一起使用

raogr8fs  于 2023-05-19  发布在  其他
关注(0)|答案(3)|浏览(192)

我尝试使用Excel array formulae来计算一个有背景颜色的柱状区域(如果您愿意,可以使用数组)中的单元格数量。
为了检查一个单元格是否有背景颜色,我使用这个函数:

Function FillIndicator(color As Range) As Integer
If color.Interior.ColorIndex = -4142 Then
    FillIndicator = 0
Else
    FillIndicator = 1
End If
End Function

这很有效
如果我要避开数组公式,并且我的范围是,比如说,C5:C7,我需要写这样的东西:

=FillIndicator(C5) + FillIndicator(C6) + FillIndicator(C7)

现在,我在这里使用数组公式的天真尝试是这样写的:

=SUM(FillIndicator(C5:C7))

然后按Ctrl+Shift+Enter。但这只是得到了一个#VALUE错误。
我做错了什么?我能搞定吗?
注意:我使用的是Excel 365版本2208。我想是的。

ctehm74n

ctehm74n1#

这个答案与@RicardinhoL的答案相同,但有三个小区别:1)使用一个可选的颜色参数,默认值,你在问题2)检查范围是否不是其他错误发生3)使用函数的名称作为计数器,因为它的工作原理就像一个变量本身。
必须返回Long,因为excel中有很多单元格!

Public Function CountIfColor(rngClr As Range, Optional thisColor As Long = -4142) As Long
   Dim r As Range
   If Not rngClr Is Nothing Then
      For Each r In rngClr
         If r.Interior.ColorIndex = thisColor Then CountIfColor = CountIfColor + 1
      Next
   End If
End Function
xv8emn3q

xv8emn3q2#

我认为这是计算特定列的单元格或范围所需的。

Function SumCellsByColor(colorRange As Range, targetColor As Long) As Long
    Dim cell As Range
    Dim count As Long
    
    count = 0
    
    For Each cell In colorRange
        If cell.Interior.color = targetColor Then
            count = count + 1
        End If
    Next cell
    
    SumCellsByColor = count
End Function

Sub ExampleUsage()
    Dim rng As Range
    Dim count As Long
    
    ' Define the range of cells in which you want to count
    Set rng = Range("A18:C22")
    
    ' Call the SumCellsByColor function and pass the range and target color.
    count = SumCellsByColor(rng, RGB(255, 0, 0)) ' For example, the color red
    
    ' Print the result
    MsgBox "Number of cells with red color: " & count
End Sub
k4ymrczo

k4ymrczo3#

要让UDF返回一个数组,您只需将数组设置为等于返回行中的函数。
例如,假设您显然希望返回一个布尔数组,该数组对应于区域中的单元格是否着色:

Option Explicit

Function FillIndicator(color As Range)
    Dim v  'variable to loop through array
    Dim al As Object 'collect the test results
    
Set al = CreateObject("System.Collections.ArrayList")

'run the test on each cell
For Each v In color
    al.Add v.Interior.ColorIndex <> -4142
Next v

'Set the Function equal to an array
FillIndicator = al.toarray

End Function

注意倒数第二行,其中FillIndicator被设置为等于数组。
公式将返回一个TRUE/FALSE数组,具体取决于Interior.ColorIndex属性。
然后,您可以将其视为任何其他数组函数。

相关问题