Microsoft Excel

Herbers Excel/VBA-Archiv

Interessenten-Info zum WE


Betrifft: Interessenten-Info zum WE
von: Luc:-?
Geschrieben am: 05.08.2016 04:22:21

Morrn, Folks;
im Folgenden geht's mir primär um den ZusatzTeil der Aufgabe(n) in untenstehender Tabelle. Weil der sich auf die Daten der LösungsAlternative einer spezifischen Aufgabe lt dieser Anfrage bezieht, habe ich das komplett mit übernommen. Hier kann man dann auch sehen, wie die aktuelle (noch unveröffentlichte) Version1.5 der UDF VSplit bei unter­schied­licher Argumen­tierung im Zusammenspiel mit MaskOn arbeitet. in der alternativen Aufgabe zeige ich eine alte, unpubli­zierbare UDF, die den QuellText quasi aus- bzw umrechnet. Einen Teil­Aspekt davon kann man auch mit der letzten Fml erreichen (TxEval mit MaskOn, beide im Archiv):

 PQRSTUVWXYZ
1Textklass LösungUDF-Lösung1UDF-Lösung2UDF-Lösung3Alternative1Alternative2Eigentliche Aufgabe: Extraktion der 1.Zahl
220X3St2020202060 St60Alternative Aufgabe: Berechnung des 1.Zahlwerts
31St11111 St1Formeln (klassisch: excelformeln.de, Fmln 100; VSplit Vs1.5)
40.5ml0,50.50,50.50,5 ml0,5Q2[:Q9]:=VERWEIS(9^9;1*LINKS(WECHSELN(P2;".";",");SPALTE(A1:IQ1)))
510St1010101010 St10R2[:R9]:=VSplit(MaskOn(P2;"zw");;2)
615X1ST1515151515 ST15S2[:S9]:=VSplit(MaskOn(P2;"zw");;1)
70.5g0,50.50,50.50,5 g0,5T2[:T9]:=VSplit(MaskOn(P2;"zw"))
86X0.5ml66663 ml3U2[:U9]:=T2Form(WECHSELN(WECHSELN(P2;"X";"×");".";","))
910X5g1010101050 g50V2[:V9]:=TxEval(MaskOn(WECHSELN(P2;"X";"*");"zw";"*"))
10Abgeleitete Zusatzaufgabe: Auswahl beliebiger60, 10, 15, 50=VJoin(DataSet((V2;V5:V6;V9);"";-2;;1);", ";-1)← singMxFml m.UDFs VJoin 1.4 u. DataSet 1.3
11Zellen u.ihre Verbindung duale MatrixFml m.VJoin60, 10, 50, 15{=WAHL(SPALTE(A1:B1);VJoin(INDEX((V2;V5:V6;V9);ZEILE(A1:A2);1;SPALTE(A1:C1))*1^SPALTE(A1:C1);", ";-2);CFormA(T11;1))}

In der ZusatzAufgabe* zeigt die 1.Fml das Zusammenwirken der UDFs VJoin (Archiv-Vs1.4 ausreichend) und DataSet, die nun in der hier verwendeten Vs1.3 vorliegt. Diese kann jetzt auch unzu­sammen­hängende Bereiche verarbeiten, was VJoin (bisher) nicht kann, weshalb sie hier eingesetzt wurde, um einen von VJoin verarbeit­baren Datenfeld­Vektor zu erzeugen.
Mit der 2.Fml demonstriere ich erneut die Einsatz­Möglichkeiten einer dualen MatrixFml, durch die INDEX hier veranlasst wird, (in Kombination mit dem anschließenden Zusatz) alle Werte zurückzugeben, was mit einer singularen MatrixFml nicht möglich wäre. Die Verwendung von 2 Zellen für die Fml kann man nur an der Fml erkennen, da in HTML alle Zellen, über die sich ein überlanger Text in Xl erstreckt, miteinander verbunden wdn müssen. Die Beson­derheit ist hier, dass per WAHL die Ergebnis­Ausgabe auf die 1. der beiden Zellen beschränkt wird (das alleinige Ergebnis würde sonst durch die Xl-Steuerung verdoppelt wdn), während die 2. hier gleich für die Anzeige der zugrunde­liegenden MatrixFml (per UDF CFormA, die in höheren XlVss durch die neue XlFkt FORMELTEXT ersetzt wdn könnte) genutzt wird, was so wie hier nicht zu einem Zirkel­Bezugs­Fehler führt.
* Diese ist an dieser Aufgabe orientiert.

Sachliche Kommentare sind durchaus erwünscht! ;-)
Gruß + schöWE, Luc :-?

Besser informiert mit …

  

Betrifft: Bspp für DataSet-Einsatz (Version 1.3)
von: Luc:-?
Geschrieben am: 10.08.2016 13:39:30

Im letzten Abschnitt tritt ein besonderes Phänomen auf, dass lt roter Anmerkung behandelt wurde:

 ABCDEFGHIJKLMNOPQRSTU
12Menge1Menge2G-MengeV-MengeD-Menge symD-Menge1D-Menge2S-MengeDataSet-Formeln:
13DataSet ohne AuswahlBedingg6 6 4211C14:D18: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet(A14:A18;B14:B17;2;1;;-1))/2);#NV;DataSet(A14:A18;B14:B17;2;1;;-1))}
140,10,10,10,10,10,20,50,20,50,20,1E14:F18: {=WENN(ZEILE(E1:E5)>MAX(1;ANZAHL(DataSet(A14:A18;B14:B17;;-1;;-1))/2);#NV;DataSet(A14:A18;B14:B17;;-1;;-1))}
150,50,10,50,20,5-00,3-00,3#NV#NVG14:H18: {=WENN(ZEILE(G1:G2)>MAX(1;ANZAHL(DataSet(A14:A18;B14:B17;-2;-1;;-1))/2);#NV;DataSet(A14:A18;B14:B17;-2;-1;;-1))}
160,30,20,3-00,3-0#NV#NV#NV#NV#NVI14:J18: {=WENN(ZEILE(I1:I2)>MAX(1;ANZAHL(DataSet(A14:A18;B14:B17;-1;1;;0)));#NV;DataSet(A14:A18;B14:B17;-1;1;;0))}
170,10,1#NV#NV#NV#NV#NV#NV#NV#NV#NVJ14:K18: {=WENN(ZEILE(J1:J2)>MAX(1;ANZAHL(DataSet(B14:B17;A14:A18;-1;1;;0)));#NV;DataSet(B14:B17;A14:A18;-1;1;;0))}
180,1 #NV#NV#NV#NV#NV#NV#NV#NV#NVK14:L18: {=WENN(ZEILE(K1:K2)>MAX(1;ANZAHL(DataSet(A14:A18;B14:B17;1;-1;;0)));#NV;DataSet(A14:A18;B14:B17;1;-1;;0))}
19DataSet mit AuswahlBedingg >> DFeld16 14 14671          
201,21,21,21,21,21,13,51,13,51,11,2C20:D29: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);2;1;;-1))/2);#NV;DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);2;1;;-1))}
213,51,13,51,13,51,41,71,41,71,4#NVE20:F29: {=WENN(ZEILE(E1:E10)>MAX(1;ANZAHL(DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);;-1;;-1))/2);#NV;DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);;-1;;-1))}
221,71,41,71,41,731,331,33#NVG20:H29: {=WENN(ZEILE(G1:G6)>MAX(1;ANZAHL(DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);-2;-1;;-1))/2);#NV;DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);-2;-1;;-1))}
231,331,331,32,22,72,22,72,2#NVI20:J29: {=WENN(ZEILE(I1:I6)>MAX(1;ANZAHL(DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);-1;1;;0)));#NV;DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);-1;1;;0))}
241,22,22,72,22,701,601,60#NVJ20:K29: {=WENN(ZEILE(I1:I6)>MAX(1;ANZAHL(DataSet(B20:B27*(B20:B27<7);A20:A29*(A20:A29>0,9);-1;1;;0)));#NV;DataSet(B20:B27*(B20:B27<7);A20:A29*(A20:A29>0,9);-1;1;;0))}
252,77,71,601,621212#NVK20:L29: {=WENN(ZEILE(I1:I6)>MAX(1;ANZAHL(DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);1;-1;;0)));#NV;DataSet(A20:A29*(A20:A29>0,9);B20:B27*(B20:B27<7);1;-1;;0))}
261,621212,8#NV#NV#NV#NV#NV          
271,62,8-02,8#NV#NV#NV#NV#NV#NV#NV          
281,2 #NV#NV#NV#NV#NV#NV#NV#NV#NV          
291 #NV#NV#NV#NV#NV#NV#NV#NV#NV          
41-- dito >> diskrete Bereiche (NoErrRange)14 14 12661          
421,21,21,21,21,21,13,51,13,51,11,2C42:D51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);2;1;;-1))/2);#NV;DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);2;1;;-1))}
433,51,13,51,13,51,41,71,41,71,4#NVE42:F51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);;-1;;-1))/2);#NV;DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);;-1;;-1))}
441,71,41,71,41,731,331,33#NVG42:H51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);-2;-1;;-1))/2);#NV;DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);-2;-1;;-1))}
451,331,331,32,22,72,22,72,2#NVI42:J51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);-1;1;;0)));#NV;DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);-1;1;;0))}
461,22,22,72,22,721,621,62#NVJ42:K51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(B20:B27;;B20:B27<7);NoErrRange(A20:A29;;A20:A29>0,9);-1;1;;0)));#NV;DataSet(NoErrRange(B20:B27;;B20:B27<7);NoErrRange(A20:A29;;A20:A29>0,9);-1;1;;0))}
472,721,621,62,812,812,8#NVK42:L51: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);1;-1;;0)));#NV;DataSet(NoErrRange(A20:A29;;A20:A29>0,9);NoErrRange(B20:B27;;B20:B27<7);1;-1;;0))}
481,62,812,81-0#NV#NV#NV#NV#NV          
491,6#NV#NV#NV#NV#NV#NV#NV#NV#NV#NV          
501,2 #NV#NV#NV#NV#NV#NV#NV#NV#NV          
511 #NV#NV#NV#NV#NV#NV#NV#NV#NV          
63DataSet m.diskreten Bereichen (direkt)6 4 2012C64:D68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((A65;A67);(B64;B66;B68);2;1;;-1))/2);#NV;DataSet((A65;A67);(B64;B66;B68);2;1;;-1))}
640,10,10,20,10,20,3-00,3Ø0,30,2E64:F68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((A65;A67);(B64;B66;B68);;-1;;-1))/2);#NV;DataSet((A65;A67);(B64;B66;B68);;-1;;-1))}
650,210,10,30,1-0#NV#NV#NV#NV0,1G64:H68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((A65;A67);(B64;B66;B68);-2;-1;;-1))/2);#NV;DataSet((A65;A67);(B64;B66;B68);-2;-1;;-1))}
660,30,3-00,2#NV#NV#NV#NV#NV#NV#NVI64:J68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((A65;A67);(B64;B66;B68);-1;1;;0)));#NV;DataSet((A65;A67);(B64;B66;B68);-1;1;;0))}
670,10,1#NV#NV#NV#NV#NV#NV#NV#NV#NVJ64:K68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((B64;B66;B68);(A65;A67);-1;1;;0)));#NV;DataSet((B64;B66;B68);(A65;A67);-1;1;;0))}
68 0,2#NV#NV#NV#NV#NV#NV#NV#NV#NVK64:L68: {=WENN(ZEILE(C1:C5)>MAX(1;ANZAHL(DataSet((A65;A67);(B64;B66;B68);1;-1;;0)));#NV;DataSet((A65;A67);(B64;B66;B68);1;-1;;0))}
69DataSet für Matrizen (über spaltenweise Zerlegung in diskrete Bereiche im Wechsel M1/1,M1/2;M2/1,M2/2)** nur hier Problem bei Erstberechnung → Lösung: Zweitberechnung und dann rückgängig machen!
70Matrix1(M1+M2=18) 18 18 12643          
716,81,26,84,16,84,16,84,16,84,11C71:D80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);2;1;;-1))/2);#NV;DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);2;1;;-1))}
722,31,22,312,31,32,31,32,31,32,6E71:F80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);;-1;;-1))/2);#NV;DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);;-1;;-1))}
733,62,63,62,63,61,13,61,13,61,11,7G71:H80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);-2;-1;;-1))/2);#NV;DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);-2;-1;;-1))}
743,41,73,41,33,42,83,42,83,42,8#NVI71:J80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);-1;1;;0)));#NV;DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);-1;1;;0))}
7515,911,11-01,2-01,2#NV#NVJ71:K80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A77:A80;B77:B80);(A71:A75;B71:B75);-1;1;;0)));#NV;DataSet((A77:A80;B77:B80);(A71:A75;B71:B75);-1;1;;0))}
76Matrix2 1,21,71,2-05,9-05,9#NV#NVK71:L80: {=WENN(ZEILE(C1:C10)>MAX(1;ANZAHL(DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);1;-1;;0)));#NV;DataSet((A71:A75;B71:B75);(A77:A80;B77:B80);1;-1;;0))}
774,11,12,62,82,6-0#NV#NV#NV#NV#NV          
7811,71,7-01,7-0#NV#NV#NV#NV#NV          
792,61,75,9-05,9-0#NV#NV#NV#NV#NV          
801,32,8#NV#NV#NV#NV#NV#NV#NV#NV#NV          
PgmCode folgt demnächst! Luc :-?


  

