Несмотря на то, что в целом вам лучше справиться со словарем, в сравнении If есть несколько ошибок:
If Application.IfError(Application.Match(Cells(i, 1).Value, arr, 0), 0) = 0 Then
В VBA имеется собственный IsError, который возвращает True / False.
If IsError(Application.Match(Cells(i, 1).Value, arr, 0), 0)) Then
Кроме того, arr является двумерным массивом;по сути он имеет как строки, так и столбцы.Соответствие рабочего листа может работать только с одним столбцом или одной строкой.Вам нужно «отрезать» то, что вы хотите с помощью Index.
If Not IsError(Application.Match(Cells(i, 1).Value, application.index(arr, 1, 0), 0), 0)) Then
Наконец, arr определяется как ReDim arr(2, k)
.Это делает его arr(0 to 2, 0 to k)
, поэтому в первом ранге есть три элемента ( 0, 1, 2 ), а не 2. На самом деле вы никогда не используете 0 в первом ранге.Должно быть,
k = 1
ReDim arr(1 to 2, 1 to k)
Завершите все это, и вы получите нечто подобное.
Option Explicit
Private Sub unique_arr()
Dim i As Long, lr As Long, k As Long, arr As Variant, m As Variant
'assign values to some vars
lr = Cells(Rows.Count, 1).End(xlUp).Row
k = 1
ReDim arr(1 To 2, 1 To k)
'loop through cells, finding duplicates and counting
For i = 1 To lr
m = Application.Match(Cells(i, 1).Value, Application.Index(arr, 1, 0), 0)
If IsError(m) Then
ReDim Preserve arr(1 To 2, 1 To k)
arr(1, k) = Cells(i, 1).Value
arr(2, k) = 1
k = k + 1
Else
arr(2, m) = arr(2, m) + 1
End If
Next i
'loop through array's second rank
For i = LBound(arr, 2) To UBound(arr, 2)
Cells(i, 3).Value = arr(1, i)
Cells(i, 4).Value = arr(2, i)
Next i
End Sub