Microsoft Excel

Herbers Excel/VBA-Archiv

Worksheetfunction für Array-Funktionen | Herbers Excel-Forum


Betrifft: Worksheetfunction für Array-Funktionen von: Martin
Geschrieben am: 21.12.2009 17:47:16

Hallo,

ich möchte die RGP-Funktion unter VBA für eine mehrdimensionale Interpolation nutzen:
y = b + m1*z1 + m2*z2

...
Dim LaneRecY(n,1) as Double
Dim LaneRecZ(n,2) as Double
Dim BestFit(5,3) as Double
...
BestFit() = WorksheetFunction.LinEst(LaneRecY, LaneRecZ, True, True)
...

Dann mosert Excel: Keine Zuweisung an Datenfeld möglich!

Wie kann ich Matrix-Formeln wie RGP als WorksheetFunction nutzen?
Wenn das grundsätzlich nicht funktionieren sollte, warum werden dann diese Function überhaupt als Bestandteil des Objects Worksheetfunction angeboten?

Vielleicht hat ja jemand eine Idee,
vorab vielen Dank,
Martin

  

Betrifft: Das geht schon, aber nicht so,... von: Luc:-?
Geschrieben am: 21.12.2009 17:58:52

...Martin...!
Du musst das Ergebnis einem Variant, keinem festgelegten Feld zuweisen! Letzteres geht nämlich nur elementweise. Der Variant enthält dann eben das Ergebnisfeld und kann fast wie üblich auch elementweise ausgewertet wdn — (index1)(index2)(...).
Gruß Luc :-?


  

Betrifft: AW: Das geht schon, aber nicht so,... von: Martin
Geschrieben am: 22.12.2009 09:29:02

Hallo Luc,

danke für Deinen Tipp, damit habe ich gestern abend auch noch rumexperimentiert. Leider ändert sich dadurch nur die Fehlermeldung.

...
Dim BestFit As Variant
Dim LaneRecY(n,1) as Double
Dim LaneRecZ(n,2) as Double
...
BestFit = WorksheetFunction.LinEst(LaneRecY, LaneRecZ, True, True)
...
Fehlermeldung:
Laufzeitfehler 1004:
Die LinEst-Eigenschaft des WorksheetFunction-Objekts kann nicht zugeordnet werden.

Mmult ergibt die gleiche Fehlermeldung. Mit z.B. Min(LaneRecZ) oder anderen Funktionen, die nur eine Zahl als Ergebnis zurückgeben, klappt es dagegen.

Hast Du vielleicht noch eine andere Idee?
Martin


  

Betrifft: AW: Das geht schon, aber nicht so,... von: Martin
Geschrieben am: 22.12.2009 15:38:30

Hallo zusammen,

mein Fehler lag in der Definition der Arrays. Linest ist über die nicht besetzten, nullten Spalten gestolpert.

...
Dim LaneRecY() As Variant
Dim LaneRecZ() As Variant
Dim BestFit As Variant
...
ReDim LaneRecY(1 To AnzSteps, 1 To 1) As Variant
ReDim LaneRecZ(1 To AnzSteps, 1 To 2) As Variant
...
BestFit = WorksheetFunction.LinEst(LaneRecY, LaneRecZ, True, True)
With WS_AB.Range("BestFitTab")
Range(.Offset(1, 0), .Offset(1 + UBound(BestFit, 1) - 1, 0 + UBound(BestFit, 2) - 1)).Value = BestFit
End With
...

So läuft es jetzt, leider brachte es nicht den erhofften Geschwindigkeitsgewinn.
Ob der Input auch Double sein kann, habe ich nicht mehr getestet.

Danke für's Mitdenken,
Martin


  

Betrifft: Bitte sehr! Gern... FroWein! owT von: Luc:-?
Geschrieben am: 22.12.2009 21:13:46

:-?