Легко выполнимый путем злоупотребления MATCH
.
Первая процедура - это всего лишь тест для проверки, а также пример того, как должны быть объявлены вещи (и, наоборот, какие декларации вы должны изменить, если вам нужны другие типы переменных и т. Д.).
Sub testCaller()
Dim testArr1() As Variant ' <~~ Variable type must match
Dim testArr2() As Variant ' the variable required in the
Dim testArr3() As Variant ' actual procedure
Dim testArr4() As Variant
testArr1 = Array("abc", "abc", "def", "abc", "asdf", "bcd")
testArr2 = Array("abc", "asdf")
Call listUniqueArrayContents(testArr1(), testArr2())
testArr3 = Array(1, 2, 3, 4, 5)
testArr4 = Array(1, 2)
Call listUniqueArrayContents(testArr3(), testArr4())
End Sub
Sub listUniqueArrayContents(arr() As Variant, arrCompare() As Variant)
Dim uniqueValues() As Variant
Dim mIndex As Variant
Dim j As Integer
j = 0
For i = 0 To UBound(arr())
' Reset the placeholder for our MATCH values
mIndex = Null
' Disable errors, otherwise you get popups every time there's a unique value
On Error Resume Next
' Call MATCH function
mIndex = Application.WorksheetFunction.match(arr(i), arrCompare(), 0)
' Restore normal error handling
On Error GoTo 0
If mIndex < 1 Or IsNull(mIndex) Then
' If match variable is Null, it means the value was unique
' So we'll write that value to a separate array to keep track of it
If j = 0 Then ReDim Preserve uniqueValues(0 To 0)
If j <> 0 Then ReDim Preserve uniqueValues(UBound(uniqueValues()) + 1)
uniqueValues(UBound(uniqueValues)) = arr(i)
j = j + 1
End If
Next i
Debug.Print "--Unique values:--"
For k = LBound(uniqueValues()) To UBound(uniqueValues())
Debug.Print uniqueValues(k)
Next k
Debug.Print "--End--"
End Sub
Который, для тестовых примеров, дает ожидаемые:
--unique значения: -
Защиту
BCD
--End--
--unique значения: -
--End--
В качестве альтернативы вы можете изменить это на Function
и вернуть ему массив уникальных значений.
Изменить это:
Sub listUniqueArrayContents(arr() As Variant, arrCompare() As Variant)
к этому:
Function listUniqueArrayContents(arr() As Variant, arrCompare() As Variant) As Variant
и заменить в последнюю наиболее For
-loop с listUniqueArrayContents = uniqueValues()
может быть проще использовать словарь. Посмотрите здесь: http://stackoverflow.com/questions/915317/does-vba-have-dictionary-структуры – sous2817