Collapse column

Autor Thema: Office 2007: VBA und die 2 Dimensionale Interpolation  (Gelesen 838 mal)

Offline drragon

  • Newbie
  • *
  • Beiträge: 1
    • Profil anzeigen
  • Office-KnowHow: Fortgeschritten
  • VBA-KnowHow- : Mittelmäßig
  • Version [Office] : Office 2007
Office 2007: VBA und die 2 Dimensionale Interpolation
« 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

Keine Lösung gefunden? Du kannst Dich gerne an unser erfahrenes Experten-Team wenden und Dein Anliegen in Auftrag geben.
>>> Schnell und einfach ein unverbindliches Angebot anfordern. Per E-Mail an anfrage@excel-inside.de oder per Online-Formular
<<<

!!! Wichtige Information
!!! Dieses Forum steht aus technischen Gründen ab dem 11. September 2019 nur noch im Lesemodus zur Verfügung.
Das NEUE Office-Fragen-Forum kannst du aber unter der gewohnten Domain https://office-fragen.de wie gewohnt nutzen.

- Wir freuen uns auf deinen Besuch im neuen Forum.

Offline lupo1

  • Sr. Member
  • ****
  • Beiträge: 250
    • Profil anzeigen
  • Office-KnowHow: Anfänger
  • VBA-KnowHow- : Ohne
  • Version [Office] : Office 2010
Antw:Office 2007: VBA und die 2 Dimensionale Interpolation
« Antwort #1 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)
« Letzte Änderung: März 14, 2017, 10:20:40 Vormittag von lupo1 »
MfG Lupo1 (und natürlich gern auch Hallo!)

Offline lupo1

  • Sr. Member
  • ****
  • Beiträge: 250
    • Profil anzeigen
  • Office-KnowHow: Anfänger
  • VBA-KnowHow- : Ohne
  • Version [Office] : Office 2010
Und jetzt die VBA-Function
« Antwort #2 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)
« Letzte Änderung: März 15, 2017, 17:27:09 Nachmittag von lupo1 »
MfG Lupo1 (und natürlich gern auch Hallo!)

Offline lupo1

  • Sr. Member
  • ****
  • Beiträge: 250
    • Profil anzeigen
  • Office-KnowHow: Anfänger
  • VBA-KnowHow- : Ohne
  • Version [Office] : Office 2010
Etwas verallgemeinert
« Antwort #3 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)
« Letzte Änderung: März 08, 2018, 13:04:57 Nachmittag von lupo1 »
MfG Lupo1 (und natürlich gern auch Hallo!)

Wenn du dich noch intensiver mit Excel beschäftigen möchtest, dann empfiehlt sich ein Online-Kurs,
in dem du sehr viel über Excel erfährst und das gelernte umgehend in der Praxis anwenden kannst.