Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1188to1192
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Miese Performance bei Makrokombination

Miese Performance bei Makrokombination
Alex
Nabend,
Ich befasse mich momentan mit einem VBA-Projekt, das bis zu 5 Städte, die man für eine Rundroute ansteuern will, in die Reihenfolge bringt, die mit der kürzesten Gesamtstrecke verbunden ist. Dabei arbeite ich vor allem viel mit Laufvariablen, die abgleichen sollen, welche Städte gewählt wurden und die dann die dazugehörigen Strecken mittels Vektorrechnung in Luftlinie errechnen und ausgeben.
Ein weiteres Sub kombiniert dann die Teilstrecken zwischen den Städten zu einer optimalen Gesamtlänge und gibt dann, je nach fall, eine Prioritätenliste aus.
Bis zur Kombination von 5 ausgewählten Städten funktioniert alles super. Dann dauert es zwar etwas, aber es geht. Sobald man allerdings eine fünfte Stadt auswählt, schmiert er zwischendurch ab. Manchmal fängt er sich dann noch, immer öfter aber nicht.
Ich habe schon versucht, in den einzelnen angesteuerten Subs mit End-Befehlen zu arbeiten, um unnötigen Code zu stoppen. Das hat allerdings leider keine Auswirkungen :c
Wenn ich den Code per Esc abbreche, hängt er immer am letzten End If fest:
"For St5 = 7 To 40
If Me.comSt1 = Sheets("Daten").Cells(St1, 2) And Me.comSt2 = Sheets("Daten").Cells(St2, 2) And Me.comSt3 = Sheets("Daten").Cells(St3, 2) And Me.comSt4 = Sheets("Daten").Cells(St4, 2) And Me.comSt5 = Sheets("Daten").Cells(St5, 2) And Me.comSt6 = "-" Then
Rechnung5St
End If"
klar, 5 variablen von 7 bis 40 sind schon ne Menge, ich hatte jedoch gehofft, dass sich das verrechnen lässt.
Für alle, die sich damit auskennen und evtl. den ein oder anderen Tipp für mich parat haben, wie ich das ganze etwas "schlanker" gestalten kann, hier der Code.
Ist relativ Anfängerhaft geschrieben, was aber auch daran liegt, dass ich vor 2 Wochen mit Excel VBA angefangen habe.
Vielen Dank für's Lesen
PS: Wenn ich die Subs als public deklariere und über den Sub/Userform-ausführen Befehl einzeln ansteuere, funktioniert alles in Sekundenschnelle - er scheint also offensichtlich ein Problem mit
a) der Kombination mehrerer Subs
b) den vielen Variablen auf einmal oder
c) dem Routing auf einen Knopf
zu haben.
Ich hoffe, dass jemand von Euch dieses Problem auch schonmal hatte und einen Lösungsvorschlag hat.
Das komplette Programm ist im Anhang.
Die Prioritätenliste ist noch auf der Datenseite und wird noch nicht auf das Eingabeblatt übertragen.
https://www.herber.de/bbs/user/72607.xlsm
Traveling Salesman Problem
06.12.2010 10:38:00
Klaus
Hallo Alex,
diesem Thema (dem "Traveling Salesman Problem") haben sich schon viele angenommen.
Hier gibts eine nette Übersicht über die Problematik inklusive Lösungsansätzen:
http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo40.php
Grüße,
Klaus M.vdT.
AW: Traveling Salesman Problem
06.12.2010 11:08:16
Alex
Hallo Klaus.
Danke zunächst für die schnelle Antwort. Allerdings ist ja meine Frage nicht vom Typ "soll das TSP behandeln - wie mache ich das?".
Ich habe ja bereits einen lauffähigen Code, der nur aus irgendeinem Grunde sehr lange Kompiliert werden muss und dabei häufiger den Löffel abgibt.
Und da ich den Code ja im VBA-Editor problemlos und schnell ausführen kann, scheint ja alles zu laufen.
Nur eben nicht, wenn ich den Sub über den Button ausführe.
Grüße
Alex
Anzeige
AW: Traveling Salesman Problem
06.12.2010 11:38:39
Klaus
Hi Alex,
ich kann deine Datei leider nicht testen, da meine XL-Version zu klein ist. Die Kernfrage - "Makro direkt läuft, über Button läufts nicht" lässt vermuten, dass irgendwo ein Focus genommen wird.
0,1% Chance das es was bringt: Schreib mal "activecell.activate" als erste Zeile des Start-Button. Wenn das hilft, lags am Focus. Wenn nicht .... dann lasse ich mal offen.
Grüße,
Klaus M.vdT.
Und wie sollen wir das beurteilen...
06.12.2010 11:48:14
Renee
können, Alex ?
Ob der Code manuell oder von einem Button aus gestartet wird, ist ziemlich unrelevant.
Relevant wäre es den Code zu sehen! Deine Vermutungen c) ist kaum der Grund. Was du unter a) und b) verstehst, lässt sich nur abschätzen, wenn du uns den Code zeigst!
GreetZ Renée
Anzeige
Sorry, hab den Anhang übersehen :-) (owT)
06.12.2010 11:49:55
Renee

