# Excel: Kleinstes Datum von Zelle, bedingt von anderen Zellen



## multitasker (3. März 2016)

Hallo,
ich benötige das kleinste Datum, das sich in einer Spalte befindet. Es dürfen jedoch nur die Zellen mit Datum berücksichtigt werden, wenn sich in der gleichen Zeile in einer anderen Spalte ein bestimmter Wert befindet.

Z.B.

A1 eins     
A2 zwei
A3 drei
A4 eins

B1  01.01.2009
B2  01.05.2002
B3  04.03.2016
B4  04.12.2005

Nimm kleinster Wert von Spalte B, wenn Wert in Spalte A gleich "eins".

Ergebnis: 04.12.2005

Geht das in einer Funktion abzubilden?


----------



## Yaslaw (4. März 2016)

Ich weiss, es geht auch einfacher. Aber es ist nun mal eine Schwäche von mir, dass ich Funktionen immer so schreibe, dass sie Breit möglichst anwendbar sind


```
'/**
' * @example                =getLeastFilteredValue(B1:B4;A1:A4;"eins")
' * @example                =getLeastFilteredValue(B1:B4;A1:A4;"eins"; "zwei")
' * @param  Range           Range, der die Datumliste enthält
' * @param  Range           Range der die Filtervalues enthält
' * @param  Array<Variant>  Value nachdem gefiltert werden soll. Es können belibig viele Argumente übergeben werden
' * @return Variant
' */
Public Function getLeastFilteredValue(ByRef iDateRng As Range, ByRef iFilterRng As Range, ParamArray iFilterValues() As Variant) As Variant
    Dim rowNr As Long
    
    If iDateRng.Rows.Count <> iFilterRng.Rows.Count Then
        'TODO: Fehler sauber abfangen. Die Ranges sind verschieden lang
        Err.Raise vbObjectError
    End If
      
    'Mal einDatum weit in der Zukunft definieren
    getLeastFilteredValue = #12/31/9999#
    
    'Alle Filterfelderdurchgehen
    For rowNr = 1 To iFilterRng.Rows.Count
        'Prüfen on der Wert aus dem Filterrange einem Filterwert entspricht
        If inArray(CVar(iFilterValues), iFilterRng(rowNr, 1).Value) Then
            'Prüft ob der entsprechende Wert aus dem Datenrange kleiner als der aktuelle Wert ist. Wennja, diesen übernhemen
            If iDateRng(rowNr, 1).Value < getLeastFilteredValue Then getLeastFilteredValue = iDateRng(rowNr, 1).Value
        End If
    Next rowNr
    
    'Falls nix gefunden wurde, das Datum zurücksetzen
    If getLeastFilteredValue = #12/31/9999# Then getLeastFilteredValue = Null
End Function

'/**
' * Prüft ob ein Wert in einem Array vorhanden ist
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/functions/array/index#inarray
' * @param  Array
' * @param  Gesuchter Wert
' * @return Boolean
'*/
Private Function inArray(ByRef iArray As Variant, ByVal iValue As Variant) As Boolean
On Error GoTo Err_Handler
    'Falls iArray kein initialisierter Array ist, gehts zur Fehlerbahndlung
    Dim i As Long: For i = LBound(iArray) To UBound(iArray)
        If iValue = iArray(i) Then inArray = True: Resume Exit_Handler
    Next i
 
Exit_Handler:
    Exit Function
Err_Handler:
    'Array ist nicht initialisiert. Somit gibts kein Treffer
    Resume Exit_Handler
End Function
```

Aufruf:

```
=getLeastFilteredValue(B1:B4;A1:A4;"eins")
```


----------

