Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
404to408
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
404to408
404to408
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Function mit Matrixoperation

Function mit Matrixoperation
Matthias
Hallo,
ich benutze folgende Formel:
{=-STANDNORMINV(G46)*WURZEL(MMULT(MMULT(MTRANS(E7:E10);C19:F22);E7:E10))}
welche ich durch eine Funktion durch die Übergabe von 3 Parametern vereinfachen möchte.
Dazu habe ich folgendes gemacht:
Public

Function VaR_VaCova(VaCova_Matrix As Range, Marketvalue As Range, Confidence As Double)
With Application.WorksheetFunction
VaR_VaCova = Array(-.NormSInv(Confidence) * Sqr(.MMult(.MMult(.Transpose(Marketvalue), VaCova_Matrix), Marketvalue)))
End With
End Function

Leider ist jedoch darin ein Fehler, welchen ich nicht erkennen kann.
Kann mir jemand helfen?
Vielen Dank.
Matthias

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Function mit Matrixoperation
Ulf
NormSInv gibts zumindest in Excel 2002/2003 nicht.
Ulf
AW: Function mit Matrixoperation
Uwe
Hallo, Matthias,
das Programteil scheint sich an der Array-Auflösung zu verschlucken, die keinen korrekten Wert (double) an die Wurzeloperation übergeben kann.
Daher mein Vorschlag, führe zwei Hilfsvariable in die Funktion ein:
....
Dim MVTxVCxMV As Variant
Dim wurzel As Double
MVTxVCxMV = Array(.MMult(.MMult(.Transpose(Marketvalue), VaCova_Matrix), Marketvalue))
wurzel = Sqr(MVTxVCxMV(0)(1)) '"gezielter" Aufruf des Skalar
VaR_VaCova = -.NormSInv(Confidence) * wurzel
....

Hoffe es funktioniert so, wie es bei mir funktioert hat
Gruß!
Anzeige
Super es geht. Vielen Dank! o.T.
25.03.2004 13:01:32
Matthias
...
AW: Function mit Matrixoperation
Matthias
Hallo Uwe,
nochmal ein Frage was bedeutet / macht MVTxVCxMV(0)(1)?
Danke.
Matthias
AW: Datentyp Variant
Uwe
Hallo, Matthias!
Nicht deklarierte Variable werden in VBA als Typ Variant verwaltet. Ebenso verhält es sich augenscheinlich mit den Rückabewerten der WorkSheet-Funktionen. Leider kenne ich nicht im Einzelen, wie dieser Datentyp intern verwaltet wird (für Zahlen werden 16 Bytes verbraucht, wobei das Überschreiten der double-Grenzen zu fehlenr führen, also wohl 8 Bytes zur interen Organisation benötigt werden; String-Varianten benötigen eine Vorspann von 22 Bytes)
Ist für eine Variable, die vom Typ Variant ist, die Zuweisung direkt, so können die entsprechenden "Klar"-Eintragungen direkt genutzt werden (Variant/Datentyp, wobei Datentyp nicht Variant ist):
z.B.
DIM test as Variant, l as Integer
test = "testwert" ' test ist als String einsetzbar
l=Len(test)
test = 123.4 'ab jetzt ist test als double direkt nutzbar
Aber auch eine Zuweisung eines dimensionieren Arrays, z.B. DIM a(4,5) as Integer ist geschlossen an die Variant-Variable test einfach über test = a möglich.
Wenn Du bei diesen Ausführungen die Überwachung der Ausdrücke eingeschaltet hast, wirst Du erkennen, wie Variant die Veränderungen verarbeitet.
Wenn du aus Deiner Formel weitere Teilergebnisse Dir anzeigen lässt (Schrittweiser Ablauf des Programmteils), wobei die die entsprechenden Variablen als Variant deklarieren mußt, dann kannst Du verfolgen, wie auf die Werte zugegriffen werden kann.
...Dim MVTxVC As Variant
Dim MVTxVCxMV As Variant
Dim test As Variant
Dim a(12, 3) As Integer
Dim i As Integer, j As Integer
For i = 1 To 12
For j = 1 To 3
a(i, j) = (12 - i) * j
Next
Next
test = 12
test = a
test ="Variant"
MVTxVC = Array(.MMult(.Transpose(Marketvalue), VaCova_Matrix))
MVTxVCxMV = Array(.MMult(.MMult(.Transpose(Marketvalue), VaCova_Matrix), Marketvalue))
...

Um nun auf Deine Eingangsfrage zu kommen, dann ist erkennbar, dass sich der Name MVTxVCxMV nicht auflösen läßt, da er auf einen Speicherbereich vom Typ Variant/Variant verweist. Aber auch die "Ebene" MVTxVCxMV(0) liefert noch den unauflöslichen Speicherbereich Variant/Variant und erst der eingesetzte Zeiger MVTxVCxMV(0)(1) liefer Variant/Double, den Bereich, der als Datentyp ausgewertet werden kann, den die sqr-Funktion erfordert. Leider weiß ich auch nicht mehr zu berichten.

