VBA::объединение массивов

Я создаю функцию поиска, которая позволяет пользователям одновременно искать до 3 разных свойств в базе данных (prop1,2 и 3), и я создал эту подпрограмму в VBA, поместив результаты для искомой опоры в массив. Однако теперь, когда у меня есть до 3 массивов, мне нужно объединить массивы, чтобы в результатах отображались только те данные, которые дублируются в массивах. Есть ли какие-либо советы о том, как 1) просматривать массивы только для свойств, которые ищет пользователь, и 2) брать только те данные, которые повторяются в окончательный массив, чтобы я мог отображать их в диапазоне результатов? Любая помощь приветствуется! Спасибо!


person Ren-How Harn    schedule 23.06.2011    source источник
comment
не могли бы вы показать нам часть своего кода и что вы пробовали? возможно, вы могли бы объединить свои массивы до конца вашего кода   -  person JMax    schedule 23.06.2011


Ответы (1)


Предполагая, что ваши записи взяты непосредственно из базы данных и, следовательно, уникальны для одного свойства, я могу придумать следующие шаги для простого решения:

  1. Объединить массивы вместе (prop1, prop2, prop3 > temp)
  2. Подсчет вхождений для каждого элемента (в этом примере код tempCount)
  3. Основываясь на знаниях о вхождениях, создайте окончательный массив (здесь он называется результат).

    Dim prop1() As Variant
    Dim prop2() As Variant
    Dim prop3() As Variant
    Dim temp() As Variant
    Dim tempCount() As Integer
    Dim result() As Variant
    
    ReDim temp(UBound(prop1) + UBound(prop2) + UBound(prop3) + 1)
    
    'merge arrays
    Dim i As Integer
    On Error Resume Next
        For i = 0 To UBound(temp)
        temp(i * 3) = prop1(i)
        temp(i * 3 + 1) = prop2(i)
        temp(i * 3 + 2) = prop3(i)
    Next i
    
    'count occurences
    ReDim tempCount(UBound(temp) + 1)
    Dim j As Integer
    For i = 0 To UBound(temp)
    tempCount(i) = 1
    For j = 0 To i - 1
    
    'comparison of elements
        If temp(i) = temp(j) Then
        tempCount(i) = tempCount(i) + 1
        End If
    Next j
    Next i
    
    ReDim result(UBound(temp) + 1)
    
    'if an element occurs 3 times, add it to result
    Dim count As Integer
    count = 0
    For i = 0 To UBound(tempCount)
        If tempCount(i) = 3 Then
            result(count) = temp(i)
            count = count + 1
        End If
    Next i
    

Чтобы проверить некоторые образцы, я добавил это в код. Он просто выводит массивы temp, result и tempCount в столбцы A, B и C.

'some sample arrays
prop1 = Array("a", "b", "c", "d", "e")
prop2 = Array("b", "c", "f")
prop3 = Array("b", "c", "d", "g")

'some sample Output

'temp
Cells(1, 1).Value = "temp:"
For i = 0 To UBound(temp)
    Cells(i + 2, 1).Value = temp(i)
Next i

'result
Cells(1, 2).Value = "result:"
For i = 0 To UBound(result)
    Cells(i + 2, 2).Value = result(i)
Next i

'count:
Cells(1, 3).Value = "count:"
For i = 0 To UBound(tempCount)
    Cells(i + 2, 3).Value = tempCount(i)
Next i

Примечания: tempCount просто содержит совокупное количество вхождений в точке, в которой просматривается элемент.

person adrianus    schedule 24.06.2011