Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1452to1456
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Versuche in UDF-MatrixFormelFktionalität

Versuche in UDF-MatrixFormelFktionalität
27.10.2015 02:33:48
Luc:-?
Für alle Interessenten (m.spez Anmerk f.neopa & robert),
habe ich im Folgenden mal einige Versuche zu mehrzelligen MatrixFmln dargestellt. Hierzu habe ich u.a. auch 4(+1) UDFs geschrieben, die bsphaft eine einfache element­weise Addition 2er Vektoren (Bereichs-/Datenfeld-Zeile/-Spalte) realisieren. Diese wdn für diese einfache Operation eigentlich nicht benötigt, sollen aber demonstrieren, wie man derartige Operationen in VBA lösen kann. Hierbei habe ich auf die übliche(n) Vorgehensweise(n) verzichtet, weil ich …
1. Alternativen zeigen und …
2. darstellen/simulieren wollte, wie die fktsexterne Xl-Steuerung fktionieren könnte:
 ABCDEFGHIJKLM
11151616167161616161631 v-Basisformel C1:C10: {=A1:A10+B1:B10}
2111223232317231323262328 D1:D10: {=VPairs(A1:A10;B1:B10;-3)}
371320202013201420222029 E1:E10: {=AddIt(A1:A10;B1:B10)}
41031313131613413251319 vV+Ew F1:F10: {=AddIt(A1:A10;B10)}
581119191914191219231927 G1:G10: {=AddThis(A1:A10;B1:B10)}
61321515151915315281518 Ew+vV H1:H10: {=AddThis(A1;B1:B10)}
7161632323222321732313232 I1:I10: {=AddRec(A1:A10;B1:B10)}
81732020202320420322019 vV+Ew J1:J10: {=AddRec(A1:A10;B1)}
91552020202120620302021 K1:K10: {=MTRANS(AddVar(A1:A10;B1:B10))}
101662222222222722312222 Ew+vV L1:L10: {=MTRANS(AddVar(A10;B1:B10))}
11     22 22 22 22 
121411514810 10 10 10Formeln
13621062        
14203252010 einfache 2-Werte-Addition  h-Basisformel A14:E14: {=A12:E12+A13:E13}
15203252010 F11:=AddIt(A10;B10)  A15:E15: {=MTRANS(VPairs(A12:E12;A13:E13;-3))}
16203252010 F12:=AddIt(E12;E13)  A16:E16: {=AddIt(A12:E12;A13:E13)}
171410181410 H11:=AddThis(A10;B10)  Ew+hV A17:E17: {=AddIt(E12;A13:E13)}
18203252010 H12:=AddThis(E12;E13)  A18:E18: {=AddThis(A12:E12;A13:E13)}
19207212014 J11:=AddRec(A10;B10)  hV+Ew A19:E19: {=AddThis(A12:E12;A13)}
20203252010 J12:=AddRec(E12;E13)  A20:E20: {=AddRec(A12:E12;A13:E13)}
212016242016 L11:=AddVar(A10;B10)  Ew+hV A21:E21: {=AddRec(A12;A13:E13)}
22203252010 L12:=AddVar(E12;E13)  A22:E22: {=AddVar(A12:E12;A13:E13)}
23163171610        hV+Ew A23:E23: {=AddVar(A12:E12;E13)}

Die zugehörigen UDF-Codes lauten:
Option Explicit
Public Enum cxTriState: cxAsUsed = -2: cxRTrue: cxFalse: cxPTrue: End Enum
Rem Alle UDFs benötigen Enum cxTriState;
'   Argumente Vektor (Spalte/Zeile) oder Einzelwert
Function AddIt(x, y)
Dim isArr As cxTriState, i As Long, n As Long, s As Long, z As Long, erg, _
ac As Range
isArr = Abs(IsArray(x)) + 2 * CInt(IsArray(y))
If CBool(isArr) Then
Set ac = Application.Caller: s = ac.Columns.Count: z = ac.Rows.Count
Set ac = Nothing: n = WorksheetFunction.Max(s, z): ReDim erg(n)
For i = 0 To n - 1
Select Case isArr
Case cxAsUsed: erg(i) = x + y(i + 1)
Case cxRTrue:  erg(i) = x(i + 1) + y(i + 1)
Case cxPTrue:  erg(i) = x(i + 1) + y
End Select
Next i
If z > s Then
AddIt = WorksheetFunction.Transpose(erg)
Else: AddIt = erg
End If
Else: AddIt = x + y
End If
End Function
Function AddThis(x, y)
Dim isArr As cxTriState, i As Long, s As Long, z As Long, adRelBer$, erg(), _
xz As Range, ac As Range
isArr = Abs(IsArray(x)) + 2 * CInt(IsArray(y))
If CBool(isArr) Then
Set ac = Application.Caller: s = ac.Columns.Count: z = ac.Rows.Count
adRelBer = ac.Address: Set ac = Nothing
For Each xz In Range(adRelBer)
i = i + 1: ReDim Preserve erg(1 To i)
Select Case isArr
Case cxAsUsed: erg(i) = x + y(i)
Case cxRTrue:  erg(i) = x(i) + y(i)
Case cxPTrue:  erg(i) = x(i) + y
End Select
Next xz
If z > s Then
AddThis = WorksheetFunction.Transpose(erg)
Else: AddThis = erg
End If
Else: AddThis = x + y
End If
End Function
Function AddRec(x, y)
Dim isArr As cxTriState, i As Long, s As Long, z As Long, adRelBer$, erg(), _
xz As Range, ac As Range
isArr = Abs(IsArray(x)) + 2 * CInt(IsArray(y))
If CBool(isArr) Then
Set ac = Application.Caller: s = ac.Columns.Count: z = ac.Rows.Count
adRelBer = ac.Address: Set ac = Nothing
For Each xz In Range(adRelBer)
i = i + 1: ReDim Preserve erg(1 To i)
Select Case isArr
Case cxAsUsed: erg(i) = AddRec(x, y(i))
Case cxRTrue:  erg(i) = AddRec(x(i), y(i))
Case cxPTrue:  erg(i) = AddRec(x(i), y)
End Select
Next xz
If z > s Then
AddRec = WorksheetFunction.Transpose(erg)
Else: AddRec = erg
End If
Else: AddRec = x + y
End If
End Function
Rem Benötigt außerdem UDF Vary
Function AddVar(x, y)
Dim isArr As cxTriState, i As Long, erg(), s(1)
isArr = Abs(IsArray(x)) + 2 * CInt(IsArray(y))
Do: i = i + 1
Select Case isArr
Case cxAsUsed: s(0) = x: s(1) = Vary(y, i)
Case cxRTrue:  s(0) = Vary(x, i): s(1) = Vary(y, i)
Case cxFalse:  s(0) = Array(Empty, x)(1 \ i): s(1) = Array(Empty, y)(1 \ i)
Case cxPTrue:  s(0) = Vary(x, i): s(1) = y
End Select
If IsEmpty(s(0)) Or IsEmpty(s(1)) Then Exit Do
ReDim Preserve erg(1 To i): erg(i) = s(0) + s(1)
Loop
AddVar = erg
End Function
Rem Unterstützt hier UDF AddVar
Function Vary(x, i As Long)
On Error Resume Next
If TypeName(x) = "Range" Then
If i > x.Cells.Count Then Else Vary = x.Cells(i)
Else: If IsError(LBound(x, 2)) Then Else x = WorksheetFunction.Transpose(x)
If i > UBound(x) Then Else Vary = x(i)
End If
End Function
Außerdem wird in der BspTab zu Demo-Zwecken noch die UDF VPairs verwendet, die primär die Aufgabe hat, 2 Vektoren in einen vertikalen Vektor umzuwandeln, dessen Elemente aus horizontalen Vektoren der gepaarten Elemente der Quell­Vektoren bestehen. Dabei kann je nach Parame­trierung eine lfdNr als 3.Element den gepaarten vorangestellt wdn, worauf hier verzichtet wurde. Stattdessen wurde die ebenfalls gegebene Möglichkeit genutzt, die Paar­Elemente zusammen­zufassen (hier natürlich als Summe). Dabei entsteht ein vertikaler Vektor, dessen Elemente aus 1elementigen Vektoren bestehen. Anmerkung: Diese UDF wird hier nicht gezeigt, da sie die 3fache Zeilen­Zahl meines annähernden Posting­Richt­werts hat (@n&r: Ist in PrinzipL4 enthalten).
Die 4. der gezeigten UDF ist ein Versuch, die mögliche Fktsweise der o.g. Xl-Steuerung nachzu­empfinden. Deshalb verwendet sie intern die 5. der gezeigten UDFs. Die 4. fktioniert also nur mit der 5., die 5. aber auch separat (ähnlich wie die xlFkt INDEX).
Gruß, Luc :-?
PS: Anlass

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: das schiebe ich mal vor mir her, denn ...
27.10.2015 08:15:36
...
Hallo Luc,
... auch nach einer zweiten Sicht Deines Beitrages, finde ich momentan nicht den nötigen Bezugs- bzw. Ansatzpunkt, um mir das wenigstens schrittweise annähernd zu erschließen.
Sorry, aber vielleicht zu einem späteren Zeitpunkt.
Gruß Werner
.. , - ...

Ist schon klar, Werner, ...
27.10.2015 15:58:40
Luc:-?
…ist ja auch VBA. ;-)
Allerdings stehen hinter XlFktt auch Pgmm, die noch dazu in ein umfassenderes Pgm, nämlich Xl selbst, eingebettet sind u/o mit diesem kommunizieren. Dadurch erst wdn mitunter bestimmte Möglichkeiten realisiert u/o treten uU schwer verständliche Effekte auf. Diese sind regelmäßig und man kann einer Fkt „ansehen“, wie sie in einem bestimmten Kontext unter jeweiliger Argumentierung reagieren wird, wenn man mal den FmlAssi aufruft.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: sicherlich alles richtig, ...
27.10.2015 17:07:50
...
Hallo Luc,
... doch ich hatte auch nach dem 3. und 4. Blick noch kein richtigen Ansatz gefunden, um mir Deine Arbeit zu erschließen. Sorry. Vielleicht später einmal.
Gruß Werner
.. , - ...

Kann ja noch ergänzen, was ich im 1.BT ...
28.10.2015 05:24:38
Luc:-?
…nicht erwähnt hatte, Werner;
die für die Lösung dieser Aufgabe normalerweise ausreichende Notation {=A1:A10+B1:B10} ist völlig fktsfrei, enthält nur den Operanden +. Da das auch fktioniert und kein spezielles FktsPgm im Spiel ist, bedeutet das wohl, dass Xl selbst die Variation der Summanden über die angegebenen ZellBereiche besorgt, um den ErgebnisVektor zu erzeugen. Auf diese Variation verlassen sich alle Xl-Standard-Fktt, die in allen oder mindestens einem ihrer Argumente primär skalare Werte verwenden, was der FmlAssi dann auch so anzeigt (anderenfalls zeigt er einen in MxKonstantenForm dargestellten Vektor (oder eine Matrix) an.
Viele Fktt haben aber wenigstens 1 Argument, das Vektoren/Matrizen zulässt. Hier wird in MatrixFmln dann der ganze Vektor bzw die Matrix, in Nicht-MxFmln nur der 1.Wert (bzw der, der gerade an der Reihe ist) verwendet. Einige Xl-Standard-Fktt sind demggüber völlig autark. Sie verarbeiten auch ohne MxFmlForm (in 1zelligen MxFmln!) stets die/den ganze/n Matrix/Vektor. Selbst, wenn dieser ein aus einem Ausdruck (als Argument) resultierendes Datenfeld ist, wird bis zu einem gewissen FmlKomple­xitätsGrad noch das ganze Datenfeld berechnet und einbezogen (nur für 1zellige MxFmln relevant!).
Mit einer UDF hat man idR nur die Möglichkeit, entweder rein skalare Argumente (Einzelwerte u.-Zellen) zuzulassen oder zusätzlich auch noch Bereiche und Datenfelder zu berücksichtigen. Die Unterstützung der XLSteuerung hat man dabei iaR nicht. Damit entspräche das Entweder einem Fall, den es im XlStandard nur bei manchen Logik-Fktt (in mehrzelligen MxFmln; die UDF läuft dann aber idR in einen Fehler!) gibt, während das Oder je nach Pgmierung seltener dem Verhalten völlig autarker, häufiger dem teilautarker XlFktt entspricht. Das bedeutet, dass bei Verwendung letzterer UDFs mit Ausdrücken als Argument in ZellFmln meist MxFmlForm erforderlich ist (hängt vom Ausdruck ab!), mitunter aber auch nicht. Soll die UDF stets vollautark sein, muss ihre Pgmmierung (meist nur für 1zellige MxFmln erforderlich!) die Berechnung argumentativer Ausdrücke uU selbst realisieren.
Luc :-?

Anzeige
AW: wenn ich jetzt schreiben würde ...
28.10.2015 08:07:56
...
Hallo Luc,
... dass ich das wirklich verstanden habe, würde ich lügen. Irgendwo zeichnet sich im "Dunkel" zwar ein kleiner Lichtpünktchen ab, doch das flackert nur ganz schwach. Schwirren tut mir dagegen momentan der Kopf. Ihm ist noch zu vieles unverständlich bzw. unvertraut.
Doch kommt Zeit, kommt Rat.
Gruß Werner
.. , - ...

Na, dann, schaun wir mal...! ;-) Erfolg! owT
28.10.2015 14:37:06
Luc:-?
:-?

AW: Na, dann, schaun wir mal...! ;-) Erfolg! owT
28.10.2015 15:05:16
Daniel
HI Luc
schau mal hier rein.
http://www.office-loesung.de/p/viewtopic.php?f=166&t=705382
schaut so aus, als hätte hier jemand gerne ein paar Infos zu deinem Spezialgebiet.
Vielleicht kannst du ihm seine Frage mit deinem Fachwissen beantworten.
Gruß Daniel

Anzeige
Erfolgte keine Reaktion! owT
02.11.2015 03:16:01
Luc:-?
:-?

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige