vielen Dank für deine Antwort. Leider war der Thread schon archiviert, so dass ich das Thema noch einmal als neuen Beitrag reinstelle. (Die Emailbenachrichtigung deiner Antwort hatte mich nicht erreicht.)
Einige der von dir skizzierten Möglichkeiten sind schon verlockend. Wusste gar nicht, dass so was geht (-:
Es wäre natürlich genial, wenn die Eingaben und die Ausgaben in einem separaten Excel-file stattfinden. Damit ist dann fast unbegrenzte Flexibiltät der Anwendung ohne ständiges copy-pasten des VBA codes gegeben.
Der Einfachheit halber würde ich lieber keine userforms verwenden, sondern einfache Eingaben in Zellen präferieren.
Zu der Anzahl der Variablen reicht erst mal eine. Da ich selber auch gerne bastle, würde mir als Start diese Grund-Version erstmal reichen. Auf Basis eines funktionierenden Codes, kann ich dann ja immer noch weiter ausbauen, wenn der Bedarf entsteht.
Wichtige wäre noch, dass die Zielwert-Suche auf älteren Rechnern zu Abstürzen führte. Ich vermute, dass die Tabelle zu komplex war und die Berechnung nicht so schnell erfolgen konnte, wie die Zielwertsuche die Eingabewerte variiert. Wie kann man daher nach jedem Durchlauf eine kurze Pause programmieren, damit der Prozessor nachkommt?
Ich hoffe, der Thread wird noch einmal aufgegriffen.
Schon mal die besten Grüße und Danke,
Christian
_______________________________________________________________________________
Liebe Excelianer,
folgende Aufgabe möchte ich automatisieren:
Ich muss immer mal wieder Vergleichsrechnungen in großen Tabellen anstellen, in denen sich meist nur 1 Wert ändert.
Bisher habe ich jedesmal den Wert geändert, Ergebnis notiert, neuer Wert, wieder notiert u.s.w.
Nun möchte eine Routine schreiben, mit der ich:
1. Festlegen kann in welcher Zelle der Wert geändert werden soll.
2. Mit welchem Startwert ich anfangen will.
3. Festlegen in welchem Intervall (z.B. 1 bis 10 in 2erschritten) der Wert geändert werden soll
4. Festlegen welche Ergebniszelle ausgelesen werden soll.
5. Festlegen in welcher Zelle beginnend das ausgelesene Ergebnis geschrieben werden soll und
5. Den Durchlauf starten und nach jedem Durchlauf das ausgelesene Ergebnis untereinander in eine Spalte loggen kann.
Ich habe bereits einen ganz ähnlichen Code zusammengefunden, der in etwa das macht, was ich auch brauche, jedoch nur weniger flexibilät. Ich muss zugeben, dass ich es aber nicht so hinbekomme, wie es am Ende aussehen soll.
Ich würde mich freuen, wenn jemand ein paar Ideen dazu hat. Der Basiscode steht unten:
Sub PPA_Sensitivity(s_type, S_IRR, i_first_row, S_output_variable, S_output_result)
Dim s_set_value As String
Dim S_sheet As String
Dim i_set_row As Integer
Dim S_equ As String
Dim A_results(1000, 2) As Variant
Dim i_numloop As Integer
Dim II As Integer
Dim b_is_array As Boolean
Dim S_Original_location As String
'clear the contents of the results sheet for the rows to be reported
Sheets("Sensitivity Results").Select
Range(S_output_variable + "3:" + S_output_result + "10000").Select
Selection.ClearContents
i_set_row = i_first_row
S_equ = S_IRR
S_sheet = "Sensitivity analysis"
'select sensitivity sheet
Sheets(S_sheet).Select
'Turn off all the autofiltering
Sheets(S_sheet).AutoFilterMode = False
'find the original location of the data
S_Original_location = Right(Worksheets(S_sheet).Range("B" + CStr(i_set_row)).Formula,
Len(Worksheets(S_sheet).Range("B" + CStr(i_set_row)).Formula) - 1)
'store the set value in an internal variable for later usage.
b_is_array = Worksheets("Project Data").Range(S_Original_location).HasArray
s_set_value = Worksheets("Project Data").Range(S_Original_location).Formula
'Calculate the number loops that need to be made
i_numloop = CInt((Worksheets(S_sheet).Range("B" + CStr(i_set_row + 2)).Value -
Worksheets(S_sheet).Range("B" + CStr(i_set_row + 1)).Value) / Worksheets(S_sheet).
Range("B" + CStr(i_set_row + 3)).Value)
'write the variable in question to the results sheet
If s_type = "IRR" Then
Worksheets("Sensitivity Results").Range(S_output_result + CStr(2)).Value = "IRR"
End If
For II = 0 To i_numloop
A_results(II, 0) = Worksheets(S_sheet).Range("B" + CStr(i_set_row + 1)).Value + _
Worksheets(S_sheet).Range("B" + CStr(i_set_row + 3)).Value * II
'put the current value in the cell on the project description page
Worksheets("Project Data").Range(S_Original_location).Value = A_results(II, 0)
Calculate
A_results(II, 1) = Worksheets("Cash Flow").Range(S_equ).Value
'Write the data to the results sheet
Worksheets("Sensitivity Results").Range(S_output_variable + CStr(II + 3)).Value = _
A_results(II, 0)
Worksheets("Sensitivity Results").Range(S_output_result + CStr(II + 3)).Value = _
A_results(II, 1)
Next II
'Now put the original value back into the project data sheet
If b_is_array Then
Worksheets("Project Data").Range(S_Original_location).FormulaArray = s_set_value
Else
Worksheets("Project Data").Range(S_Original_location).Value = s_set_value
End If
End Sub
_______________________________________________________________________________
Hallo Christian,
im Prinzip keine große Affäre.
Allerdings braucht es noch ein wenig Strategie.
Mein Vorschlag wäre, dass du ein separates Tabellenblatt anlegst, in dem die erforderlichen Eingaben gemacht werden.
Die Eingabe könnte man auch in einem Userform machen. Das ist etwas Geschmackssache.
Ein Tabellenblatt ist geringfügig einfacher zu handhaben und programmieren - insbesondere für Anfänger.
Die Ergebnisliste könnte man im gleichen Blatt ausgeben oder jeweils auf einem eigenen Tabellenblatt. Da muss du festlegen, was für dich besser passt.
Eine weitere entscheidende Festlegung:
Willst du das Eingabeblatt jeweils als zusätzliches Blatt in den Dateien mit den Berechnungs-Tabellenblättern einfügen oder ist dir eine externe Datei lieber, in der die Datei/Tabellenblatt ausgewählt werden kann in der die Varianten berechnet werden soll. Die externe Variante hat natürlich den Vorteil, dass deine bestehenden Dateien ohne Makros und im Prinzip unverändert bleiben.
Ich muss immer mal wieder Vergleichsrechnungen in großen Tabellen anstellen, in denen sich meist nur 1 Wert ändert. Du schreibst "meist". Wenn es vorkommt, dass mehr als 1 Wert variert werden soll, dann sollte das direkt berüchsichtigt werden. Soll dann auch die 2. Zelle in einer Schleife schrittweise geändert werden? Wie groß ist den die max. Anzahl der zu varierenden Zellen?
Überleg dir mal wie du es gerne hättest.
Gruß
Franz
___________________________________________________________________________________