Betrifft: Nachtrag NoErrRange
von: Luc:-?
Geschrieben am: 10.08.2016 13:43:25

Die UDF NoErrRange ist in Version 1.3 hier zu finden.
Luc :-?


  

Betrifft: Nachtrag DataSet
von: Luc:-?
Geschrieben am: 12.08.2016 00:00:33

Public Enum cxSetType: cxSymDiff = -2: cxDiff: cxUnite: cxInterSect: cxCollect: End Enum
Public Enum cxTriState: cxAsUsed = -2: cxTrue: cxFalse: cxCTrue: End Enum
Public Enum xlTriState: xlTrue = -1: xlFalse: xlCTrue: End Enum

Rem Bildet 1 DatenMenge aus 2en nach 5 praxisrelevanten OperationsTypen
'   Arg1/2: 1./2.Menge (ZBereichsBezugs- or Datenfeld-VEKTOR), bde dürf
'   LeerMengg sein, leere Elemtt wdn b.Arg3<2 entfernt, TeilBereiche v.
'   ZBereichVektt könn direkt angegeben or per Ausdruck als Arg erzeugt
'   wdn (m.UDF NoErrRange oä - vgl Hinw1), durch Aufteilg könn ggf auch
'   Matrizen verarbeitt wdn (Hinw2); Arg3: <0 DiffenzMengg~ -2 symmetr,
'   -1 asymmetr (M1 ohne M2), fehlt/0 VereinigungsMenge (Elemente in M1
'   or M2), 1 SchnittMenge (nur Elemtt in M1 u.M2), 2 SammelMenge (alle
'   Elemtt beid Mengg); Arg4: ±1 ggf vorhandene Doppel entfernen~ 1 nur
'   in QuellMengg, -1 do u.in ErgebnM (Arg3=2->0), fehlt/0 keine Elemtt
'   entfern; Arg5: wahr/±1 horiz ErgebnVekt (wird ggf automat transpon,
'   wn mehrere Zeilen ausgewählt wdn), fehlt/falsch/0 vertVekt aus Ele-
'   mentPaaren bd Mengg (1 Elemt ggf leer, nur Arg3=0/±2); Arg6: fehlt/
'   leer LeerMg|LeerWert=Zeich12|leer (idR 0 gezeigt), 0 LMg|LWt=Ø|#NV,
'   1 LMg|LWt=LeerTxt m.|o.Länge, -1 LMg|LWt=LTx o.Lg|-0 (echte neg 0).
'   Achtung! Verwendet intern WshFct Transpose (MTRANS, ElementeAnzahl-
'   Limitierung!) u.SpezialEnumeratt cxSetType, cxTriState, xlTriState!
'   Hinw1: Fkt kann b.DatFeldern nicht zwischen durch Anwend 1er Beding
'   erzeugter u.ursprgl 0 untscheid, hier ggf LeerTxt or TeilBer vwend!
'   Hinw2: Bei mehreren (untschiedl) Spalten(/Zeilen) d.TeilMengg einer
'   Menge kann uU 2mal-Berechn u.RückgänggMachen d.letzt erforderl wdn!
'   Hinw3(Zähl): -0 idR nicht m.ANZAHL vwendn (ANZ~2 zählt stets alle)!
'   Vs1.3 -LSr:CyWorXxl -cd:20160711 -1pub:h20160713-15 -lupd:20160730t
Function DataSet(Menge1, Menge2, Optional ByVal ErgMengTyp As cxSetType, Optional _
                 ByVal nurUnikate As xlTriState, Optional ByVal kPaare As Boolean, _
                 Optional ByVal LeerErsatz As cxTriState = cxAsUsed)
    Const ucLeerMalt1 As Long = 0, ucLeerMalt2 As Long = 65279, _
          ucLeerMdef As Long = 12, ucLeerMsym As Long = 8709
    Dim ik As Integer, ix As Long, iz As Long, erg, ersZ(1) As Variant, _
        M1, M2, tEVgl, tM, xEl As Variant, wf As WorksheetFunction
    On Error Resume Next: Set wf = WorksheetFunction
    If LeerErsatz <> cxAsUsed Then LeerErsatz = LeerErsatz Mod 2
    ersZ(0) = ChrW(Array(ucLeerMdef, ucLeerMalt1, ucLeerMsym, ucLeerMalt2)(LeerErsatz + 2))
    ersZ(1) = Array(Empty, -CDbl(0), CVErr(xlErrNA), "")(LeerErsatz + 2)
    nurUnikate = nurUnikate Mod 2: ErgMengTyp = ErgMengTyp Mod 3
    If nurUnikate = xlTrue And ErgMengTyp = cxCollect Then ErgMengTyp = cxUnite
    kPaare = CBool(ErgMengTyp Mod 2) Or kPaare
    If TypeName(Menge1) = "Range" Then
        If Menge1.Areas.Count > 1 Then
            For Each tM In Menge1.Areas
                If IsArray(tM) Then
                    tM = wf.Transpose(wf.Transpose(tM))
                    If IsError(LBound(tM, 2)) Then Else tM = wf.Transpose(tM)
                    If IsError(LBound(tM, 2)) Then Else Exit For
                    If Not IsEmpty(M1) Then
                        iz = UBound(M1): ReDim Preserve M1(1 To iz + UBound(tM))
                        For ix = 1 To UBound(tM): M1(iz + ix) = tM(ix): Next ix
                    Else: M1 = tM
                    End If
                ElseIf Not IsEmpty(M1) Then
                    iz = UBound(M1): ReDim Preserve M1(1 To iz + 1): M1(iz + 1) = tM
                Else: ReDim M1(1 To 1): M1(1) = tM
                End If
            Next tM
            If Not IsEmpty(tM) Then DataSet = CVErr(xlErrRef): GoTo xx
        ElseIf IsArray(Menge1) Then
            M1 = wf.Transpose(wf.Transpose(Menge1))
        Else: ReDim M1(1 To 1): M1(1) = Menge1
        End If
    ElseIf Not IsArray(Menge1) Then
        ReDim M1(1 To 1): M1(1) = Menge1
    Else: M1 = Menge1
    End If
    If IsError(LBound(M1, 2)) Then Else M1 = wf.Transpose(M1)
    If IsError(LBound(M1, 2)) Then Else DataSet = CVErr(xlErrRef): GoTo xx
    If CBool(nurUnikate) Then
        ix = LBound(M1): ReDim tM(UBound(M1) - ix): ik = Abs(ix = 0): iz = 0
        For Each xEl In M1
            If wf.Match(xEl, M1, 0) = ix + ik Then tM(iz) = xEl: iz = iz + 1
            ix = ix + 1
        Next xEl
        ReDim Preserve tM(iz - (2 * iz) \ (iz + 1)): M1 = tM
    Else: ReDim Preserve M1(UBound(M1) - LBound(M1))
    End If
    If TypeName(Menge2) = "Range" Then
        If Menge2.Areas.Count > 1 Then
            For Each tM In Menge2.Areas
                If IsArray(tM) Then
                    tM = wf.Transpose(wf.Transpose(tM))
                    If IsError(LBound(tM, 2)) Then Else tM = wf.Transpose(tM)
                    If IsError(LBound(tM, 2)) Then Else Exit For
                    If Not IsEmpty(M2) Then
                        iz = UBound(M2): ReDim Preserve M2(1 To iz + UBound(tM))
                        For ix = 1 To UBound(tM): M2(iz + ix) = tM(ix): Next ix
                    Else: M2 = tM
                    End If
                ElseIf Not IsEmpty(M2) Then
                    iz = UBound(M2): ReDim Preserve M2(1 To iz + 1): M2(iz + 1) = tM
                Else: ReDim M2(1 To 1): M2(1) = tM
                End If
            Next tM
            If Not IsEmpty(tM) Then DataSet = CVErr(xlErrRef): GoTo xx
        ElseIf IsArray(Menge2) Then
            M2 = wf.Transpose(wf.Transpose(Menge2))
        Else: ReDim M2(1 To 1): M2(1) = Menge2
        End If
    ElseIf Not IsArray(Menge2) Then
        ReDim M2(1 To 1): M2(1) = Menge2
    Else: M2 = Menge2
    End If
    If IsError(LBound(M2, 2)) Then Else M2 = wf.Transpose(M2)
    If IsError(LBound(M2, 2)) Then Else DataSet = CVErr(xlErrRef): GoTo xx
    If CBool(nurUnikate) Then
        ix = LBound(M2): ReDim tM(UBound(M2) - ix): ik = Abs(ix = 0): iz = 0
        For Each xEl In M2
            If wf.Match(xEl, M2, 0) = ix + ik Then tM(iz) = xEl: iz = iz + 1
            ix = ix + 1
        Next xEl
        ReDim Preserve tM(iz - (2 * iz) \ (iz + 1)): M2 = tM
    Else: ReDim Preserve M2(UBound(M2) - LBound(M2))
    End If
    ix = 0: iz = 0
    ReDim erg(IIf(kPaare, UBound(M1) + UBound(M2) + 1, wf.Max(UBound(M1), UBound(M2))))
    For Each xEl In M1
        If IsEmpty(xEl) Then
            If ErgMengTyp = cxCollect Then xEl = ersZ(1) Else GoTo nx
        End If
        Select Case ErgMengTyp
        Case cxSymDiff, cxDiff
            If IsError(wf.Match(xEl, M2, 0)) Then erg(ix) = xEl: ix = ix + 1
        Case cxUnite, cxCollect
            erg(ix) = xEl: ix = ix + 1
        Case cxInterSect
            If IsError(wf.Match(xEl, M2, 0)) Then Else erg(ix) = xEl: ix = ix + 1
        End Select
nx: Next xEl
    If ErgMengTyp Mod 2 = 0 Then
        If kPaare Then iz = ix
        For Each xEl In M2
            If IsEmpty(xEl) Then
                If ErgMengTyp = cxCollect Then xEl = ersZ(1) Else GoTo nz
            End If
            Select Case ErgMengTyp
            Case cxSymDiff, cxUnite
                If IsError(wf.Match(xEl, M1, 0)) Then
                    If kPaare Then erg(iz) = xEl Else erg(iz) = Array(erg(iz), xEl)
                    iz = iz + 1
                End If
            Case cxCollect
                If kPaare Then erg(iz) = xEl Else erg(iz) = Array(erg(iz), xEl)
                iz = iz + 1
            End Select
nz:     Next xEl
        If wf.Max(ix, iz) > 0 Then
            ReDim Preserve erg(wf.Max(ix, iz) - 1)
        Else: ReDim Preserve erg(0)
        End If
        If Not kPaare Then
            If ix > iz Then
                For iz = iz To ix - 1
                    erg(iz) = Array(erg(iz), ersZ(1))
                Next iz
            ElseIf LeerErsatz > cxAsUsed Then
                If ix < iz Then
                    For ix = ix To iz - 1
                        erg(ix) = Array(ersZ(1), erg(ix)(1))
                    Next ix
                ElseIf ix = 0 And iz = 0 Then
                    erg(0) = Array(ersZ(1), ersZ(1))
                End If
            End If
        ElseIf LeerErsatz > cxAsUsed Then
            If iz = 0 Then erg(0) = ersZ(1)
        End If
    ElseIf ix > 0 Then
        ReDim Preserve erg(ix - 1)
    Else: erg = ersZ(1)
    End If
    If IsArray(erg) Then
        If IsArray(erg(0)) Then
            If IsError(erg(0)(0) = erg(0)(1)) Then
                DataSet = erg
            ElseIf erg(0)(0) = erg(0)(1) Then
                tEVgl = erg(0)(0): GoTo vx
            Else: DataSet = erg
            End If
        Else: tEVgl = erg(0): GoTo vx
        End If
    Else: tEVgl = erg
vx:     Select Case LeerErsatz
        Case cxAsUsed
            If IsEmpty(tEVgl) Then DataSet = ersZ(0) Else DataSet = erg
        Case cxTrue
            If tEVgl = ersZ(1) Then DataSet = ersZ(0) Else DataSet = erg
        Case cxFalse
            If wf.IsNA(tEVgl) Then DataSet = ersZ(0) Else DataSet = erg
        Case cxCTrue
            If tEVgl = ersZ(1) Then DataSet = ersZ(0) Else DataSet = erg
        End Select
    End If
ex: If IsError(DataSet) Then GoTo xx
    With Application
        If kPaare And .ThisCell.HasArray Then
            If .Caller.Rows.Count > 1 Then DataSet = wf.Transpose(DataSet)
        End If
    End With
xx: erg = Empty: M1 = Empty: M2 = Empty: tM = Empty: Set wf = Nothing
End Function
Viel Erfolg & schöWE, Luc :-?