Я нашел решение, используя 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