Microsoft Office Forum [ www.Office-Fragen.de ] >> READONLY <<
Microsoft Office 2003-2019 => Excel => Thema gestartet von: drragon am März 14, 2017, 08:15:58 Vormittag
-
Hallo zusammen,
ich habe folgendes Problem, ich muss ein VBA Programm schreiben das eine 2 Dimensionale Interpolation ausführt. (Der Übersichtshalber habe ich einen Auszug angehängt).
Das Programm muss automatisch, aus den Werten in der unteren Tabelle (Sun Azimut und Sun Height) in die obere Tabelle gehen, wo die verschiedenen Wirkungsgrade stehen. Anschließend muss das Programm sich die jeweilligen 2 Azimut Winkel, die zwei Sun Height Winkel und die dazugehörigen Wirkungsgrade aus der mitte herausziehen um eine 2 Dimensionale Interpolation durchzuführen.
Ich hoffe ich bin hier richtig und jemand kann mir bei meinem Probelm behilflich sein.
Beste Grüße
-
In Deiner Tabelle fehlen noch Sun Height = 0 und Azimut = 0. Deshalb habe ich die Formel erst für Zeile 24 eingetragen. Bitte noch mal kontrollieren! Fehler sind bei so etwas immer möglich.
Die VBA-Lösung erhältst Du durch Aufzeichnen des Eintrags dieser Formel. Natürlich (und ressourcensparender) kann man das auch per Variablen-Ermittlung machen mit dem Vorteil, dass es keine Mehrfachberechnungen gibt. Denn in der Formel gibt es nur 2 verschiedene VERGLEICHe überhaupt, obwohl da 30 davon stehen:
C24:
=(B24-
INDEX($A$4:$A$11;VERGLEICH(B24;$A$4:$A$11)))/(
INDEX($A$4:$A$11;VERGLEICH(B24;$A$4:$A$11)+1)-
INDEX($A$4:$A$11;VERGLEICH(B24;$A$4:$A$11)))
*((A24-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))/(
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))*(
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11)+1;VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11)+1;VERGLEICH(A24;$B$3:$Y$3)))+
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11)+1;VERGLEICH(A24;$B$3:$Y$3))
-((A24-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))/(
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))*(
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3)))+
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3))))
+(A24-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))/(
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$3:$Y$3;VERGLEICH(A24;$B$3:$Y$3)))*(
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3)+1)-
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3)))+
INDEX($B$4:$Y$11;VERGLEICH(B24;$A$4:$A$11);VERGLEICH(A24;$B$3:$Y$3))
Mit 2 Hilfszellen
C24: =VERGLEICH(A24;$B$3:$Y$3)
D24: =VERGLEICH(B24;$A$4:$A$11)
landen wir bei der erheblich schlankeren Variante
E24:
=(B24-
INDEX($A$4:$A$11;D24))/(
INDEX($A$4:$A$11;D24+1)-
INDEX($A$4:$A$11;D24))
*((A24-
INDEX($B$3:$Y$3;C24))/(
INDEX($B$3:$Y$3;C24+1)-
INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24+1;C24+1)-
INDEX($B$4:$Y$11;D24+1;C24))+
INDEX($B$4:$Y$11;D24+1;C24)
-((A24-
INDEX($B$3:$Y$3;C24))/(
INDEX($B$3:$Y$3;C24+1)-
INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24;C24+1)-
INDEX($B$4:$Y$11;D24;C24))+
INDEX($B$4:$Y$11;D24;C24)))
+(A24-
INDEX($B$3:$Y$3;C24))/(
INDEX($B$3:$Y$3;C24+1)-
INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24;C24+1)-
INDEX($B$4:$Y$11;D24;C24))+
INDEX($B$4:$Y$11;D24;C24)
... und hier etwas zusammengerückter geschrieben:
E24:
=(B24-
INDEX($A$4:$A$11;D24))/(INDEX($A$4:$A$11;D24+1)-INDEX($A$4:$A$11;D24))
*((A24-
INDEX($B$3:$Y$3;C24))/(INDEX($B$3:$Y$3;C24+1)-INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24+1;C24+1)-INDEX($B$4:$Y$11;D24+1;C24))+INDEX($B$4:$Y$11;D24+1;C24)
-((A24-
INDEX($B$3:$Y$3;C24))/(INDEX($B$3:$Y$3;C24+1)-INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24;C24+1)-INDEX($B$4:$Y$11;D24;C24))+INDEX($B$4:$Y$11;D24;C24)))+
(A24-
INDEX($B$3:$Y$3;C24))/(INDEX($B$3:$Y$3;C24+1)-INDEX($B$3:$Y$3;C24))*(
INDEX($B$4:$Y$11;D24;C24+1)-INDEX($B$4:$Y$11;D24;C24))+INDEX($B$4:$Y$11;D24;C24)
-
Public Function Interpolation2Dim(ByVal B As Range, x, y)
Spaln = B.Columns.Count
Zeiln = B.Rows.Count
Horiz = B.Offset(0, 1).Resize(1, Spaln - 1)
Verti = B.Offset(1, 0).Resize(Zeiln - 1, 1)
Matri = B.Offset(1, 1).Resize(Zeiln - 1, Spaln - 1)
i = Application.Match(y, Verti)
j = Application.Match(x, Horiz)
xu = Horiz(1, j + 0): mu = Matri(i + 0, j + 0)
xo = Horiz(1, j + 1): mo = Matri(i + 0, j + 1)
yu = Verti(i + 0, 1): nu = Matri(i + 1, j + 0)
yo = Verti(i + 1, 1): no = Matri(i + 1, j + 1)
mm = (x - xu) / (xo - xu) * (mo - mu) + mu
nm = (x - xu) / (xo - xu) * (no - nu) + nu
nn = (y - yu) / (yo - yu) * (nm - mm) + mm
Interpolation2Dim = nn
End Function
Aufruf der Funktion:
C24: =Interpolation2Dim($A$3:$Y$11;A24;B24)
-
Aufgrund schon mehrfacher Nachfrage in den Foren zur 2-dim Interpolation:
Die Tabelle selbst mit Header, Fronter und Daten sei mit
x x x x x
y z z z z z
y z z z z z
y z z z z z
y z z z z z
und die Eingabewerte a und b sowie die Hilfszellen c und d entspr. bezeichnet.
Dann muss man also in unserem Beispiel in E24 stehend benennen:
x: =$B$3:$Y$3
y: =$A$4:$A$11
zz: =$B$4:$Y$11
a: =$A24
b: =$B24
cc: =$C24 und in C24: =VERGLEICH(a;x)
d: =$D24 und in D24: =VERGLEICH(b;y)
z und c werden als zz und cc geschrieben, um keine internen Konflikte zu verursachen.
Die Formel wird nun allgemeingültig zu
E24:
=(b-INDEX(y;d))/(INDEX(y;d+1)-INDEX(y;d))
*((a-INDEX(x;cc))/(INDEX(x;cc+1)-INDEX(x;cc))*(INDEX(zz;d+1;cc+1)-INDEX(zz;d+1;cc))+INDEX(zz;d+1;cc)
-((a-INDEX(x;cc))/(INDEX(x;cc+1)-INDEX(x;cc))*(INDEX(zz;d;cc+1)-INDEX(zz;d;cc))+INDEX(zz;d;cc)))
+(a-INDEX(x;cc))/(INDEX(x;cc+1)-INDEX(x;cc))*(INDEX(zz;d;cc+1)-INDEX(zz;d;cc))+INDEX(zz;d;cc)