2016-10-04 6 views
0

Ich verwende den folgenden Code, um alle eindeutigen Werte in einer Spalte mit Strings in einem Array zu speichern, und dann erhalte ich die Anzahl der eindeutigen Werte durch Zählen der Länge des Arrays.VBA - Abrufen eindeutiger Werte aus einer Spalte ohne Verwendung einer geteilten Zeichenfolge

Dim tmp As String 
Dim prNumbers() As String 
Dim arrLen As Integer 
Dim lastRow As Integer 
Dim txt As String 

lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 

Dim rngPR As Range 
Set rngPR = Range("B2:B" & lastRow) 

If Not rngPR Is Nothing Then 
    For Each cell In rngPR 
     If (cell <> "") And (InStr(tmp, cell) = 0) Then 
      tmp = tmp & cell & "|" 
     End If 
    Next cell 
End If 

If Len(tmp) > 0 Then tmp = Left(tmp, Len(tmp) - 1) 

prNumbers = Split(tmp, "|") 

'Find the array length 
arrLen = UBound(prNumbers) + 1 

Allerdings, wenn ich diesen Code ausführen, arrLen eine Nummer kleiner als die tatsächliche Menge an eindeutigen Einträge in der Spalte ist (ich weiß, dass dies durch eine manuelle Datenprüfung für eindeutige Einträge zu tun.) Die Daten in der Spalte tun enthält kein "|" Zeichen, nur Zahlen.

Was könnte das Problem sein? Und gibt es eine alternative Möglichkeit, die Anzahl eindeutiger Einträge in ein Array zu bekommen und deren Länge zu bestimmen?

+1

http://www.get-digital-help.com/2010/10/22/excel-udf-count-unique-distinct-values-in-a-large -dataset/ – Slai

Antwort

3

Diese Prüfung ist wahrscheinlich das Problem:

(InStr(tmp, cell) = 0) 

Wenn z.B. Eine Zelle ist hello, und eine spätere Zelle ist ello, sie wird nicht eingeschlossen, da ello Teil von hello und somit die tmp Zeichenfolge ist.

mit Ihrer aktuellen Methode zu gehen, es

(InStr(tmp, "|" & cell & "|") = 0) 

ändern und mit einer anfänglichen tmp = "|" beginnen.

Also, wenn die aktuellen tmp|foo|hello|bar| ist, suchen Sie es für |ello| und einen 0.


Einen einfachen Weg wären beispielsweise zu verwenden eine Sammlung, prüft jede neue Zelle, wenn sie bereits in der Sammlung enthalten ist.

Siehe http://www.cpearson.com/Excel/CollectionsAndDictionaries.htm ->KeyExistsInCollection

+0

Danke dafür. Ich bekomme jetzt mehr Einträge in meinem Array, aber immer noch nicht alle der einzigartigen. Ich sehe nicht wirklich, wie das möglich ist! (Ich habe 722 eindeutige Einträge und bekomme ein Array von nur 698 Länge). Außerdem sollte ich das "|" am Anfang nochmal vor dem Split? –

+0

Hmm, interessant. Können Sie eine Beispielarbeitsmappe hochladen, die das Problem auf einem Datei-Hoster zeigt? Und ja, der Start '" | "sollte vor dem Teilen entfernt werden, um ein leeres Array-Element zu vermeiden. – Andre

+0

@CornelVerster Vielleicht haben Sie Zellen mit dem gleichen Wert aber unterschiedlichen Zahlenformat? Sie können 'cell.Text' anstelle von' cell' versuchen – Slai

Verwandte Themen