2017-08-01 9 views
0

これは私にとって初めてのものです。私は私のwsの列にいくつかの異なる値をカウントしようとしている、問題は同じ値が何回も繰り返され、私は一度だけ数えたいと思う。いくつかの友人は私のコードを助けようとしましたが、私は今や失われています。たとえば、なぜ私が関数を使用しているのか分からない、あるいはなぜ "Option Explicit"をその上に置く必要があるのかアイデアは大歓迎です。Excelワークシートの列で一意の値を数えます。

Option Explicit  

Function CountUnique(datarange As Range) 
Dim datarange 
Dim CheckCell 
Dim Counter As Double 
Counter = 0 

For Each CheckCell In datarange.Cells 
    Counter = Counter + (1/(WorksheetFunction.CountIf(datarange, CheckCell.Value))) 
Next 

CountUnique = Counter 

End Function 
+0

を呼び出します。 VBAが唯一の方法であると分かっているならば、ADODB(ワークブックはドライブに保存する必要があります)を介して集計関数を使用するSQL Distinctやループ内の辞書を使用してください。 – omegastripes

答えて

0

オプションは、明示的に使用されているすべての変数を宣言する必要があります。 DimとRedimを使用することで、コードを簡単にデバッグできるようになります。

なぜそれが関数なのかは、コーダーまでです。あなたがやろうとしていることは、サブマクロでもやっている可能性があります。関数には変数を与えることによって関数が呼び出されます。大規模なプログラムでは、これは物事を劇的に整理することができます。

ここでは、関数を呼び出すサブの例を示します。テストを実行することにより

Option Explicit 

Function CountUnique(datarange As Range) 
Dim CheckCell 
Dim Counter As Double 
Counter = 0 

For Each CheckCell In datarange.Cells 
    Counter = Counter + (1/(WorksheetFunction.CountIf(datarange, CheckCell.Value))) 
Next 

CountUnique = Counter 
Msgbox Counter 
End Function 

()、それはあなたがそのピボットテーブルを作成することによって達成することができます機能に

Sub test() 
    Dim rag As Range 
    Set rag = Range("A1:A23") 
    Call CountUnique(rag) 
    End Sub 
+0

それは働いた、ちょうどいくつかを変えなければならなかった。範囲を設定し、msgを表示する代わりに結果を印刷するセルを選択するようなものです。どうもありがとう。今私はそれを速くしようとしているが、私は多くをすることができなくなるのではないかと恐れている。 –

0

方法について:述べられたときに明示的な

Option Explicit 

Function CountUnique(datarange As Range) As Long 
    Dim c As Collection, r As Range 
    Set c = New Collection 
    On Error Resume Next 
     For Each r In datarange 
      c.Add r.Value, CStr(r.Value) 
     Next r 
    On Error GoTo 0 
    CountUnique = c.Count 
End Function 

enter image description here

関連する問題