VBA Zielwertsuche optmieren
#1
Question 
Hallo Zusammen,

ich habe bereits einen fuktionierenden Code, möchte das ganze aber etwas breiter einsetzen und brauche da hilfe.

Ziel:

Den bestehenden VBA Code so anpassen, dass ich diese Variablen hier

Const iMaxIterations = 800
Const strStartRng = "BI8"
Const strGoalRng = "BM8"
Const strChngRng = "AT8"

über eine UserForm definieren bzw. vorgebe und dann auf Start klicke und das ding legt los.


Richtig cool wäre es, wenn man auch noch sagen könnte via Checkbox oder so, ignoriere bis zu 10 leere Zeilen, danach zeige Fehler "Leere Zeile" oder das man die Anzahl der zu ignorierenden leeren Zeilen auch noch definieren kann.

Vielleicht kann mir ja jemand helfen, das wäre super. Danke.


Angehängte Dateien
.xlsm   Beispiel.xlsm (Größe: 15,46 KB / Downloads: 3)
Antworten Top
#2
Hallöchen,

dann könntest Du ein UF erstellen z.B. mit einem Commandbuttton, 3 Textboxen und einem Spinbutton.


1)

In Deinem Modul definierst Du die 4 Variablen über dem ersten Makro , also dann so

Public iMaxIterations As Integer '(oder Long)
Public strStartRng As String
Public strGoalRng As String
Public strChngRng As String

Im Userform weist Du dann den Variablen die Inhalte (Text, Value) zu und kannst im bestehenden Makro damit arbeiten.
Das Makro führst Du mittels eines cmd-Button auf dem UF aus. Im Makro des Buttons schließt Du das UF mit Unload Me

2)

Du verzichtest auf die Variablen und greifst im Makro auf die Elemente des UF zu. Dazu beendest Du das UF nicht mit Unload Me, sondern mit Me.Hide
Dadurch bleibt das UF im Hintergrund aktiv und Du kannst im Makro auf die Objekte des UF im Prinzip mit UserForm1.Objektname.ObjektInhalt zugreifen, z.B. UserForm1.TextBox1.Text.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
Hallo,

ja das war mein Plan, leider bekomme ich die verknüpfung irgendwie nicht hin. Deswegen hatte ich die Excel inkl. UF und VBA bereits vorbereitet und mit hochgeladen, in der Hoffnung das mir jemand helfen kann bzw. das so baselt..ich habe es mehrfach versucht und bekomme es leider nicht hin.

Grüße
Luk
Antworten Top
#4
Hallöchen,

ein direkter Bezug könnte dann so aussehen (ungetestet).

im UF:

Code:
Private Sub CommandButton1_Click()
Me.Hide
Zielwert
End Sub

Man könnte die Boxen im UF noch mit den ursprünglich programmierten Werten vorbelegen. Man könnte die Angaben auch noch prüfen, z.B. das alles in der gleichen Zeile ist wenn das so sein soll oder nur bestimmte Spalten oder ein bestimmter Bereich zur Auswahl stehen soll. Es gibt übrigens auch noch eine RefEdit - Box, die die Auswahl von Zellen auf dem Blatt ermöglicht.
Ebenso sollte man die Anzahl Durchläufe prüfen, schnell hat man mal eine Null mehr drin ...

im Modul- Dein bisheriger Code ist nur auskommentiert, meine Zuweisungen passen hoffentlich Smile

Code:
Public Sub Zielwert()
'----------------------Versuch 2 Fitz--------------------------------'

'Const iMaxIterations = 800 'Anzahl der zu durchlaufenden Iterationen
'Const strStartRng = "BI8" 'erster Zellbezug, ab welcher gearbeitet wird Formel mit Runden hinterlegt
'Const strGoalRng = "BM8" 'erster Zellbezug des Goal-Wertes Fixe Zahl hinterlegt
'Const strChngRng = "AT8" 'erster Zellbezug des ChangingCell-Wertes DB-Wert


'VARIABLES
'------------------------------------------------------'
Dim i As Integer
Dim rStartCell As Range
Dim rGoalCell As Range
Dim rChngCell As Range


'DEFINIERE RANGES
'------------------------------------------------------'
'Set rStartCell = Range(strStartRng)
'Set rGoalCell = Range(strGoalRng)
'Set rChngCell = Range(strChngRng)

Set rStartCell = Range(Zielwertsuche.Zielzelle.Text)
Set rGoalCell = Range(Zielwertsuche.Zielwert.Text)
Set rChngCell = Range(Zielwertsuche.Veränderbare_Zelle.Text)
iMaxIterations = Val(Zielwertsuche.Anzahl_Durchläufe.Text) 'Wandlung des Textes in eine Zahl

'SCHLEIFE
'------------------------------------------------------'
For i = 1 To iMaxIterations
        'teste auf Abbruchbedingung VOR Ausführung des Codes
        If rStartCell.Offset(i - 1, 0).Value = "" Then Exit For
        'Starte GoalSeeker
        rStartCell.Offset(i - 1, 0).GoalSeek Goal:=rGoalCell.Offset(i - 1, 0), ChangingCell:=rChngCell.Offset(i - 1, 0)
Next i
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste