【问题标题】:Checking colored cells using SUMPRODUCT使用 SUMPRODUCT 检查彩色单元格
【发布时间】:2016-07-26 09:26:35
【问题描述】:

我正在尝试计算彩色单元格的数量(也满足另一个条件)。

我的单元格如下:

我的目的是计算有“B”的单元格以及相邻单元格为绿色的单元格。

我也写了一个函数如下:

    Function CheckColor(rng As Range) As Boolean
    If rng.Interior.ColorIndex = 43 Then
        CheckColor = True
    Else
        CheckColor = False
    End If
    End Function

然后我使用SUMPRODUCT函数如下:

=SUMPRODUCT(--(V40:V50="B");--CheckColor(W40:W50))

但是,我收到错误 #VALUE!

更新

我已将公式修改如下:

Function CheckColor(rng As Range) As Variant
Dim arr As Variant
Dim n As Integer
ReDim arr(0 To rng.Count - 1) As Variant
n = 0
For Each cell In rng
    If cell.Interior.ColorIndex <> 43 Then
        bl = False
    Else
        bl = True
    End If
    arr(n) = bl
    n = n + 1
Next cell
CheckColor = arr
End Function

我使用的公式如下:

=SUMPRODUCT((V40:V50="B")*CheckColor(W40:W50))

我得到的答案是 6,这是错误的。

【问题讨论】:

  • 为什么不用COUNTIF 而不是SUMPRODUCT
  • 我在某个地方搜索并阅读了 SUMPRODUCT 可以更好地适应功能
  • 我认为(但不确定)您的函数将CheckColor(W40:W50) 计算为唯一值,因此执行=SUMPRODUCT(--(V40:V50="B");0) 将抛出#Value,因为参数大小不同;你有能力尝试一步一步的公式计算吗?
  • 哦!我现在知道了。但是我还在学习 VBA,所以我不知道如何实现它
  • 也许= SUMPRODUCT( ( V40:V50 = "B" ) * CheckColor( W40:W50 ) ) ?

标签: excel excel-formula vba


【解决方案1】:

列范围的数组有点不同Variant(1 To 11, 1 To 1)

Function CheckColor(rng As Range)
    Dim arr()
    ReDim arr(1 To rng.Count, 1 To 1) 
    ' arr = rng.Value2   ' arr Type in the Locals window shows as Variant(1 To 11, 1 To 1)
    For i = 1 To rng.Cells.Count
        arr(i, 1) = rng.Cells(i, 1).Interior.ColorIndex = 43
    Next i
    CheckColor = arr
End Function

【讨论】:

  • 我猜你想通了。这仅适用于传递范围的第一列。例如对于A3:C3,它将只检查A3:A3中的单元格
【解决方案2】:

您可以在没有 VBA 的情况下执行此操作,但您需要一个“帮助”列。

使用名称CellColour 和公式=GET.CELL(63,Sheet1!$B1) 创建一个命名范围

使用您的示例(假设它从单元格 A1 开始),在单元格 C1:C11 中输入此公式:=CellColour。从您的屏幕截图来看,它应该返回 43 为绿色。

然后,您可以使用此公式在 B 列中用绿色计算 A 列: =COUNTIFS($A$1:$A$11,"B",$C$1:$C$11,43)

背景色:How to count cells in a range with a value less than another cell in excel?

字体颜色:Excel formula to get cell color

【讨论】:

    【解决方案3】:

    编辑、修正

    在函数中,您给函数一个范围并将其与 ColorIndex 进行比较。这意味着您询问整个范围是否有颜色索引而不是之间的单元格。

    如果 Excel 自动引用正确的单元格并将它们与值进行比较,你会做什么,但我不会为你这样做。

    因此,您实际上可以通过不同的方式来管理它。首先,您无需像 Darren Bartrup-Cook 的意思那样在没有 vba 的情况下执行此操作,您可以使用辅助列来执行此操作并像这样编写它

     =If(V40="B";CheckColor(W40)
    

    然后用 Countif 计算真实值,或者你用 VBA 编写它,但是你需要像这样一个一个地循环遍历单元格:

    For x = 1 to 50 
      If Cells(x,10).Value = "b" AND Cells(x,11).ColorIndex = 43 Then
           counter = counter + 1
    Next x
    Endif
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多