Мне нужно получить четкое количество (сколько раз происходит уникальное значение) на основе нескольких параметров. Таблица выглядит примерно так:

http://i.imgur.com/kXNSyvH.png

Получение суммы не проблема, я использую SUMIFS() с несколькими параметрами. Моя проблема с получением отличного счета.

Идентификатор пользователя - это не число, а текст.
Item-ID - это число.
Сумма - это число.
Дата - это дата.

1 ответ1

0

Я нашел решение, используя VBA. Вот кодекс для всех, кто заинтересован:

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

Сначала я получаю начальную дату и конечную дату из названных ячеек

Dim MAnfang     As Long
MAnfang = Range("Monatsanfang").Value2

Dim MEnde       As Long
MEnde = Range("Monatsende").Value2

Затем я получаю Item-Id также из именованной ячейки и преобразую его в строку

Dim ItemID     As String
ItemID = CStr(Range("ItemID").Value)

Затем я устанавливаю Sheet, получаю последнюю строку, определяю Filterarea и строку Unique.

Dim FSheet      As Worksheet
Set FSheet = Sheets("Faktura")

Dim k           As Integer
k = FSheet.Range("M1").End(xlDown).Row

Dim FBereich    As Range
Set FBereich = FSheet.Range("A1:X" & k)

Dim UniqueColRange As Range
Set UniqueColRange = FSheet.Range("T2:T" & k)

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

Range("Endresult").Value = FilterAndGetCount(FSheet, FBereich, 12, MAnfang, MEnde, 6, Array(ItemID), UniqueColRange )

End Sub

Private Function FilterAndGetCount(FilterSheet As Worksheet, FilterBereich As Range, DFeld As Integer, DStart As Long, DEnde As Long, LNFeld As Integer, LNArray As Variant, UniqueColumnRange As Range)

    FilterBereich.AutoFilter _
    Field:=DFeld, _
        Operator:=xlAnd, _
        Criteria1:=">=" & DStart, _
        Criteria2:="<=" & DEnde

    FilterBereich.AutoFilter _
        Field:=LNFeld, _
        Operator:=xlFilterValues, _
        Criteria1:=LNArray

    Total = getVisibleArray(UniqueColumnRange)
    FilterAndGetCount = getUniqueCount(Total) - 1
    If FilterSheet.AutoFilterMode Then FilterSheet.ShowAllData

End Function

Private Function getUniqueCount(varray As Variant) As Integer

    Dim dict As Object
    Set dict = CreateObject("scripting.dictionary")
    Dim element As Variant

    For Each element In varray
        If dict.exists(element) Then
            dict.Item(element) = dict.Item(element) + 1
        Else
            dict.Add element, 1
        End If
    Next

    getUniqueCount = dict.Count

End Function

Private Function getVisibleArray(vrange As Range) As Variant

    Dim i As Integer
    i = 0

    Dim VisibleArray() As Variant
    Dim VisibleArrayLength As Integer
    VisibleArrayLength = vrange.SpecialCells(xlCellTypeVisible).Count
    ReDim VisibleArray(VisibleArrayLength)

    For Each c In vrange.SpecialCells(xlCellTypeVisible)
        VisibleArray(i) = c.Value
        i = i + 1
    Next c

    getVisibleArray = VisibleArray

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .