Was ist dein Primärziel, ...
28.03.2016 15:46:27
Luc:-?
…Michi,
Pgmmieren einer eigenen Fkt oder Lösung der Aufgabe dieser Fkt?
Im letzteren Fall kannst du einfach bereits Vorhandenes in einer 1zelligen (singularen) MatrixFml nutzen (BspBezug s.unten):
{=VJoin(WENN((A1:A10=1)*(B1:B10"");B1:B10;"");ZEICHEN(10);-1)}
{=VJoin(WENN((B1:B10"")*((A1:A108));B1:B10;"");ZEICHEN(10);-1)}
Letztveröffentlichte VJoin-Version 1.4 (nur in hochgeladenen BspMappen!).
Im ersteren Fall kannst du auf Ransis Einfall warten oder den sinnvoll allgemeinen Ansatz der ArgumentDeklaration deiner Fkt sich auch im PgmVerlauf widerspiegeln lassen, indem du dir etwas mehr Arbeit mit dem Differenzieren der jeweiligen ArgumentAngabe machst, zB so:
Rem Fkt nur für Vektoren (Zeilen oder Spalten von Bereichen bzw Datenfeldern)
Public Function VerkettenWenn(Bereich_Kriterium, Kriterium, Bereich_Verketten)
Dim isRow As VbTriState, L As Long, U As Long, myDic As Object
On Error GoTo fx: Set myDic = CreateObject("Scripting.Dictionary")
If TypeName(Bereich_Kriterium) = "Range" Then
If Bereich_Kriterium.Columns.Count > 1 And Bereich_Kriterium.Rows.Count > 1 Then _
Err.Raise xlErrRef
isRow = vbUseDefault: L = 1: U = Bereich_Kriterium.Count
ElseIf IsArray(Bereich_Kriterium) Then
On Error Resume Next
If IsError(LBound(Bereich_Kriterium, 2)) Then
isRow = vbUseDefault: L = LBound(Bereich_Kriterium): U = UBound(Bereich_Kriterium)
ElseIf UBound(Bereich_Kriterium, 1) > UBound(Bereich_Kriterium, 2) Then
If UBound(Bereich_Kriterium, 2) > LBound(Bereich_Kriterium, 2) Then _
On Error GoTo fx: Err.Raise xlErrRef
L = LBound(Bereich_Kriterium, 1): U = UBound(Bereich_Kriterium, 1)
ElseIf UBound(Bereich_Kriterium, 1) > LBound(Bereich_Kriterium, 1) Then
On Error GoTo fx: Err.Raise xlErrRef
Else: isRow = vbTrue
L = LBound(Bereich_Kriterium, 2): U = UBound(Bereich_Kriterium, 2)
End If
On Error GoTo fx
Else: L = 1: U = 1
End If
For L = L To U
If isRow = vbUseDefault Then
If Bereich_Kriterium(L) = Kriterium Then
If Len(Bereich_Verketten(L)) 0 Then myDic(L) = Bereich_Verketten(L)
End If
ElseIf isRow = vbTrue Then
If Bereich_Kriterium(1, L) = Kriterium Then
If Len(Bereich_Verketten(1, L)) 0 Then myDic(L) = Bereich_Verketten(1, L)
End If
ElseIf Bereich_Kriterium(L, 1) = Kriterium Then
If Len(Bereich_Verketten(L, 1)) 0 Then myDic(L) = Bereich_Verketten(L, 1)
End If
Next L
If CBool(Err.Number) Then
fx: VerkettenWenn = CVErr(Err.Number)
Else: VerkettenWenn = Join(myDic.items, Chr(10))
End If
Set myDic = Nothing
End Function
Allerdings müsste auch Arg3 der Fkt Bereich_Verketten auf gleiche Weise wie Arg1 untersucht wdn (bisher fktt das nur für ZellBereiche - 1 Spalte oder 1 Zeile), um in anderem Fall, Datenfeld aus Berechnung als Arg3, keine böse Überraschung zu erleben. Das wäre dann deine Aufgabe. In der Zelle sieht's als 1zellige (Matrix-)Fml dann so aus:
=VerkettenWenn(A1:A10;1;B1:B10) für Ransis Bsp (alles mit Ransis BspDaten)
{=VerkettenWenn((A1:A108);1;B1:B10)} für deinen ZusatzWunsch
Das kannst du dir im anderen Fall alles sparen, aber was dir letztlich besser geeignet erscheint, musst du selbst wissen. Allerdings verkettet VJoin in den obigen Fmln nur ungleiche Werte. Falls alle Werte außer leere verkettet wdn sollen, wird die Fml etwas komplizierter.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …