Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
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
Inhaltsverzeichnis

Schwirigkeiten mit dynamischen Array

Schwirigkeiten mit dynamischen Array
24.07.2017 16:02:55
Sebastian
Hallo VBA-Freunde,
ich habe meine Schwirigkeiten mit einem dynamischen Array, welches ich durch for und if-schleifen produzieren möchte. Der VBA-Code lautet wir folgt und scheitert an ReDim auf Grund von Preserve (Datenfehler bereits dimensioniert). Wenn ich preserve entferne bekomme ich ein "Laufzeitfehler 13" weil theLeastSquareCoef fehler 2015 aufweißt bzw. Array y1 und x1 meiner Meinung nach nicht deklariert sind, wie ich es möchte. Ich würde mich sehr über eure Hilfe freuen. Ach, noch ein Hinweis, der hier aufgeführte Code ist ein Auszug.
Dim i, n As Integer
n = 1
Dim x(1 To 7, 1 To 1)
x(1, 1) = 7
x(2, 1) = 8
x(3, 1) = 9
x(4, 1) = 10
x(5, 1) = 12
x(6, 1) = 14
x(7, 1) = 16
Dim y1(1 To 7, 1 To 1) As Variant
Dim x1(1 To 7, 1 To 1) As Variant
y1(1, 1) = y(1, 1)
x1(1, 1) = x(1, 1)
For i = 2 To 7
Stop
If y(i, 1) "NDM" Then
If y(i, 1) = 1 And y(i - 1, 1) = 1 Then
n = n - 1
ReDim Preserve y1(1 To n, 1 To 1) As Variant
ReDim Preserve x1(1 To n, 1 To 1) As Variant
y1(n, 1) = y(i, 1)
x1(n, 1) = x(i, 1)
Else
ReDim Preserve y1(1 To n, 1 To 1) As Variant
ReDim Preserve x1(1 To n, 1 To 1) As Variant
y1(n, 1) = y(i, 1)
x1(n, 1) = x(i, 1)
End If
If i 7 Then
n = n + 1
End If
End If
Next
'y1(1, 1) = y(3, 1)
'y1(2, 1) = y(4, 1)
'y1(3, 1) = y(5, 1)
'y1(4, 1) = y(6, 1)
'X1(1, 1) = x(3, 1)
'X1(2, 1) = x(4, 1)
'X1(3, 1) = x(5, 1)
'X1(4, 1) = x(6, 1)
Dim R2 As Double
theLeastSquareCoef = Application.LinEst(y1, Application.Power(x1, Array(1, 2, 3)), , True)
Alpha0_Mach_Effect = Application.Index(theLeastSquareCoef, 1, 1) * t_to_c ^ 3 + _
Application.Index(theLeastSquareCoef, 1, 2) * t_to_c ^ 2 + _
Application.Index(theLeastSquareCoef, 1, 3) * t_to_c + _
Application.Index(theLeastSquareCoef, 1, 4)
R2 = Application.Index(theLeastSquareCoef, 3, 1)

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schwirigkeiten mit dynamischen Array
24.07.2017 16:34:08
mmat
Hallo,
ein Drücken von F1 ist manchmal doch recht hilfreich. ;-)
Bei mehrdimensionalen Arrays kann nur die letzte Dimension dynamisch verändert werden.
Du versuchst scheinbar die 1. Dimension zu ändern.
vg, MM
AW: Schwirigkeiten mit dynamischen Array
24.07.2017 16:34:25
Tino
Hallo,
dein Problem ist die Größe wird bereits bei der Deklarierung festgelegt.
Wenn du die Größe im Verlauf des Codes festlegen willst,
musst du dies Undimensioniert deklarieren.
Dim y1()
Im weiteren kann ein Array senkrecht nur einmal Re-Dimensioniert werden,
dies musst Du dann waagerecht durchführen.
ReDim Preserve y1(1 To 1, 1 To n)
Evtl. hilft dir auch dieser Link zum Thema.
http://www.online-excel.de/excel/singsel_vba.php?f=152
Gruß Tino
Anzeige
AW: Schwirigkeiten mit dynamischen Array
24.07.2017 16:45:21
Zwenn
Hallo Sebastian,
wie die anderen schon schrieben, kannst du bei Anwendung des Parameters Preserve nur die letzte Dimension eines Arrays ändern.
https://msdn.microsoft.com/de-de/library/gg251578.aspx
Das ist in Deinem Fall aber nicht weiter schlimm (außer dass man Preserve vermeiden sollte, weil es Zeit und Recourcenintensiv ist). Du dimensionierst 2 Array mit je 2 Dimensionen. Du verwendest aber nur eine Dimension. 1 to 1 kannst Du einfach weglassen. Daraus folgend auch bei jedem Aufruf eines Array Elementes den zweiten Parameter 1.
Viele Grüße,
Zwenn
Anzeige
AW: Schwirigkeiten mit dynamischen Array
24.07.2017 20:38:08
Sebastian
Vielen lieben dank für die schnellen Antworten.
Auch dies habe ich schon probiert und wieder verworfen, da ich wie beschrieben in diesem Fall einen Fehler 2015 bekomme für die Variable theLeastSquareCoef. Fehler 2015 = #WERT!, dies geschieht meiner Meinung nach durch die Arrays (Ich nutze den selben Code in einem anderem Teil der Funktion).
Könnt ihr mir nun auch weiterhelfen?
Dim i, n As Integer
n = 1
Dim x(1 To 7, 1 To 1)
x(1, 1) = 7
x(2, 1) = 8
x(3, 1) = 9
x(4, 1) = 10
x(5, 1) = 12
x(6, 1) = 14
x(7, 1) = 16
Dim y1()
Dim x1()
For i = 1 To 7
Stop
If i = 1 Then
ReDim Preserve y1(1 To n)
ReDim Preserve x1(1 To n)
y1(n) = y(i, 1)
x1(n) = x(i, 1)
n = n + 1
Else
If y(i, 1) "NDM" Then
If y(i, 1) = 1 And y(i - 1, 1) = 1 Then
n = n - 1
x1(1) = x(i, 1)
Else
ReDim Preserve y1(1 To n)
ReDim Preserve x1(1 To n)
y1(n) = y(i, 1)
x1(n) = x(i, 1)
End If
If i 7 Then
n = n + 1
End If
End If
End If
Next
Dim R2 As Double
theLeastSquareCoef = Application.LinEst(y1, Application.Power(x1, Array(1, 2, 3)), , True)
Alpha0_Mach_Effect = Application.Index(theLeastSquareCoef, 1, 1) * t_to_c ^ 3 + _
Application.Index(theLeastSquareCoef, 1, 2) * t_to_c ^ 2 + _
Application.Index(theLeastSquareCoef, 1, 3) * t_to_c + _
Application.Index(theLeastSquareCoef, 1, 4)
R2 = Application.Index(theLeastSquareCoef, 3, 1)
Anzeige
Bitte eine Beispielmappe
25.07.2017 10:55:44
Zwenn
Hallo Sebastian,
so kann Dir niemand weiterhelfen. Redim Preserve funktioniert nicht, wie Du es anwenden willst, das haben Dir jetzt 3 Leute gesagt. Du hast jetzt aber keine weiteren Infos für einen neuen Ansatz gegeben.
  • Was soll das ganze Makro eigentlich machen?

  • Wie sieht der Rest des Codes aus?

  • Am besten wäre es, wenn Du mal eine Beispielmappe hochlädst, damit man sich das Ganze mal im Zusammenhang ansehen und ausprobieren kann.
    Wenn Du nochmal Code postest, verwende bitte den Button Code pre über dem Texteingabefeld und platziere Deinen Code zwischen den pre-Tags. Man kann den von Dir geposteten Code sehr schlecht lesen, weil einfach alles untereinander steht. Alle Einrückungen gehen verloren und ich habe ehrlich gesagt wenig Motivation, mir erstmal alles zurecht zu formatieren, damit ich mir einen Überblick verschaffen kann.
    Viele Grüße,
    Zwenn
    Anzeige
    AW: Bitte eine Beispielmappe
    25.07.2017 21:41:01
    Sebastian
    Hallo und Danke für den Hinweis der Vorgehensweise Zwenn,
    Sieh es mir nach, Ich bin kein Forums und VBA Profi. Anbei habe ich die Beispielmappe mit der kompletten Funktion.
    https://www.herber.de/bbs/user/115054.xlsm
    Vielleicht versuche ich aber in Worten zu fassen, was ich erreichen will.
    Das Ziel ist einen gewissen Wert (Alpha0_Mach_Effekt) zu berechnen bzw. Diagramme mittels VBA zu codieren.
    Der Alpha0 Mach Effekt ist Abhängig von mehreren Einflussparametern (t/c, eta_MAC, Mach Number, Quarter Chord Sweep). Dabei ist der Ziel Wert quasi zusammengesetzt aus mehreren Einzeldiagrammen Alpha0_Mach_Effekt = f(t/c = 7%, 8%, 9%, 10%, 12%, 14%, 16%). Im Code sind das die y(1 to 7,1 to 1)-Werte, welche modelliert werden durch ein Polynom 3.Grades. y(1 to 7,1 to 1) ist also bekannt und kann folgende Werte ergeben: 1, "NDM" (heißt soviel wie Methode ist nicht valide in diesem Bereich) und eine rationale Zahl zwischen 1 und -1. Die Funktion soll dabei nicht limitiert sein auf die oben genannten t/c-Werte, sondern ebenfalls interpolieren zwischen den Werten. Die Schwierigkeit welche ich nun habe ist, die y(1 to 7,1 to 1) Werte in ein möglichst sinnvolles Array zu übergeben.
    Sinnvoll kann man dabei unter zu Hilfenahme eines Beispiels definieren:
    y(1,1) = 1
    y(2,1) = 1
    y(3,1) = 1
    y(4,1) = 0.68
    y(5,1) = -0.25
    y(6,1) = -0.76
    y(7,1) = "NDM"
    für
    x(1 to 7,1) = 7,8,9,10,12,14,16 (t/c-Parameter)
    Die Frage ist also unter Annahme das t/c = 10.5 ist, wie lautet y = Alpha0_Mach_Effekt?
    Hierzu muss also das Array angepasst werden auf:
    y1(1,1) = 1
    y1(2,1) = 0.68
    y1(3,1) = -0.25
    y1(4,1) = -0.76
    x1(1 to 4,1) = 9, 10, 12, 14
    Ich hoffe ich habe mich klar ausgedrückt. Vielen dank vorab für eure Hilfe. Wie gesagt, dachte ich, wirklich nur, dass die "Fehler" trivialer Natur sei.
    Beste Grüße,
    Sebastian
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige