AW: Arrayformel für Texte?
JogyB
Hi.
Da es jetzt eh schon fertig ist, nun meine Version (ist nur durch die Fehlerprüfungen deutlich länger):
' Hinweise
' prodDaten ist der Bereich, in dem Prosukt A, Produkt B etc steht (hier A2:A4)
' bereichDaten ist der Bereich, in dem das test1, test2 etc. steht INKL. Überschrift!
' (hier B1:C4)
' gesProd ist eine Zelle, in dem das Produkt steht, das gesucht wird (hier G2)
' gesBereich ist eine Zelle, in der gesetuchte Produktbereucg stehr (hier H2)
Public Function suchVerkett(prodDaten As Range, _
bereichDaten As Range, gesProd As Range, gesBereich As Range) As Variant
Dim ergSpalte As Range
Dim founD As Range
Dim firstAddress As String
' Ein paar Überprüfungen
' darf nicht mehr als eine Spalte sein
If prodDaten.Columns.Count > 1 Then
suchVerkett = CVErr(2015)
Exit Function
' Muss genau eine Zeile mehr als der Suchbereich sein (eine ist die Überschrift)
ElseIf bereichDaten.Rows.Count <> prodDaten.Rows.Count + 1 Then
suchVerkett = CVErr(2015)
Exit Function
' Bereich zusammenhängen
ElseIf bereichDaten.Areas.Count <> 1 Or prodDaten.Areas.Count <> 1 Then
suchVerkett = CVErr(2015)
Exit Function
' darf nur eine Zelle sein
ElseIf gesProd.Cells.Count > 1 Or gesBereich.Cells.Count > 1 Then
suchVerkett = CVErr(2015)
Exit Function
End If
' Gibt es den Suchbereich überhaupt?
Set ergSpalte = bereichDaten.Rows(1).Find(gesBereich.Value)
If ergSpalte Is Nothing Then
suchVerkett = CVErr(xlErrNA)
Exit Function
End If
' suchspalte definiert festlegen (nur die Spalte mit dem Suchbegriff,
' nur die Zeilen von gesbereich ohne Überschrift
Set ergSpalte = Intersect(ergSpalte.EntireColumn, _
bereichDaten.Offset(1).Resize(bereichDaten.Rows.Count - 1))
With prodDaten
' Fängt nach der letzten Zelle an zu suchen, da er sonst die erste u.U.
' nicht als erstes findet
Set founD = .Find(gesProd.Value, .Cells(.Cells.Count))
' wenn nichts gefunden, dann raus
If founD Is Nothing Then
suchVerkett = CVErr(xlErrNA)
Exit Function
End If
firstAddress = founD.Address
Do
' Ergebnisstring aufbauen
suchVerkett = suchVerkett & IIf(suchVerkett = "", "", " ") & _
ergSpalte.Cells(founD.Row - .Row + 1, 1).Value
Set founD = .Find(gesProd.Value, founD)
' Abfrage nach found is nothing unnötig, er findet ja sicher was
Loop Until founD.Address = firstAddress
End With
End Function
Gruss, Jogy