excel 计算表中动态(溢出)数组元素的出现次数

62o28rlo  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(58)

我正在使用新的动态结果函数,如unique、filter、sort、A6#等。我喜欢它们的大小与返回的项数相适应。
我在一个Excel表中有一个大型数据集(数百列和数千行)。我使用unique/filter函数将满足条件的一列的唯一值提取到一个动态数组中,没有任何问题。
现在,我想以动态的方式计算每个返回值的出现次数,以便返回值的范围随着唯一函数动态返回的唯一值的数量而变化。我可以在筛选器函数周围使用count函数,一次计算一个值,但结果不是动态的,需要我手动将函数复制/删除到正确数量的单元格中。
总而言之,我正在寻找一种方法来计算表列中满足某个条件并且等于动态数组中所有值的项。结果维度应该与动态数组的维度一致。
我从表中的一些示例数据开始:
| 颜色|类型|成本|标准|
| --|--|--|--|
| 红色| 1 | 1 |真正|
| 蓝色| 2 | 2 |虚假|
| 红色| 1 | 3 |真正|
| 黄色| 1 | 2 |真正|
| 橙子| 1 | 3 |虚假|
| 红色| 2 | 1 |真正|
| 橙子| 2 | 2 |虚假|
| 黄色| 1 | 3 |真正|
| 橙子| 2 | 2 |虚假|
| 蓝色| 1 | 1 |真正|
| 红色| 1 | 3 |真正|
| 蓝色| 2 | 2 |虚假|
| 黄色| 2 | 1 |真正|
| 红色| 2 | 3 |虚假|
| 红色| 2 | 1 |虚假|
(颜色类型成本标准红色1 1真蓝色2 2假红色1 3真黄色1 2真橙色1 3假红色2 1真橙色2 2假黄色1 3真橙色2 2假蓝色1 1真红色1 3真蓝色2 2假黄色2 1真红色2 3假红色2 1假)
所需的输出是一个包含两列的范围:条件为真时的唯一颜色,以及条件为真时该颜色出现的次数。
生成第一列很简单:

=UNIQUE(FILTER(Table1[Color],Table1[Criteria]))

字符串
在此示例中,此函数返回一个三行单列:Red Yellow Blue使用返回单个单元格的公式计算该区域中单个成员的出现次数非常简单:

=COUNT(FILTER(Table1[Cost],Table1[Criteria]*(Table1[Color]=H10)))


在这里我使用了Cost,因为它是数值型的,与Count配合使用效果更好,例如,H10是“Red”上面的动态数组中的一个单元格。
这个函数可以精确地计算我想要的值,但是它不会随着返回到上表的颜色数的变化而收缩和扩展,所以我必须进去删除/复制公式到相应的区域。由于我的用户会不断地更改条件列,这就经常会留下长度不同的两列。
接下来,我将这个公式转换为LET版本,得到了相同的结果。

=LET(lookup,H10,in,Table1[Color],cnt,Table1[Cost],crit,Table1[Criteria],
COUNT(FILTER(cnt,crit*(lookup=in))))


然后,我将公式(H10)中对该颜色的引用替换为包含该颜色的动态数组(H10#),结果是一个值为0的单元格。
然后,我删除了count函数,只留下filter函数,它返回了NA。因此,filter函数没有处理H10#引用,而是返回了一个值NA。
我决定我需要写一个可以处理动态引用的计数函数,我最终得到了:

Public Function DynamicCount(SearchIn, LookFor As Variant As Variant
Dim arr As Variant
Dim idx As Long

    ReDim arr(1 To LookFor.Rows.Count, 1 To 1)
        
    For idx = LBound(arr, 1) To UBound(arr, 1)
        arr(idx, 1) = Application.WorksheetFunction.CountIf(SearchIn, LookFor(idx, 1))
    Next idx
    
    DynamicCount = arr
    
End Function


我首先在没有标准的情况下进行了测试,只是输入:

=DynamicCount(Table1[Color],H10#)


这可以从单个单元格返回以下溢出:
6 3 3
然后,我尝试使用以下方法应用标准:

=DynamicCount(FILTER(Table1[Color],Table1[Criteria]),H10#)


这返回了一个值错误!我不确定发生了什么。我只计算了筛选器部分:

=FILTER(Table1[Color],Table1[Criteria])


这返回了一个8种颜色的溢出列表。在稍微玩了一下vba代码后,我认为问题是filter函数将一个范围转换为变量数组。不知道如何使用它们。做了一些msgbox调试,当SearchIn参数是变量(而不是范围)时,它似乎在下面的行崩溃。
第一个月
任何帮助都将不胜感激,无论是与访问变量数组或其他方法来解决这个问题。一定有更简单的方法...谢谢

wgeznvg7

wgeznvg71#

尝试使用MMIDE()--不需要任何LAMBDA()辅助函数,也不需要VBA!!
x1c 0d1x的数据
·单元格F2中使用的公式

=LET(
     α, FILTER(HSTACK(Table_1[Color],Table_1[Criteria]),Table_1[Criteria]),
     Ψ, TAKE(α,,1),
     φ, DROP(α,,1),
     UNIQUE(HSTACK(Ψ,MMULT(N(Ψ=TOROW(Ψ)),φ))))

字符串
或者,一个更短的方法:



·单元格F2中使用的公式

=LET(
     α, HSTACK(Table_1[Color],MMULT(N(Table_1[Color]=TOROW(Table_1[Color])),Table_1[Criteria])),
     UNIQUE(FILTER(α, DROP(α,,1))))

lc8prwob

lc8prwob2#

像这样尝试BYROW-不需要重复:

=LET(uniqueColors,UNIQUE(FILTER(table1[Color],table1[Criteria])),
     cntByColor,BYROW(uniqueColors,LAMBDA(r,SUMPRODUCT((table1[Color]=r)*(table1[Criteria])))),
     HSTACK(uniqueColors,cntByColor))

字符串
x1c 0d1x的数据

相关问题