Countif没有将TEXT转换为NUMBER

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

我做得很好,只有一个例外。 当使用Countif(s)公式=COUNTIFS(Source!$A$2:$A$5;[@Values]) ,它内在地将“文本号”(例如001,00000002)转换为数字(例如1,2)。 我想避免这种行为,并search完全相同的价值,而无需转换。

示例数据:

 List1 List2 1 0001 0001 2 00000002 

我现在得到的(错误):

CompareListsWrong

我想要什么(预期):
CompareListsExpected

我的问题:
我如何计算清单中的值,没有内部转换“文本号码”数字?

这个数组公式可能适合你:

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

把和CTRL + SHIFT + ENTER 。 在Table1[@Values]Table1是您的表名称。

我用简单的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 

编辑1
我使用Charles Williams编写高效的VBA UDF(第1部分)和Charles Williams 编写高效的VBA UDF(第2 部分)给出的一些build议,制作了另一个UDF版本。
主要是:

  • 每次将VBA程序将数据从Excel单元传输到VBAvariables时,将criteria_range存储在Variantvariables中,避免了大量开销
  • 使用Range.Value2属性,而不是Range.Value
  • 使用excel MATCH函数在sorting的范围内获取起始点,并在值改变时退出。

编辑2
然而,更好的解决scheme是使用SUMPRODUCT公式:

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