VBA-Iteration

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox


Excel-Version: 9.0 (Office 2000)
nach unten

Betrifft: VBA-Iteration
von: Ernst Dunkel
Geschrieben am: 25.06.2002 - 22:48:34

Hallo

Wer kann mir bei folgendem Problem behilflich sein?

In Zelle A1 wird ein Schätzwert für die Oberflächentemperatur eingegeben.
Zelle B1 errechnet die Oberflächentemperatur anhand hinterlegten Formeln, welche auf A1 zurück greifen.
Zelle A1 muss solange verändert werden, bis sie der Zelle B1 entspricht.

Wer hat eine VBA-Lösung für diese Aufgabe?


nach oben   nach unten

Re: VBA-Iteration
von: Ramses
Geschrieben am: 25.06.2002 - 23:50:00

Hallo Ernst,

Da ich davon ausgehe dass deine Formel in B1 irgendwelche Multiplikationen oder Divisionen beinhaltet, ist dies ein aussichtsloses unterfangen.

Aber wenn du willst, kannst du das mal probieren


Sub NeverEnd()
Do Until Range("A1") = Range("B1")
Range("A1") = Dein neuer Wert
Loop
End Sub

Es ist davon auszugehen dass sich dein Rechner dabei aufhängt, .. dann bitte mit "Ctrl" und "Break" das Makro abbrechen.

Gruss Rainer


nach oben   nach unten

Re: VBA-Iteration = Endlosscheife
von: Nike
Geschrieben am: 26.06.2002 - 00:08:15

Hi,
jo, Ramses hat Recht, wird wohl in der Form in ner
Endlosschleife enden, nimm lieber den Solver dafür...
oder gib das zu vergleichende Ergebnis jeweils in
ner anderen Zelle aus...

Bye

Nike


nach oben   nach unten

Re: VBA-Iteration
von: Ernst Dunkel
Geschrieben am: 26.06.2002 - 07:18:04

Hallo Rainer
Vielen Dank für Deine Bemühungen.
Das Ding funktioniert bestens, wenn man B1 auf
zwei Kommastellen rundet. Man könnte auch den Code
erweitern mit der Anweisung die Schleife soll z.B.
10 mal durch laufen und dann abbrechen.

Sub TempEnd()
Do Until Range("A1") = Range("B1")
Range("A1") = Range("B1")
Loop
End Sub


nach oben   nach unten

Limitierte Schleife
von: Ramses
Geschrieben am: 26.06.2002 - 07:59:43

Hallo Ernst,

das geht natürlich auch:


Sub SureEnd()
Dim As Integer, Limit as Integer
Limit = 10
For i = 1 to Limit
If Range("A1") <> Range("B1") Then
Range("A1") = Dein neuer Wert
Next i
If i = Limit Then
Msgbox "Keine Lösung gefunden"
End If
End Sub

Gruss Rainer

nach oben   nach unten

Re: VBA-Iteration = Endlosscheife
von: Harald Kapp
Geschrieben am: 26.06.2002 - 08:21:59

Hallo,
Also mit dem Solver braucht man m.E. einen Zwischenschritt: Man definiert eine Zielzelle, z.B. C1 mit der Formel =A1-B1. Dann setzt man den Solver (oder die Zielwertsuche) darauf an mit dem Zielwert C1=0 und der veränderbaren Zelle A1.

Wenn man Spaß daran hat, kann man das Problem auch mittels der "Regula Falsi" (http://www.unibw-hamburg.de/WWEB/math/uebe/Lexikon/C/Computation-Bsp1.pdf)durchprogrammieren:


Sub Regula_Falsi()
Const Max_Iterationen = 1000 ' kann man auch ändern
Const Genauigkeit = 0.000000001 ' kann man auch ändern

Dim x1, x2, xk, y1, y2, yk As Double
Dim Fehler As Double
Dim As Long

Application.ScreenUpdating = False
x1 = -1 ' hier "vernünftige" Schätzwerte eingeben
x2 = 1 ' hier "vernünftige" Schätzwerte eingeben
' die folgenden Zeilen wären einfacher, wenn man y=f(x) als Funktion programmiert.
' So hole ich den Wert eben aus der Formel der Zelle B1
Cells(1, 1) = x1
y1 = Cells(1, 2) - x1 ' Da die regula falsi Nullstellen findet, muss x1 sibtrahiert werden
Cells(1, 1) = x2      ' man sucht ja nach x=f(x) -> f(x)-x = 0
y2 = Cells(1, 2) - x2
k = 0
Do
   k = k + 1
   xk = x1 - y1 * (x1 - x2) / (y1 - y2)
   Cells(1, 1) = xk
   yk = Cells(1, 2) - xk
   Fehler = Abs(xk - x2)
   ' Die Prüfung der numerischen Divergenz habe ich hier mal ausgelassen
   ' Zur Vorbereitung der nächsten Iteration werden die Werte der Variablen so umkopiert, dass
   ' die Indizes wieder passen (vgl. http://www.unibw-hamburg.de/WWEB/math/uebe/Lexikon/C/Computation-Bsp1.pdf)
   x1 = x2
   x2 = xk
   y1 = y2
   y2 = yk
Loop Until k = Max_Iterationen Or Fehler < Genauigkeit

Application.ScreenUpdating = True
End Sub

Nur so als Anregung für lange Nächte :-)

Gruß Harald

nach oben   nach unten

Re: Dank an Nike und Harald,
von: Ernst Dunkel
Geschrieben am: 26.06.2002 - 20:46:02

Hallo Harald

Vielen Dank für Deine Bemühungen

Die Lösung nach Regula-Falsi ist sehr gut! Ich hätte bestenfalls das Newton'sche Näherungsverfahren anwenden können
x1=x0- [f(x0) / f'(x0)], darin ist f'(x) die erste Ableitung der Funktion f(x).

Hallo Rainer
Deine Lösung ist für mich die einfachste, vielen Dank.

Gruss Ernst


 nach oben

Beiträge aus den Excel-Beispielen zum Thema "Excel Zellen formatieren!"