2016-11-11 56 views
0

我试图设置的一个宏,将比较多个列表,创建交叉表具有唯一值并显示值多少次出现在每个列表。COUNTIF没有将文本转换为NUMBER

我做的不错,但有一个例外。当使用式Countif(s)=COUNTIFS(Source!$A$2:$A$5;[@Values]),它internaly转换 “文本数”(例如001,00000002)转换成数字(例如,1,2)。我想避免这种行为,并搜索完全相同的值,而无需转换。

示例数据:

List1  List2 
1   0001 
0001 
2 
00000002 

什么我得到现在(错误的):

CompareListsWrong

我想获得(预期):
CompareListsExpected

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

回答

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变量存放条件范围一次每次避免大的开销,而不是范围的从Excel小区到VBA可变
  • VBA程序传输数据使用Range.Value2属性。值
  • 使用Excel MATCH函数来获得在有序区间的起点,对价值变动退出。

EDIT2
然而,一个更好的解决方案是使用SUMPRODUCT公式为这样:

=SUMPRODUCT(--(EXACT(Source!$A$2:$A$5;[@Values]))) 
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是你的表名。

+0

谢谢您的公式。我使用VBA解决方案。 –