Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1796to1800
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

Funktionen verschachteln

Funktionen verschachteln
06.12.2020 20:59:27
Bernhard
Hallo,
ich möchte in verschachtelten Funktionen Vektoren manipulieren. Für Skalare funktioniert _ Folgendes:

Function m_add(V1, V2)
m_add = V1 + V2
End Function

Function m_mult(V, M)
m_mult = V * M
End Function

Function m_addmult(V1, V2, M)
m_addmult = m_mult(m_add(V1, V2), M)
End Function

für Vektoren jedoch nicht:

Function m_Vadd(V1 As Range, V2 As Range)
ReDim mVadd(1 To 2)
mVadd(1) = V1(1) + V2(1)
mVadd(2) = V1(2) + V2(2)
m_Vadd = mVadd
End Function

Function m_Vmult(V As Range, M)
ReDim mVmult(1 To 2)
mVmult(1) = M * V(1)
mVmult(2) = M * V(2)
m_Vmult = mVmult
End Function

Function m_VAddmult(V1 As Range, V2 As Range, M)
m_VAddmult = m_Vmult(m_Vadd(V1, V2), M)
End Function

Hilfe willkommen,
Grüße
Bernhard

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ranges sind 2-Dimensional. owT
06.12.2020 22:51:43
Rudi
AW: Ranges sind 2-Dimensional. owT
06.12.2020 23:29:36
Bernhard
Ja, das habe ich mit Vektoren gemeint. Die beiden Funktionen m_Vadd und m_Vmult funktionieren für sich und verwenden ebenfalls Ranges. Leider funktionierts nicht verschachtelt als m_VAddmult. Geht das prinzipiell für Ranges nicht? Danke für eine Antwort.
AW: Ranges sind 2-Dimensional. owT
06.12.2020 23:51:21
Daniel
Hi
In VBA musst du solche Vektorsachen selber komplett ausprogrammieren, dh mit einer Schleife über jedes Element der Vektoren in jeder Dimension.
Wenn du für Einzelwerte und Vektoren dieselbe Funktion nutzen willst, musst du an den Anfang eine Prüfung stellen, was du da an eingabeparametern bekommen hast und dann für jeden möglichen Fall (Einzelwerte, Einzelwerte mit Vektor, Vektor ein- oder zweidimensional) die entsprechende Berechnungslogik programmieren, bei Vektoren wie gesagt als Schleife über die Elemente.
Um herauszufinden, ob ein übergabeparameter ein Einzelwerte oder ein Vektor ist, kannst du die Funktion VarType oder ggf auch TypeName verwenden.
Um die Anzahl der Elemente einer Dimension bzw den Start- und Endindex herauszufinden um die Schleife bilden zu kiönnen, gibt es die Funktionen UBound und LBound.
wie man jetzt herausfindet, ob das übergebene Array ein- oder zweidimensional ist, weiß ich auch nicht, aber wenn du mit Ranges als Einzelzelle oder Zellbereichen arbeitet, hast du entweder einen Einzelwert (Zelle) oder ein zweidimensionales
Array, eindimensionale Arrays kommen dann nicht vor.
Gruß Daniel
Anzeige
AW: Ranges sind 2-Dimensional. owT
07.12.2020 00:04:25
Bernhard
Vielen Dank für die Antwort. Da werde ich wohl zwei Zellen extra im Tabellenblatt investieren und die Funktionen nicht verschachteln. Gruß Bernhard
AW: Ranges sind 2-Dimensional. owT
07.12.2020 01:41:50
Bernhard
PS: das "Ausprogrammieren" war halb so wild - sowohl im Trivialbsp:
Function m_Vaddmult(V1 As Range, V2 As Range, M)
ReDim Vaddmult(1 To 2)
Vaddmult(1) = M * (V1(1) + V2(1))
Vaddmult(2) = M * (V1(2) + V2(2))
m_Vaddmult = Vaddmult
End Function

als auch im Tatsächlichen - einen Punkt Pt rotiert mit alpha2 um einen Drehpunkt Pp2, der selber mit alpha1 um den Drehpunkt Pp1 rotiert:
Function m_PtAroundPp1AroundPp2(Pt, Pp1, alpha1, Pp2, alpha2 As Range)
ReDim result(1 To 2)
Pp2_alpha1x = Pp1(1) + (Pp2(1) - Pp1(1)) * Cos(alpha1) - (Pp2(2) - Pp1(2)) * Sin(alpha1)
Pp2_alpha1y = Pp1(2) + (Pp2(1) - Pp1(1)) * Sin(alpha1) + (Pp2(2) - Pp1(2)) * Cos(alpha1)
Pt_alpha1x = Pp1(1) + (Pt(1) - Pp1(1)) * Cos(alpha1) - (Pt(2) - Pp1(2)) * Sin(alpha1)
Pt_alpha1y = Pp1(2) + (Pt(1) - Pp1(1)) * Sin(alpha1) + (Pt(2) - Pp1(2)) * Cos(alpha1)
result(1) = Pp2_alpha1x + (Pt_alpha1x - Pp2_alpha1x) * Cos(alpha2) - (Pt_alpha1y - Pp2_alpha1y)  _
* Sin(alpha2)
result(2) = Pp2_alpha1y + (Pt_alpha1x - Pp2_alpha1x) * Sin(alpha2) + (Pt_alpha1y - Pp2_alpha1y)  _
* Cos(alpha2)
m_PtAroundPp1AroundPp2 = result
End Function

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige