i_saw_dronesによって提示されたアイデアに基づいて、私は強くお勧めしScripting.Dictionary
ます。ただし、これはOn Error Resume Next
以下に示すようにせずに行うことができます。Microsoft Scripting Runtime
また、彼の例では、ライブラリをリンクする必要があります。私の例では、リンクを作成せずにこれを行う方法を示します。
また、これはExcelで行っているため、手順1で配列を作成する必要はまったくありません。以下の関数は、完全に繰り返されるセルの範囲を受け入れます。
(すなわちUniqueCount = UniqueEntryCount(ActiveSheet.Cells)
またはUniqueCount = UniqueEntryCount(MySheet.Range("A1:D100")
)
Function UniqueEntryCount(SourceRange As Range) As Long
Dim MyDataset As Variant
Dim MyRow As Variant
Dim MyCell As Variant
Dim dic As Object
Dim l1 As Long, l2 As Long
Set dic = CreateObject("Scripting.Dictionary")
MyDataset = SourceRange
For l1 = 1 To UBound(MyDataset)
' There is no function to get the UBound of the 2nd dimension
' of an array (that I'm aware of), so use this division to
' get this value. This does not work for >=3 dimensions!
For l2 = 1 To SourceRange.Count / UBound(MyDataset)
If Not dic.Exists(MyDataset(l1, l2)) Then
dic.Add MyDataset(l1, l2), MyDataset(l1, l2)
End If
Next l2
Next l1
UniqueEntryCount = dic.Count
Set dic = Nothing
End Function
""
上記はnull文字列を個別の値としてカウントすることに注意することも重要かもしれません。これを望まない場合は、コードを次のように変更するだけです。
For l1 = 1 To UBound(MyDataset)
For l2 = 1 To SourceRange.Count / UBound(MyDataset)
If Not dic.Exists(MyDataset(l1, l2)) And MyDataset(l1, l2) <> "" Then
dic.Add MyDataset(l1, l2), MyDataset(l1, l2)
End If
Next l2
Next l1