2016-10-04 4 views
0

文字列のすべての一意の値を配列に保存するために、次のコードを使用して、長さを数えて一意の値を取得します配列の私はこのコードを実行するとVBA - 分割された文字列を使用せずに列から一意の値を取得

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 

しかし、arrLenは列内の一意のエントリの実際の量よりも少ない数である(私は一意のエントリのためのマニュアルデータチェックを行うことで、これを知っている。)列のデータがありません"|"文字、数字のみ。

何が問題なのですか?また、一意のエントリの量を配列に取得し、その長さを決定する別の方法がありますか?

+1

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

答えて

3

この検査はおそらく問題です:

(InStr(tmp, cell) = 0) 

例えばもしセルがhelloであり、後のセルがelloである場合、ellohelloの一部であり、したがってtmp文字列の一部であるため、含まれません。

は、あなたの現在の方法で行く

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

に変更し、初期tmp = "|"を開始します。

現在tmp|foo|hello|bar|であれば、あなたは|ello|のためにそれを検索し、より簡単な方法は、例えば使用することです0


を取得新しいセルがすでにコレクションに含まれているかどうかをチェックするコレクション。

http://www.cpearson.com/Excel/CollectionsAndDictionaries.htmを参照してください - >KeyExistsInCollection

+0

ありがとうございます。私は今、私の配列に多くのエントリを取得しますが、依然としてユニークなものすべてではありません。私はそれがどのように可能なのか本当に見ていない! (私は722個のユニークなエントリを持ち、長さが698の配列しか得られません)。また、 "|"スプリットの前にもう一度スタートしますか? –

+0

うーん、興味深い。ファイルのホスト担当者に問題を示すサンプルワークブックをアップロードできますか?そして、空の配列要素を避けるために、開始する前に '' | ''を分割する前に削除する必要があります。 – Andre

+0

@CornelVersterおそらく、あなたは同じ値であるが異なる数値形式のセルを持っているだろうか? 'cell'の代わりに' cell.Text'を試すことができます – Slai

関連する問題