AW: Sorry, hab den Anhang übersehen :-) (owT)
07.12.2010 08:27:53
Alex
ich habe nun noch eine idee, wie man es verschnellern könnte, kenne allerdings den befehls-wortlaut nicht.
er hängt sich massiv im kombinationsteil auf, wo er die comboboxen checken und daraus die richtige rechnung auswählen soll.
quasi die stelle, wo er die 5 variablen "st1,2,3,4,5" verarbeitet, um die comboboxeinträge mit den städtedaten auf der datenseite abzugleichen.
würde man nun einfach den "-" als false und jeden anderen wert als true definieren, könnte man dem programm die variablenrechnerei ersparen, weil dann jeder andere wert als "-" als reelle eingabe erkannt wird, was ja auch so abwegig nicht ist, weil man durch die aktualisierung des restart-buttons nur reelle städte in den comboboxen auswählen kann.
grüße
alex
Anzeige
AW: Sorry, hab den Anhang übersehen :-) (owT)
09.12.2010 07:46:30
fcs
Hallo Alex,
Die geschachelten For-Next-Schleifen kannst du vermeiden, wenn du entsprechenden Kombiboxen auf nicht gleich "-" bzw. ="-" prüfst.
mit Anpassung der folgenden Prozeduren wird es insgesamt ein wenig einfacher/übersichtlicher und wahrscheinlich auch entsprechend schneller.
Gruß
Franz
Private Sub cmdStart_Click()
Dim letzte_Zeile As Double, arrList
' -> Restart-Button
'Leere Hilfsmatrix in Tabelle "Daten" erzeugen
Sheets("Daten").Range("I6:O12").Value = "-"
Sheets("Daten").[I6].Value = ""
Sheets("Daten").Range("J7:O12").Value = "0"
Sheets("Daten").Range("I17:J22").Value = ""
With Worksheets("Daten")
letzte_Zeile = .Range("A65537").End(xlUp).Offset(1, 0).Row
txtSumme.Text = .Cells(letzte_Zeile - 1, 1)
End With
Me.txtXCoord = ""
Me.txtYCoord = ""
Me.txtStadt = ""
'Vorbereitung der Comboboxen
With Sheets("Daten")
arrList = WorksheetFunction.Transpose(.Range(.Cells(6, 2), _
.Cells(.Rows.Count, 2).End(xlUp)))
End With
Me.comSt1 = "-"
comSt1.List = arrList
Me.comSt2 = "-"
comSt2.List = arrList
Me.comSt3 = "-"
comSt3.List = arrList
Me.comSt4 = "-"
comSt4.List = arrList
Me.comSt5 = "-"
comSt5.List = arrList
Me.comSt6 = "-"
comSt6.List = arrList
arrList = ""
End Sub
Public Sub cmdRechnen_Click()
'Deklarationsteil
Dim X1 As Double, X2 As Double, Y1 As Double, Y2 As Double
Dim Stadt1$, Stadt2$
Dim Spalte As Long, Zeile As Long
'Beschriftung der Matrix
With Sheets("Daten")
.[I7] = Me.comSt1 'Für comSt1
.[J6] = Me.comSt1
.[I8] = Me.comSt2 'Für comSt2
.[K6] = Me.comSt2
.[I9] = Me.comSt3 'Für comSt3
.[L6] = Me.comSt3
.[I10] = Me.comSt4 'Für comSt4
.[M6] = Me.comSt4
.[I11] = Me.comSt5 'Für comSt5
.[N6] = Me.comSt5
.[I12] = Me.comSt6 'Für comSt6
.[O6] = Me.comSt6
For Spalte = 10 To 15
Stadt1 = .Cells(6, Spalte)
If Stadt1 = "-" Then
Else
X1 = .Columns(2).Find(what:=Stadt1, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 2)
Y1 = .Columns(2).Find(what:=Stadt1, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 3)
End If
For Zeile = 7 To 12
Stadt2 = .Cells(Zeile, 9)
If Stadt2 = "-" Or Stadt1 = "-" Then
.Cells(Zeile, Spalte) = 0
Else
X2 = .Columns(2).Find(what:=Stadt2, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 2)
Y2 = .Columns(2).Find(what:=Stadt2, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 3)
.Cells(Zeile, Spalte) = Sqr(((X1 - X2) ^ 2) + ((Y1 - Y2) ^ 2))
End If
Next Zeile
Next Spalte
End With
Kombi
End Sub
Public Function Kombi()
'Fall, in dem alle Comboboxen nicht zugewiesen sind.
'Abhängigkeit von der Box-Auswahl
If Me.comSt1 = "-" And Me.comSt2 = "-" And Me.comSt3 = "-" _
And Me.comSt4 = "-" And Me.comSt5 = "-" And Me.comSt6 = "-" Then
MsgBox "Bitte Städte auswählen!", vbInformation
'Fall, in dem nur eine Combobox zugewiesen ist
'Abhängigkeit von der Box-Auswahl
ElseIf Me.comSt1  "-" And Me.comSt2 = "-" And Me.comSt3 = "-" _
And Me.comSt4 = "-" And Me.comSt5 = "-" And Me.comSt6 = "-" Then
MsgBox "Eine Entfernung zwischen einer Stadt? Fauler Handlungsreisender!", _
vbInformation
'Fall für 2 Comboboxen
'Abhängigkeit von der Box-Auswahl
ElseIf Me.comSt1  "-" And Me.comSt2  "-" _
And Me.comSt3 = "-" And Me.comSt4 = "-" And Me.comSt5 = "-" _
And Me.comSt6 = "-" Then
Rechnung2St
'Fall für 3 Comboboxen
'Abhängigkeit von der Box-Auswahl
ElseIf Me.comSt1  "-" And Me.comSt2  "-" _
And Me.comSt3  "-" And Me.comSt4 = "-" And Me.comSt5 = "-" _
And Me.comSt6 = "-" Then
Rechnung3St
'Fall für 4 Comboboxen
'Abhängigkeit von der Box-Auswahl
ElseIf Me.comSt1  "-" And Me.comSt2  "-" _
And Me.comSt3  "-" And Me.comSt4  "-" _
And Me.comSt5 = "-" And Me.comSt6 = "-" Then
Rechnung4St
'Fall für 5 CB
ElseIf Me.comSt1  "-" And Me.comSt2  "-" _
And Me.comSt3  "-" And Me.comSt4  "-" _
And Me.comSt5  "-" And Me.comSt6 = "-" Then
Rechnung5St
ElseIf Me.comSt1  "-" And Me.comSt2  "-" And Me.comSt3  "-" _
And Me.comSt4  "-" And Me.comSt5  "-" And Me.comSt6  "-" Then
'     Rechnung6St
End If
End Function

Anzeige
AW: Sorry, hab den Anhang übersehen :-) (owT)
12.12.2010 11:27:03
alex
Hallo Franz,
vielen Dank für Deine Hilfe, es funktioniert nun alles so, wie es soll und das auch in einem Bruchteil der vorigen Rechenzeit.
Grüße
Alex

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige