Zielwertsuche in Excel

  • Excel

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von INOPIAE.

    Zielwertsuche in Excel

    Guten Morgen zusammen,

    ich bin neu hier, zumindest aktiv und bin über google bei euch gelandet. Besten Dank für die Aufnahme!

    Nun scheitere ich leider an einer Zielwertsuche in Excel, wobei sie gestern noch funktioniert hat.

    Der Code:

    Visual Basic-Quellcode

    1. Sub goal()
    2. Sheets("calculation").[B14].GoalSeek goal:=Sheets("calculation").[B9], ChangingCell:=Sheets("calculation").[B13] 'hier ist das Problem
    3. End Sub
    4. Und er ist mit einer Abfrage einen Zellenänderung verknüpft:
    5. Private Sub Worksheet_Change(ByVal Target As Range)
    6. If Target.Address = "$B$6" Then
    7. Call goal
    8. End If
    9. End Sub

    Wie gesagt gestern einwandfrei funktioniert, nun kommt ab und zu, tatsächlich nicht immer Laufzeitfehler 1004, der Bezug ist ungültig. Dabei ist Zeile 2 vom Code oben gelb markiert. Ich habe aber nichts geändert.

    Vielleicht kann mir hier jemand helfen, wäre total super!

    Vielen Dank und viele Grüße

    Mathias

    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Bist Du Dir sicher das der Code funktioniert hat.

    Ich glaube Du hast den Bereich nicht sauber angesprochen.

    Versuche mal dies:

    Visual Basic-Quellcode

    1. Sheets("calculation").Range("B14").GoalSeek goal:=Sheets("calculation").Range("B9"), ChangingCell:=Sheets("calculation").Range("B13")
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „INOPIAE“ ()

    Prüfe doch bitte mal was wirklich in den Zellen drin steht mit diesem Code und dem Anzeigefenster:

    Visual Basic-Quellcode

    1. ​Private Sub Worksheet_Change(ByVal Target As Range)
    2. If Target.Address = "$B$6" Then
    3. Debug.Print "B14:" & Sheets("calculation").Range("B14").Formula
    4. Debug.Print "B6: " & Sheets("calculation").Range("B6").Value
    5. Debug.Print "B9: " & Sheets("calculation").Range("B9").Value
    6. Call goal
    7. End If
    8. End Sub
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Sorry, dass es so lange gedauert hat, ich habs mehrfach probieren müssen...

    Also nach deiner Anleitung kommt folgendes raus:
    Zeile 3: B14:=(B3*B3)*ACOS(-B13/B3)+(B13*SQRT((B3*B3)-(B13*B13))) - dies ist die gewünschte Formel
    Zeile 4: Eine Zahl
    Zeile 5: Eine Zahl

    So sieht es aus:

    Private Sub Worksheet_Change(ByVal Target As Range)

    End Sub
    If Target.Address = "$B$6" Then
    Debug.Print "B14:" & Sheets("calculation").Range("B14").Formula
    B14:=(B3*B3)*ACOS(-B13/B3)+(B13*SQRT((B3*B3)-(B13*B13)))
    Debug.Print "B6: " & Sheets("calculation").Range("B6").Value
    B6: 21,2025344227333
    Debug.Print "B9: " & Sheets("calculation").Range("B9").Value
    B9: 3316,8329041274
    Call goal
    End If
    End Sub

    Die Fehlermeldung kommt immer noch ab und zu und ebenfalls seltsam ist, dass die Zielwertsuche manchmal völlig andere Ergebnisse liefert. Also ich meine nicht geringfügig anders, sondern Abweichungen von 20%.

    Ich hoffe, ihr habt noch Ideen!

    Vielen Dank!
    Die Abweichung von 20% ist bei Deiner Berechnung ist durch den zufälligen Start der Iteration der Zielwertsuche zu verstehen. Durch deine Formel kann ich sehen, das die Abweichungen von 20% durchaus erklärbar sind. Es sind Auswirkungen im ACOS.

    Du solltest Dir die Debug-Ausgabe dann nochmal anschauen, wenn der Fehler aufgetreten ist. Bzw, die Ausgabe auch noch um die Zelle B3 erweitern.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Kann ich irgendwie eine höhere Genauigkeit erzwingen?

    B3 ergibt ebenso eine Zahl und zwar exakt die Zahl, die ich vorher berechne. Kann es sein, dass sich die Berechnungen quasi "überschneiden" und dadurch der Fehler kommt? B3 ist ein Radius, wird nur berechnet aus Durchmesser/2
    Dann baue Dir doch selbst eine Iteration statt die Zielwertsuche zunehmen.

    Pseudocode:

    Visual Basic-Quellcode

    1. Dim dblSchrittweite as Double
    2. dblSchrittweite = 0.01
    3. do until B14 = B9
    4. B3 = B3 + dblSchrittweite
    5. loop
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).