Schleife in Excel programmieren

Hallo!

Vorab, ich habe keinerlei Erfahrung in Programmieren. Ich bin momentan in einem Praktikum und soll in einer Exceltabelle eine Schleife programmieren.
Ich habe bisher eine Lösung geschafft, die zwar funktioniert aber nicht so elegant ist, wie sie sein soll. Hier erstmal der VBA-Code für die bestehende Schleife:

Sub Schleife()
Dim Flow As Range
Dim Druckverlust As Range
Dim Druck As Range
Dim DV As Single
Dim ASSFlow As Range

Set Flow = Worksheets(„Druckverluste Steuer-Öl“).Range(„A14“)
Set Druckverlust = Worksheets(„Druckverluste Steuer-Öl“).Range(„B4“)
Set Druck = Worksheets(„Druckverluste Steuer-Öl“).Range(„O3“)
Set ASSFlow = Worksheets(„Druckverluste Steuer-Öl“).Range(„O8“)

If ASSFlow = 0 Then
MsgBox („ASS-Flow darf nicht 0 sein! Bitte einen Wert größer 0 angeben“)
ASSFlow = 0.001
End If

DV = 0.001
Flow = 0
Do
Flow = Flow + DV
Loop Until Druckverlust >= Druck
End Sub

Bisher addiert Excel in Zelle A14 solange 0,001 dazu, bis in Zelle B4 der Wert >= dem Wert in Zelle O3 ist.

Nun soll es jedoch so ablaufen, dass ich z.B. das Intervall DV von mir aus auf 4 setze und Excel sobald der Wert in B4 größer ist als in O3 abbricht. Dann soll vom bisherigen Intervall wieder die Hälfte abgezogen werden. Dann wieder Hälfte… Und das solange, bis der Wert Druckverlust (B4) nur noch ca. 5% größer ist als der Wert Druck (O3). Sollte durch die letzte Operation der Wert in B4 wieder deutlich unter O3 liegen, soll wieder die Hälfte vom gerade benutzen Intervall addiert werden, bis B4 dann ca. 5% kleiner ist als O3.

Also kurz B4 soll sich an O3 bis auf ca. ±5% annähern.
Ich hoffe Ihr könnt mein Anliegen verstehen
Und wie gesagt, ich habe von Programmieren überhaupt keine Ahnung und bin schon froh und stolz darauf, dass ich die bisherige Schleife hinbekommen habe!

Vielen Dank

Daniel

Hallo,

warum möchtest du das in VBA machen? Ist das eine Überung um VBA zu lernen oder geht es nur darum, das Ziel zu erreichen?

Du versuchst da eine rudimentäre Iteration zu bauen. Wenn es nicht in VBA sein muss, kannst du einfacher die Zielwertsuche oder den Solver in Excel benutzen. Da kommt dann auch das optimale Ergebnis raus, und nicht nur irgendeins, das im Toleranzbereich liegt.

Wenn es unbedingt VBA sein soll, melde dich nochmal, dann sehe ich es mir mal genauer an…

Ja es soll in VBA geschehen. Es soll sowohl eine Übung für mich sein, als auch zum Ziel führen :smile: Natürlich kann auch das genaue Ergebnis bei dem Verfahren herauskommen. Ist aber kein Muss.

Vielen Dank

Also kurz B4 soll sich an O3 bis auf ca. ±5% annähern.

Hallo Daniel,

„klingt“ machbar.
Irhendwie habe ich das Gefühl, du hast uns irgendwelche Formeln im Blatt verschwiegen.
Jedenfalls macht dein Code für mich wenig Sinn.
Muß aber nix bedeuten, vielleicht stehe ich grad auf dem Schlauch :smile:

Ich sehe daß anfangs diese IF ASSFlow Then Schleife kommt, danach hat ASSFlow den Wert 0,001 oder aber den Wert den es vorher hatte, sofern der ungleich Null war.
Aber das ist egal, da ASSFlow im späteren Code keine Rolle mehr spielt.

In der nachfolgenden Do-Loop Schleife erhöhst du Flow solange bis Druckverlust >= Druck ist, vom Code her gesehen beeinflußt aber Flowerhöhung Druckverlust oder Druck nicht im Geringsten.
So gesehen eine Endlosschleife oder eine die nur einmal durchlaufen wird.

Gruß
Reinhard

Also das ASS-Flow hat nicht wirklich etwas mit der Schleife zu tun. Das ist nur ein Eingabewert in der Tabelle, der nicht Null sein darf, da sonst in einigen Zellen durch Null geteilt werden würde.

Der Wert Druckverlust ist in meinem Tabellenblatt eine Summe aus mehreren einzelnen Druckverlusten, die im Tabellenblatt mittels verschiedener Formlen berechnet werden. Jeder einzelne Druckverlust verändert sich in Abhängigkeit von dem Flow in Zelle A14 und somit halt auch die Summe :wink:

Also wie schon gesagt der Teil mit ASS-Flow hat nichts mit meiner Schleife zu tun. Den Teil kann man also bei der Betrachtung meines Problems vernachlässigen.

Danke

Was ich vergessen habe…

Der Wert Druck wird auch vom Benutzer der Tabelle vorgegeben.

1 „Gefällt mir“

Also,

was ich immer noch nicht verstehe, ist warum du das nicht einfach in einem Excel-Blatt ausrechnest. Zu hast einen Zielwert und nur einen Wert, der verändert werden soll. Dass kann man ja schon mit einem Taschenrechner ausrechnen. Oder gibt es doch noch Funktionen im Arbeitsblatt?

Aber gut, dann erst mal zu VBA: Da du ja scheinbar lernen sollst, gibt es keine Komplettlösung, sondern nur ein paar Tipps zum weiter nachdenken.

Die Schleife lässt du bisher laufen, bis der Wert auf den Addiert wird zu groß ist. Da du aber einen Wert innerhalb einer Toleranz suchst, musst du das auch so in der Schleife umsetzten.

Das Abbruch Kriterium für die Schleife muss also sein, dass der Zielwert innerhalb der Toleranz liegt. Also prüfst du innerhalb der Schleife, ob der Zielwert innerhalb der Toleranz liegt, wenn nein, Schleife weiter laufen lassen, sonst Schleife verlassen.

Leg dazu erst mal die Variable weiter fest: Dim weiter as boolean

In der Schleife prüfen, ob Ziel innerhalb der Toleranz: Wenn ja, weiter = false sonst weiter = true

Abbruchbedingung in der Schleife: Loop until weiter
Vor der Schleife weiter auf wahr setzen: weiter = true

Dann kommt jetzt noch der Wechsel der Suchrichtung:

Du benötigst eine Variable, in der du die Suchrichtung speicherst:

Dim suchrichtung as integer

Vor der Schleife legst du die erste Suchrichtung als vorwärts fest: suchrichtung = 1

Jetzt die Prüfung und Berechnung in der Schleife

if suchrichtung = 1 then
flow = flow + dv
if druckverlust > druck then
suchrichtung = -1
dv = dv /2
end if
else
flow = flow - dv
if druckverlust

Also erstmal schon ein dickes DANKESCHÖN!

Aber irgendwie komme ich noch immer nicht klar! Ich bin halt was VBA und erstrecht Programmieren allgemein angeht ein unbeschriebenes Blatt. Ich strebe ja auch nicht an Informatik o.ä. zu werden. Ich studiere Maschinenbau und bin gerade im Zuge des Studiums in meinem Fachpraktikum und habe eben diese für meine Begriffe „sehr bescheidene Aufgabe“, die m.E. nicht mit Maschinenbau zu tun hat, erhalten…
Mein Betreuer war halt nur total entsetzt, als ich ihm sagte, ich könne nicht programmieren und deshalb diese Aufgabe…

Mit der Hilfe von dir sieht das Ganze bei mir jetzt so aus:

Sub Schleife()
Dim Flow As Range
Dim Druckverlust As Range
Dim Druck As Range
Dim DV As Single
Dim ASSFlow As Range
Dim weiter As Boolean
Dim suchrichtung As Integer

Set Flow = Worksheets(„Druckverluste Steuer-Öl“).Range(„A14“)
Set Druckverlust = Worksheets(„Druckverluste Steuer-Öl“).Range(„B4“)
Set Druck = Worksheets(„Druckverluste Steuer-Öl“).Range(„O3“)
Set ASSFlow = Worksheets(„Druckverluste Steuer-Öl“).Range(„O8“)

If ASSFlow = 0 Then
MsgBox („ASS-Ventil Flow darf nicht 0 sein!“)
ASSFlow = InputBox(„Geben Sie einen Wert größer 0 ein“)
End If
If ASSFlow = 0 Then
MsgBox („ASS-Ventil Flow darf nicht 0 sein! Bitte einen Wert größer 0 angeben“)
ASSFlow = 0.001
End If

DV = 4
Flow = 0
weiter = True
suchrichtung = 1

Do
Flow = Flow + DV
If Abs(Druck - Druckverlust) / Druck Druck Then
suchrichtung = -1
DV = DV / 2
End If
Else
Flow = Flow - DV
If Druckverlust

Hi,

also Maschinenbau hat schon was mit Informatik zu tun. Oder was meinst du, wie z. B. Produktionsstraßen im Autobau gesteuert werden? Selbst wenn das eigentliche Programmieren hinterher ein IT-Team macht, kann es ja nicht schaden so grundsätzlich zu verstehen, wie es funktioniert.

Informatiker bin ich auch nicht, hab auch noch nie einen EDV-Kurs besucht. Aber alles, was man nachlesen kann, kann man auch lernen…

Zurück zu deinem Problem:

Sieht doch gar nicht so schlecht aus.

Das flow = flow + dv nach dem do musst du weglassen. Diese Rechnung erfolgt ja schon in der Verschachtelten if-Abfrage - je nach Suchrichtung addieren oder subtrahieren. So wie es jetzt ist, würde ja bei jedem Schleifendurchlauf unabhängig von der Suchrichtung DV addiert werden - also weglassen.

Die Prüfung, ob das Ergebniss innerhalb der Toleranz liegt, musst du noch an das Ende der Schleife schieben. Diese Prüfung macht ja erst Sinn, wenn vorher was berechnet wurde. Ich denke, so sollte es klappen - kann ich aber momentan nicht testen.

Do
If suchrichtung = 1 Then
Flow = Flow + DV
If Druckverlust > Druck Then
suchrichtung = -1
DV = DV / 2
End If
Else
Flow = Flow - DV
If Druckverlust

Ende der Schleife:

loop until weiter oder
loop until weiter = true

Die Schleife soll ja weiterlaufen, wenn die wenn weiter wahr ist (weiter = weiter in der schleife). Etwas missverständliche Bezeichnung

Ok super hat alles funktioniert. Ich danke dir vielmals! Natürlich kann man alles lernen und dazu bin ich ja auch bereit. Die Lernmöglichkeiten sind hier aber diesbezüglich nicht wirklich vorhanden (kein Buch, keine richtige Erklärung usw.). Es war halt mehr ein: so hier das Problem, darauf wollen wir hinaus und dann mach mal…

Also nochmal vielen Dank!

Hi,

das mit dem hingeworfenen Problem wird dir später meistens so gehen. Der Kunde (oder deine Chefs) bestellen was bei dir und du machst fertig. Wie du das machst interessiert dann keinen mehr.

Viele Bücher (oder Tutorials) gibt es auch im Internet (oft sogar kostenlos): http://openbook.galileocomputing.de/excel_2007/excel… (Kap. 23 für VBA)