Countif没有将TEXT转换为NUMBER

时间:2016-11-11 13:31:48

标签: excel excel-formula

我试图设置一个宏,它将比较多个列表,创建一个具有唯一值的交叉表,并显示每个列表中存在的值的次数。

我做得很好,只有一个例外。使用Countif(s)公式=COUNTIFS(Source!$A$2:$A$5;[@Values])时,它会内部转换"文字编号" (例如001,00000002)成数字(例如1,2)。我想避免这种行为,并在没有转换的情况下搜索完全相同的值。

示例数据:

List1      List2
1          0001
0001
2
00000002

我现在正在做什么(错误):

CompareListsWrong

我想得到什么(预期):
CompareListsExpected

我的问题:
我怎样才能完全统计列表中的值,而无需进行内部转换"文本数字"数字?

2 个答案:

答案 0 :(得分:1)

此数组公式可能适合您:

=MIN(SUMPRODUCT(IF(LEN($A$2:$A$5)=LEN(Table1[@Values]),1,0)),SUMPRODUCT(IF($A$2:$A$5=Table1[@Values],1,0)))

Put和 CTRL + SHIFT + ENTER 。在Table1[@Values]中,Table1是您的表名。

答案 1 :(得分:0)

我用简单的UDF解决了这个问题。

Function countifsExact(criteria_range As Range, criteria As String) As Long
    Dim cell As Range
    For Each cell In criteria_range
        If cell = criteria Then
            countifsExact = countifsExact + 1
        End If
    Next cell
End Function

<强> EDIT1
我使用Writing efficient VBA UDFs (Part 1) by Charles WilliamsWriting efficient VBA UDFs (Part 2) by Charles Williams中给出的一些建议制作了另一个版本的UDF 主要是:

  • 将条件_范围一次存储在Variant变量中,避免每次VBA程序将数据从Excel单元格传输到VBA变量时产生大量开销
  • 使用Range.Value2属性,而不是Range.Value
  • 使用excel MATCH函数获取排序范围内的起点,并在值更改时退出。

<强> EDIT2
然而,一个更好的解决方案是使用SUMPRODUCT公式:

=SUMPRODUCT(--(EXACT(Source!$A$2:$A$5;[@Values])))