найти уникальные даты в массиве Excel VBA - PullRequest
1 голос
/ 14 февраля 2011

У меня есть набор данных, который содержит несколько измерений для каждого дня. Я уже поместил данные в массив VBA. Теперь я хотел бы создать массив с уникальными днями.

_Here is my dataset:_  
12/07/2010     3.5

12/07/2010     2.1

12/07/2010     2.2

12/08/2010     5.2

12/08/2010     3.2

12/09/2010     4.7

Вот что я хотел бы вернуть:

12/07/2010

12/08/2010

12/09/2010

Я рассмотрел несколько пользовательских функций для уникальных значений, но они работают с числовыми значениями, а не с типами дат.

Любая помощь очень ценится. Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Тип даты - это число ...

Простой способ - использовать коллекцию:

Sub Uniques()
    Dim oColl As New Collection

    Dim vArr As Variant
    Dim vItem As Variant
    Dim j As Long
    vArr = Range("A1:B6")
    On Error Resume Next
    For j = LBound(vArr) To UBound(vArr)
        oColl.Add vArr(j, 1), CStr(vArr(j, 1))
    Next j
    On Error GoTo 0

    For Each vItem In oColl
        Debug.Print vItem
    Next vItem
End Sub
2 голосов
/ 14 февраля 2011

Для целей фильтрации я бы использовал коллекцию. Я создал макет vArray, который будет представлять ваш собственный массив.

Коллекции не принимают один и тот же ключ дважды, поэтому будут отфильтровываться дублированные значения. В связи с тем, что «Ошибка возобновится далее», я настоятельно рекомендую вам иметь этот фрагмент кода отдельно в одной конкретной функции.

Sub test()

    Dim vItem As Variant
    Dim vArray(5) As Variant

    vArray(0) = CDate("12/07/2010")
    vArray(1) = CDate("12/07/2010")
    vArray(2) = CDate("12/07/2010")
    vArray(3) = CDate("12/08/2010")
    vArray(4) = CDate("12/08/2010")
    vArray(5) = CDate("12/09/2010")

    Dim colDates As Collection

    Set colDates = New Collection

    On Error Resume Next

    For Each vItem In vArray
        colDates.Add vItem, CStr(vItem)
    Next vItem

End Sub
1 голос
/ 14 февраля 2011

Нет простого способа сделать эту функцию.

Самое простое, что я могу придумать, это использовать функцию фильтра

Фильтр возвращает массив, содержащий значения из массива, которые соответствуют фильтру.

так логично:

arTargetArray as Array

For each Item in your_array
  value = Filter(arTargetArray, Item)
  if value null
    add item to  arTargetArray.
  end if
next each 

надеюсь, это немного поможет.

я знаю, что этот синтаксис не имеет ничего общего с vba, это просто логический подход, который я лично выбрал бы.

...