Gruß!
Anzeige
AW: Datentyp Variant
Uwe
Hallo, Matthias!
Nicht deklarierte Variable werden in VBA als Typ Variant verwaltet. Ebenso verhält es sich augenscheinlich mit den Rückabewerten der WorkSheet-Funktionen. Leider kenne ich nicht im Einzelen, wie dieser Datentyp intern verwaltet wird (für Zahlen werden 16 Bytes verbraucht, wobei das Überschreiten der double-Grenzen zu fehlenr führen, also wohl 8 Bytes zur interen Organisation benötigt werden; String-Varianten benötigen eine Vorspann von 22 Bytes)
Ist für eine Variable, die vom Typ Variant ist, die Zuweisung direkt, so können die entsprechenden "Klar"-Eintragungen direkt genutzt werden (Variant/Datentyp, wobei Datentyp nicht Variant ist):
z.B.
DIM test as Variant, l as Integer
test = "testwert" ' test ist als String einsetzbar
l=Len(test)
test = 123.4 'ab jetzt ist test als double direkt nutzbar
Aber auch eine Zuweisung eines dimensionieren Arrays, z.B. DIM a(4,5) as Integer ist geschlossen an die Variant-Variable test einfach über test = a möglich.
Wenn Du bei diesen Ausführungen die Überwachung der Ausdrücke eingeschaltet hast, wirst Du erkennen, wie Variant die Veränderungen verarbeitet.
Wenn du aus Deiner Formel weitere Teilergebnisse Dir anzeigen lässt (Schrittweiser Ablauf des Programmteils), wobei die die entsprechenden Variablen als Variant deklarieren mußt, dann kannst Du verfolgen, wie auf die Werte zugegriffen werden kann.
...Dim MVTxVC As Variant
Dim MVTxVCxMV As Variant
Dim test As Variant
Dim a(12, 3) As Integer
Dim i As Integer, j As Integer
For i = 1 To 12
For j = 1 To 3
a(i, j) = (12 - i) * j
Next
Next
test = 12
test = a
test ="Variant"
MVTxVC = Array(.MMult(.Transpose(Marketvalue), VaCova_Matrix))
MVTxVCxMV = Array(.MMult(.MMult(.Transpose(Marketvalue), VaCova_Matrix), Marketvalue))
...

Um nun auf Deine Eingangsfrage zu kommen, dann ist erkennbar, dass sich der Name MVTxVCxMV nicht auflösen läßt, da er auf einen Speicherbereich vom Typ Variant/Variant verweist. Aber auch die "Ebene" MVTxVCxMV(0) liefert noch den unauflöslichen Speicherbereich Variant/Variant und erst der eingesetzte Zeiger MVTxVCxMV(0)(1) liefer Variant/Double, den Bereich, der als Datentyp ausgewertet werden kann, den die sqr-Funktion erfordert. Leider weiß ich auch nicht mehr zu berichten.

Gruß!
Anzeige
AW: Datentyp Variant
Uwe
Hallo, Matthias!
Nicht deklarierte Variable werden in VBA als Typ Variant verwaltet. Ebenso verhält es sich augenscheinlich mit den Rückabewerten der WorkSheet-Funktionen. Leider kenne ich nicht im Einzelen, wie dieser Datentyp intern verwaltet wird (für Zahlen werden 16 Bytes verbraucht, wobei das Überschreiten der double-Grenzen zu fehlenr führen, also wohl 8 Bytes zur interen Organisation benötigt werden; String-Varianten benötigen eine Vorspann von 22 Bytes)
Ist für eine Variable, die vom Typ Variant ist, die Zuweisung direkt, so können die entsprechenden "Klar"-Eintragungen direkt genutzt werden (Variant/Datentyp, wobei Datentyp nicht Variant ist):
z.B.
DIM test as Variant, l as Integer
test = "testwert" ' test ist als String einsetzbar
l=Len(test)
test = 123.4 'ab jetzt ist test als double direkt nutzbar
Aber auch eine Zuweisung eines dimensionieren Arrays, z.B. DIM a(4,5) as Integer ist geschlossen an die Variant-Variable test einfach über test = a möglich.
Wenn Du bei diesen Ausführungen die Überwachung der Ausdrücke eingeschaltet hast, wirst Du erkennen, wie Variant die Veränderungen verarbeitet.
Wenn du aus Deiner Formel weitere Teilergebnisse Dir anzeigen lässt (Schrittweiser Ablauf des Programmteils), wobei die die entsprechenden Variablen als Variant deklarieren mußt, dann kannst Du verfolgen, wie auf die Werte zugegriffen werden kann.
...Dim MVTxVC As Variant
Dim MVTxVCxMV As Variant
Dim test As Variant
Dim a(12, 3) As Integer
Dim i As Integer, j As Integer
For i = 1 To 12
For j = 1 To 3
a(i, j) = (12 - i) * j
Next
Next
test = 12
test = a
test ="Variant"
MVTxVC = Array(.MMult(.Transpose(Marketvalue), VaCova_Matrix))
MVTxVCxMV = Array(.MMult(.MMult(.Transpose(Marketvalue), VaCova_Matrix), Marketvalue))
...

Um nun auf Deine Eingangsfrage zu kommen, dann ist erkennbar, dass sich der Name MVTxVCxMV nicht auflösen läßt, da er auf einen Speicherbereich vom Typ Variant/Variant verweist. Aber auch die "Ebene" MVTxVCxMV(0) liefert noch den unauflöslichen Speicherbereich Variant/Variant und erst der eingesetzte Zeiger MVTxVCxMV(0)(1) liefer Variant/Double, den Bereich, der als Datentyp ausgewertet werden kann, den die sqr-Funktion erfordert. Leider weiß ich auch nicht mehr zu berichten.

Gruß!
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige