2016-11-11 96 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解決方案。 –