Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
632to636
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
632to636
632to636
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Optimieren

Optimieren
08.07.2005 17:15:09
Ramon
Tach zusammen,
ich bin blutiger Anfänger, dennoch sehr stolz auf meine ersten Programmiererfolge...leider jedoch läuft mein programm (s.u.) tierisch langsam, da ich fuerchte da aufgrund meiner bescheidenen Kenntnisse das ganze wenig optimiert ist und ich ausser dem For..to..next-Befehl noch keine anderen Schleifen anzuweden weiss-was bei 3 ineinander verschachtelten Schleifen vielleicht schon zum Chaos fuehrt?!?...bei dem Progrämmchen handelt es sich um ein Vergleich einer Einlesezeile (über die Spalten 3-9) (im Sheet "Pf_steel") mit den ca 12000 Zeilen einer Tabelle (Sheet("Pf_IC-IF")). Wenn gefunden dann spuckt er am Ende von einem weiteren sheet("Pf_IC-IF") eine bestimmte Zielwerte aus. Liegt die gefundene Zeile am Ende der Tabelle, also im Bereich von Zeile 10000 oder so, dann rechnet sich das Programm nen Wolf und ich flipp aus...wie gesagt, es funktioniert zwar aber viel zu langsam...
Waere nett wenn mir jemand beim vereinfachen der Programmierzeilen weiterhelfen koennte...Vielen Dank schon mal im Vorraus,
Ramon
P.S.:Hier mein Super-Programm:

Sub Zulangsam()
Datensatzgroesse = Cells(12172, 1)
For j = 1 To 5
Sheets("Input").Cells(16, 10) = j
Dim Var(3 To 9) As Variant
For x = 1 To 8
If Sheets("Input").Cells(8, 10) < Sheets("Pf_Steel").Cells(47 + x * 9, 3) Then Exit For
For i = 3 To 9
Var(i) = Sheets("Pf_Steel").Cells(46 + x * 9, i)      'Einlesezeile
Next i
For Suchzeile = 5 To 5 + Datensatzgroesse - 1
gefunden = True
For i = 3 To 9
If Cells(Suchzeile, i) <> Var(i) Then gefunden = False
Next i
If gefunden Then Ausgabezelle = Sheets("Pf_IC-IF").Cells(Suchzeile, 6)
Sheets("Uso").Cells(5, 12 * j - (9 - x)) = Ausgabezelle
If gefunden Then Suchzeile = Suchzeile + Datensatzgroesse
Next Suchzeile
Next x
Next j
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Optimieren
08.07.2005 21:52:09
ransi
hallo ramon
das sind eine ganze menge berechnungen.
Der "umbau" beschränkt sich im groben nur aufs aufräumen deines codes.
Bringt zwar keine geschwindigkeit, liest sich aber besser.
versuchs mal so:
Option Explicit

Sub Zulangsam()
Dim Var(3 To 9) As Variant
Dim j As Byte
Dim x As Byte
Dim gefunden As Boolean
Dim datensatzgroesse
Dim suchzeile As Long
Dim ausgabezelle
Call turbo_ein
datensatzgroesse = Cells(12172, 1)
For j = 1 To 5
Sheets("Input").Cells(16, 10) = j
For x = 1 To 8
If Sheets("Input").Cells(8, 10) < Sheets("Pf_Steel").Cells(47 + x * 9, 3) Then Exit For
For i = 3 To 9
Var(i) = Sheets("Pf_Steel").Cells(46 + x * 9, i)
Next i
For suchzeile = 5 To 5 + datensatzgroesse - 1
gefunden = True
For i = 3 To 9
If Cells(suchzeile, i) <> Var(i) Then gefunden = False
Next i
If gefunden Then ausgabezelle = Sheets("Pf_IC-IF").Cells(suchzeile, 6)
Sheets("Uso").Cells(5, 12 * j - (9 - x)) = ausgabezelle
If gefunden Then suchzeile = suchzeile + datensatzgroesse
Next suchzeile
Next x
Next j
Call turbo_aus
End Sub

Public

Sub turbo_ein()
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = False
.EnableEvents = False
End With
End Sub

Public

Sub turbo_aus()
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub

ein bisschen was wirds bringen..
ransi
Anzeige
AW: Optimieren
08.07.2005 22:38:13
MichaV
Hallo
Ransi hat ja schon Vorarbeit geleistet. Ich hab mal versucht, den Code zu verstehen, bin aber nicht ganz dahintergestiegen, zumal ich es nicht testen kann (will ;o))
Aber das hier sollte das gleiche Ergebnis bringen:

Sub EtwasSchneller()
Dim j As Integer
Dim i As Integer
Dim x As Integer
Dim Var 'oder auch Var()
Datensatzgroesse = Cells(12172, 1) 'ein fester Wert
For j = 1 To 5
Sheets("Input").Cells(16, 10) = j 'diese Zelle wird 5 mal beschrieben, macht das Sinn?
For x = 1 To 8
If Sheets("Input").Cells(8, 10) < Sheets("Pf_Steel").Cells(47 + x * 9, 3) Then Exit For
Var = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Range(Sheets("Pf_Steel").Cells(46 + x * 9, 3), Sheets("Pf_Steel").Cells(46 + x * 9, 9)))), "#")
'Var enthält "Wert3#Wert4#Wert5#Wert6#Wert7#Wert8#Wert9"
'Ersetze # ggf. durch ein Zeichen, was auf keinen Fall in Deinen Daten vorkommt
For suchzeile = 5 To 5 + Datensatzgroesse - 1
If Var = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Range(Cells(suchzeile, 3), Cells(suchzeile, 9)))), "#") Then
'Wenn "Wert3#Wert4#Wert5#Wert6#Wert7#Wert8#Wert9"="Wert3#Wert4#Wert5#Wert6#Wert7#Wert8#Wert9"
Sheets("Uso").Cells(5, 12 * j - (9 - x)) = Sheets("Pf_IC-IF").Cells(suchzeile, 6)
Exit For
End If
Next suchzeile
Next x
Next j
End Sub

Vielleicht noch ein bischen schneller, wenn Du ransis Sachen einbaust.
Gruß- Micha
Anzeige
AW: Optimieren
11.07.2005 11:30:36
Ramon
Hi Micha, hi Ransi,
ersema vielen Dank fuer die Muehe...der "Turbo-Lader" vom Ransi läuft, wenn es, wie er ja selber meinte auch nicht wirklich viel bringt...bei der Anwendung von Michas Programm läuft irgendwas schief...das Programm wird nicht ausgeführt und statt dessen blendet zeigt die Msg-Box (wo kommt die auf einmal her?) den Wert 400 an, der mit meinem sheet soviel zu tun hat wie Brot mit Senf...die Programmierzeilen von deinem Makro hab ich nachvollzogen, und es erscheint mir in meinem Sinne, das heisst, du hast sehr wohl durchblickt was ich will...wäre sehr nett wenn du noch mal drüberschauen kannst, vielleicht fällt dir ja noch was auf...ich koennte auch die excel-Datei hochladen wenn dir das weiterhilft...
Vielen Dank nochmal das ihr euch die Zeit genommen habt...Ramón
Anzeige
AW: Optimieren
11.07.2005 20:52:35
MichaV
Hi Ramon,
also wo die MsgBox herkommt, weiß ich auch nicht. Lad mal die Datei hoch, ist besser als diese Ferndiagnose.
Gruß- Micha
AW: Optimieren
12.07.2005 10:45:55
Ramon
Hi Micha,
ich habe die excel-datei mal gepackt und hochgeladen (https://www.herber.de/bbs/user/24645.zip), musste sie aber dennoch etwas kürzen zwecks der maximalen 300kb...deswegen ist die datensatzgroesse jetzt nur noch 5692 statt der vorherigen 12000...die for..next-j Schleife ist somit automatisch auf j=2 gekürtzt, was die Laufzeit natuerlich erheblich verkuerzt, jedoch nicht der eigentliche Sinn der Sache ist...vielleicht blickst du durch mein chaos ja durch...echt der Hammer das du dich der Sache annimmst...vielen Dank und Gruss, Ramon
Anzeige
AW: Optimieren
12.07.2005 10:46:13
Ramon
Hi Micha,
ich habe die excel-datei mal gepackt und hochgeladen (https://www.herber.de/bbs/user/24645.zip), musste sie aber dennoch etwas kürzen zwecks der maximalen 300kb...deswegen ist die datensatzgroesse jetzt nur noch 5692 statt der vorherigen 12000...die for..next-j Schleife ist somit automatisch auf j=2 gekürtzt, was die Laufzeit natuerlich erheblich verkuerzt, jedoch nicht der eigentliche Sinn der Sache ist...vielleicht blickst du durch mein chaos ja durch...echt der Hammer das du dich der Sache annimmst...vielen Dank und Gruss, Ramon
Anzeige
AW: Optimieren
12.07.2005 10:46:33
Ramon
Hi Micha,
ich habe die excel-datei mal gepackt und hochgeladen (https://www.herber.de/bbs/user/24645.zip), musste sie aber dennoch etwas kürzen zwecks der maximalen 300kb...deswegen ist die datensatzgroesse jetzt nur noch 5692 statt der vorherigen 12000...die for..next-j Schleife ist somit automatisch auf j=2 gekürtzt, was die Laufzeit natuerlich erheblich verkuerzt, jedoch nicht der eigentliche Sinn der Sache ist...vielleicht blickst du durch mein chaos ja durch...echt der Hammer das du dich der Sache annimmst...vielen Dank und Gruss, Ramon
Anzeige
AW: Optimieren
14.07.2005 16:51:32
MichaV
Hi Ramon,
tut mir leid, daß Du so lange warten musstest.
Ändere mal diese eine Zeile folgendermaßen:
Var = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Sheets("Pf_Steel").Range(Sheets("Pf_Steel").Cells(46 + x * 9, 3), Sheets("Pf_Steel").Cells(46 + x * 9, 9)))), "#")
Dann funzt das Makro und ich denke, es kommt auch das raus, was Du haben willst.
Gruß- Micha
PS: Wenn Du mit dem Email- Link in den Threat gehst können wir ihn weiterführen, obwohl er schon im Archiv steckt.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige