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

Titel: Office 2007: VBA und die 2 Dimensionale Interpolation
Beitrag 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
Titel: Antw:Office 2007: VBA und die 2 Dimensionale Interpolation
Beitrag von: lupo1 am März 14, 2017, 09:53:07 Vormittag
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)
Titel: Und jetzt die VBA-Function
Beitrag von: lupo1 am März 15, 2017, 16:45:25 Nachmittag
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)
Titel: Etwas verallgemeinert
Beitrag von: lupo1 am März 08, 2018, 13:02:58 Nachmittag
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)