Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1448to1452
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

Optimierung Code

Optimierung Code
25.09.2015 22:50:35
D
Hallo zusammen,
habe einen "Code" (so würde ich es ehrlich gesagt nicht nennen) geschrieben der ca. 50000 Zeilen durchforstet.
Positiv: Er funktioniert!
Negativ: Ich kann in der Zeit während er läuft 3-4 Kaffee trinken gehen *heul* Evtl. liegt es ja daran dass er kein Delta Handling kann...
Lösung:
1. Evtl. weiß einer von euch wie ich den Code so umschreiben kann, dass er schneller funktioniert.
2. Ich habe den Code derzeit an einen Button gehängt. Es wäre jedoch super wenn man ihn ausführen könnte beim speichern der Originaldatei
3. Dazu sollte die Kopie auf dem Server jedoch schreibgeschützt sein....und natürlich beim verändern nicht gespeichert werden. Wäre auch super wenn die Originaldatei nicht geschlossen werden würde ;-(
Schonmal thxthxthxthxthxth im Voraus!!
Bin mal gespannt wer den schnellsten Code programmiert ;-)
So sieht der Code derzeit aus.
Sub beim_speichern()
x = 7
Do While Cells(x, 7).Value  ""
Cells(x, 6).Value = Cells(x, 3).Value + Cells(x, 4).Value + Cells(x, 5).Value
Cells(x, 14) = Replace(Cells(x, 15).Value, " ", "", , 5)
Cells(x, 12) = Right(Cells(x, 14).Text, Len(Cells(x, 14).Text) - 1) + Cells(x, 17)
x = x + 1
Loop
ActiveWorkbook.SaveAs Filename:="\\server\ Test.xls"
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Optimierung Code
26.09.2015 00:09:01
Alfons
Hallo,
was steht denn bei dir in den Zellen?
Das braucht bei mir rund 20 Sekunden:
Sub beim_speichern()
Dim x As Long
Dim oldCalc As XlCalculation
Dim datStart As Date
datStart = Now
oldCalc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
x = 7
Do While Cells(x, 7).Value  ""
Cells(x, 6).Value = Cells(x, 3).Value + Cells(x, 4).Value + Cells(x, 5).Value
Cells(x, 14) = Replace(Cells(x, 15).Value, " ", "", , 5)
Cells(x, 12) = Right(Cells(x, 14).Text, Len(Cells(x, 14).Text) - 1) + Cells(x, 17)
x = x + 1
Loop
Application.ScreenUpdating = True
Application.Calculation = oldCalc
'ActiveWorkbook.SaveAs Filename:="\\server\ Test.xls"
MsgBox Format(Now - datStart, "hh:mm:ss"), , ""
End Sub
Gruß
Alfons
http://vba1.de
-------------------------------------------------------------------

Anzeige
AW: Optimierung Code
26.09.2015 00:10:55
Peter
Hallo D,
beim deinem Code gibt es nicht viel zu verbessern - vielleicht folgende Details...
Ich glaube, was am meisten beschleunigt ist '.ScreenUpdating=false', ggf. noch .Calculation = xlManual!
(Tipp: Variablen IMMER deklarieren. Variablen niemals mit nur einem Buchstaben benennen - die kann man bei einer Fehlersuche nie finden, weil die Einzelbuchstaben auch in verschiedenen Wörtern vorkommen ... Besser noch benennen nach den RVBA Naming Conventions - bei Long also lngXX - siehe http://www.xoc.net/standards/rvbanc.asp]
Option Explicit 'Erzwingt Variablendeklaration
Sub beim_speichern()
Dim lngXX As Long
With Application
.ScreenUpdating = False
.Calculation = xlManual
End With
lngXX = 7
Do While Len(Cells(lngXX , 7)) > 0
Cells(lngXX, 6) = Cells(lngXX, 3) + Cells(lngXX, 4) + Cells(lngXX, 5)
Cells(lngXX, 14) = Replace(Cells(lngXX, 15).Value, " ", "", , 5)
Cells(lngXX, 12) = Val(Mid$(Cells(lngXX, 14), 2)) + Cells(lngXX, 17)
lngXX = lngXX + 1
Loop
With Application
.Calculation = xlAutomatic
.Calculate
.ScreenUpdating = True
End With
ActiveWorkbook.SaveAs Filename:="\\server\ Test.xls"
End Sub
Was du da beim Speichern machen willst, habe ich nicht kapiert.
Wenn du etwas automatisch beim Abspeichern ausführen willst, musst du das als
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub

in 'Diese Arbeitsmappe' stellen.
Greetz, Peter

Anzeige
AW: Optimierung Code
26.09.2015 01:31:34
D
Hi,
funktioniert nun super! Ist nun um einiges schneller mit Screenupdate! Vielen Dank euch 2.
Bei eurem Code hat er mir jedoch immer Typen unverträglich angezeigt und nach der 20. Zeile abgebrochen. Woran könnte das liegen?
Bzgl. dem Speichern habe ich es schon mit der vorgeschlagenen Methode versucht. Es passiert jedoch nichts. Hab einfach den Code eingehängt aber da tut sich nichts.
Noch eine Frage hätte ich. Kann man die erstellte Datei irgendwie schreibschützen?

AW: Optimierung Code
26.09.2015 20:13:50
D
Hi,
habe nun herausgefunden wo der Fehler "Typen unverträglich" herkommt.
Typen unverträglich liegt an der Codestelle:
+ Cells(lngXX, 17)
Die Zellen in spalte 17 sind nicht immer gefüllt. Der Code bricht dann ab wenn in Spalte 17 das erste mal ein Wert steht.

Anzeige
AW: Optimierung Code
26.09.2015 20:20:05
D
1. ermittele die letzte Zeile x mit der Bedingung "gefüllt" in Spalte N mittels Cells(7, 14).End(xlDown).Row
2. schreibe in die Bereiche F7:Fx, N7:Nx und L7:Lx die drei Formeln.
3. Union(F7:Fx, N7:Nx, L7:Lx).Value = Union(F7:Fx, N7:Nx, L7:Lx).Value
Bahnhof ;-) Da muss ich wohl noch etwas büffeln. Wie ich gefüllt programmatisch darstellen kann habe ich versucht jedoch vergeblich.
Dim i As gefuellt
gefuellt = Cells(7, 14).End(xlDown).Row 0
2. und 3. hab ich ehrlich gesagt nicht verstanden!
Kannst du das etwas näher erläutern?

AW: Optimierung Code
26.09.2015 21:04:14
Daniel
HI
was steht denn in der Zelle drin ?
"+" steht hier für das Addtionszeichen.
Weil der Wert vor dem Plus eine Zahl ist (VAL) versucht VBA die beiden Zahlen zusammenzuaddieren und erzeugt einen Fehlerabbruch, wenn der zweite Wert ein Text ist, welcher auch nicht in eine Zahl gewandelt werden kann.
wenn du Addieren willst, könnstest mit Worksheetfunction.Sum arbeiten, weil die Summenfunktion Textwerte ignoriert:
Cells(lngXX, 12) = Worksheetfunction.Sum(Val(Mid$(Cells(lngXX, 14), 2)), Cells(lngXX, 17))
möchstest du jedoch zwei Texte zusammenfügen, solltest du nicht das "+" verwenden, sondern das "&", denn dann wird immer zusammengefügt, auch wenn die Werte Zahlen sind.
Cells(lngXX, 12) = Val(Mid$(Cells(lngXX, 14), 2)) & Cells(lngXX, 17)
Gruss Daniel

Anzeige
AW: Optimierung Code
27.09.2015 07:59:20
D
Funktioniert super! Vielen Dank! Da stand ein Z vor der Zahl.
Jetzt hab ich nur noch ein, für euch wahrscheinlich kleines, Problem.
In der Spalte t stehen in jeder Zelle 1-n Sprachen (z.B. deutsch, englisch, ..)die durch Komma getrennt sind. Im Tabellenblatt "Vorgaben" in Spalte A ab Zelle 3 stehen die Sprachen und in Spalte B die zugehörigen Kürzel (z.B. A3 deutsch B3 de_De). Wie kann ich in die Schleife noch einfügen, dass er während er die Zeilen durcharbeitet gleich die Begriffe austauscht?

Warum per Schleife?
26.09.2015 09:14:15
RPP63
Hallo!
Warum klapperst Du die Zellen per Schleife ab?
Du hast 150.000 Zellzugriffe, dies ist so ziemlich das langsamste was man mit VBA machen kann.
Ich würde so vorgehen:
1. ermittele die letzte Zeile x mit der Bedingung "gefüllt" in Spalte N mittels Cells(7, 14).End(xlDown).Row
2. schreibe in die Bereiche F7:Fx, N7:Nx und L7:Lx die drei Formeln.
3. Union(F7:Fx, N7:Nx, L7:Lx).Value = Union(F7:Fx, N7:Nx, L7:Lx).Value
Dürfte auch ohne ScreenUpdating = False deutlich unter einer Sekunde dauern.
Gruß Ralf
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige