Einträge in gefilterter Liste ohne Duplikate
#1
Guten Tag,

Grundlage ist die Formel
aus http://www.herber.de/excelformeln und bitte suchen ... Einträge in gefilterter Liste ohne Duplikate zählen (339)
=SUMMENPRODUKT(TEILERGEBNIS(3;INDIREKT("B"&ZEILE(2:99)))*(VERGLEICH(B2:B99&"";B2:B99&"";0) =ZEILE(1:98)))

Ich habe die Formel so angepasst, dass diese auch bei einfügen von Spalten vor der Summenspalte funktioniert

Die Summenspalte ist als Bereich SummenSpalte definiert!
Formel:
=SUMMENPRODUKT(TEILERGEBNIS(9;INDIREKT(LINKS(ADRESSE(1;SPALTE(SummenSpalte);4);
LÄNGE(ADRESSE(1;SPALTE(SummenSpalte);4))-1)&ZEILE(INDIREKT(2&":"&ANZAHL2($A:$A)))))*(VERGLEICH(SummenSpalte&"";SummenSpalte&"";0) =ZEILE(INDIREKT(1&":"&ANZAHL2($A:$A)-1))))

Beim Versuch diese Formel mit Evaluate auszuwerten bin ich bisher gescheitert!

Alternativ habe ich einen eine Code geschrieben:

    
Sub test_aufruf()
    Dim summe As Double
    summe = FilterSummeOhneDup(ThisWorkbook.ActiveSheet, 3, 2, 1, 83, 84)
End Sub
    
Function FilterSummeOhneDup(wksZiel As Worksheet, lStartRow As Long, lFilterZeile As Long, lColumnCount As Long, _
    lSumColumnFilter As Long, lSummeFilter As Long) As Double

    Dim i As Long, iX As Long, iZ As Long, zCount As Long, zA As Long
    Dim vSummeFilter As Variant, SumZaehler As Long
    Dim vArrayFilter As Variant, vArraySumme As Variant, lRowAbzug As Long
    Dim a As Range
    On Error Resume Next
    With wksZiel
        i = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
        ReDim vArrayFilter(i - lStartRow)
        ReDim vArraySumme(i - lStartRow)
        ReDim vZaehler(i * 2, 1)
        If i > 1 Then
            If wksZiel.FilterMode Then
                zCount = .Range(.Cells(lFilterZeile, lColumnCount), .Cells(lFilterZeile, i)) _
                .SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count
                For iX = lStartRow To i
                    If .Rows(iX).EntireRow.Hidden = False Then
                        vArrayFilter(iX - lStartRow) = .Cells(iX, lSumColumnFilter)
                        vArraySumme(iX - lStartRow) = .Cells(iX, lSummeFilter)
                    End If
                Next iX
            Else
                zCount = i
                For iX = lStartRow To i
                    vArrayFilter(iX - lStartRow) = .Cells(iX, lSumColumnFilter)
                    vArraySumme(iX - lStartRow) = .Cells(iX, lSummeFilter)
                Next iX
                '      Stop
            End If
        End If
    End With
    zA = 0
    vSummeFilter = 0
    For iX = 0 To UBound(vArrayFilter)
        zA = zA + 1
        If zA > zCount Then
            '                       Stop
            GoTo Weiter
        End If
        vZaehler(iZ, 0) = vArrayFilter(iX)
        vZaehler(iZ, 1) = 1
        SumZaehler = 0
        For iZ = 0 To iZ
            If vZaehler(iZ, 0) = vArrayFilter(iX) Then
                SumZaehler = vZaehler(iZ, 1) + SumZaehler
                'Exit For
            End If
        Next iZ
        If SumZaehler = 1 Then
            vSummeFilter = vSummeFilter + (vArraySumme(iX) * 1)
        End If
        iZ = iZ + 1
    Next iX
    Weiter:
    FilterSummeOhneDup = Round(vSummeFilter, 4)
End Function

Code eingefügt mit: Excel Code Jeanie

Leider ist der Code bei Tabellen mit vielen Zeilen sehr langsam, während die Formel

=SUMMENPRODUKT(TEILERGEBNIS(9;INDIREKT(LINKS(ADRESSE(1;SPALTE(SummenSpalte);4);LÄNGE(ADRESSE(1;SPALTE(SummenSpalte);4))-1)&ZEILE(INDIREKT(2&":"&ANZAHL2($A:$A)))))*(VERGLEICH(SummenSpalte&"";SummenSpalte&"";0) =ZEILE(INDIREKT(1&":"&ANZAHL2($A:$A)-1))))
oder
=SUMMENPRODUKT(TEILERGEBNIS(9;INDIREKT("B"&ZEILE(2:99)))*(VERGLEICH(B2:B99&"";B2:B99&"";0) =ZEILE(1:98)))
sehr schnell ist.


Wie muss ich die Formeln =SUMMENPRODUKT(TEILERGEBNIS(9;INDIREKT("B"&ZEILE(2:99)))*(VERGLEICH(B2:B99&"";B2:B99&"";0) =ZEILE(1:98)))
anpassen damit sie mit Evaluate auswertbar ist??
Wobei die Summenspalte flexibel bleiben muss!

Besten Dank für Tipps

Gruß Rolf
Top
#2
P u s h
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#3
Hallöchen,

wie sehen denn die bisherigen Versuche aus?
Bei der Formel
=SUMMENPRODUKT(TEILERGEBNIS(9;INDIREKT("B"&ZEILE(2:99)))*(VERGLEICH(B2:B99&"";B2:B99&"";0) =ZEILE(1:98)))
solltest Du erst mal schauen, wie Du das INDIREKT gesondert berechnest und die Formel dann mit dem Ergebnis evaluierst.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste