2016-04-06 8 views
0

У меня есть два (не пустых) массива (вариантов) с числами. Я хотел бы перечислить все данные, находящиеся в первом массиве, и не во втором массиве.Excel vba Вариант поиска массива

Dim existingWorkerIDs() As Variant 
Dim newWorkerIDs() As Variant 

    For Each temp In newWorkerIDs 

     If existingWorkerIDs.contains(temp) Then 
      ...do sth... 
     End If 

    Next temp 

Возможно ли это?

+0

может быть проще использовать словарь. Посмотрите здесь: http://stackoverflow.com/questions/915317/does-vba-have-dictionary-структуры – sous2817

ответ

0

Легко выполнимый путем злоупотребления 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()

Смежные вопросы