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

Makro - Excel 2003 / 2000

Makro - Excel 2003 / 2000
wafi
Hallo Excelfreunde
Kann sich dieses Makro mal jemand ansehen?
Aus 31 Tabellen werden Daten in eine Auswertungstabelle gelesen.
Am Monatsende sind das ca. 3000 Datensätze und der Vorgang dauert ca. eine Stunde.
Die Rechenleistung des Pc´s ist bestimmt nicht daran schuld, (3 GB CPU, 2 GB Ram )
Installiert ist Office 2003
Vor ein paar Tagen wollte ich die Abrechnug nochmal durchlaufen lassen und um nicht meinen
Hauptrechner eine Stunde zu blockieren, habe ich es auf meinem Zweitrechner gestartet.
Der hat ebenso die selbe Rechenleistung, nur ist dort noch ein Office 2000 installiert.
Zu meiner großen Überraschung dauerte es dort nichtmal 1 Minute und die Abrechnung war fertig.
Kann mir nur vorstellen, dass dieses Makro mit Excel 2003 nicht klar kommt, Fehlermeldung gibt´s keine.
Danke
Gruß wafi

Public Sub KennzeichenAuslesen()
Dim intY As Integer, intA As Integer, intB As Integer
Dim arrKennzeichen As Variant
Worksheets("Daten").Range("A7:A100").ClearContents
Worksheets("Daten").Range("J7:M5230").ClearContents
intB = 6 'Zeilenbeginn wo geschrieben
For intY = 1 To 31
For intA = 7 To 172 'lesen von bis
If Worksheets(intY).Range("E" & intA) = "" Then intA = 172 ' Abbruch wenn Zelle leer
If Worksheets(intY).Range("E" & intA) > "" Then ' von wo ausgelesen wird
intB = intB + 1
Worksheets("Daten").Range("J" & intB) = UCase(Worksheets(intY).Range("E" & intA)) '  _
_
Kennz
Worksheets("Daten").Range("K" & intB) = Worksheets(intY).Range("M" & intA) 'MAX
Worksheets("Daten").Range("L" & intB) = Worksheets(intY).Range("R" & intA) 'IST
Worksheets("Daten").Range("M" & intB) = Worksheets(intY).Range("N" & intA) 'FIX
End If
Next intA
Next intY
arrKennzeichen = Sortierte_Unikate(Range("J7:J5230"))
Worksheets("Daten").Range("A6").Resize(UBound(arrKennzeichen)) = arrKennzeichen
Range("B8").Select 'Cursor setzen
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Code zu Function Sortierte_Unikate(rngBereich)
08.12.2011 22:23:46
NoNet
Hallo wafi,
Diesen Code habe ich nicht getestet, aber er sollte grundsätzlich ziemlich schnell durchlaufen.
Allerdings : das ist ja nur der "halbe Code" : Es wird die Function Sortierte_Unikate(...) aufgerufen, deren Code Du leider nicht gepostet hast.... Evtl. steckt der Wurm ja darin ?!?
Gruß, NoNet
AW: Code zu Function Sortierte_Unikate(rngBereich)
09.12.2011 12:00:39
wafi
Hallo NoNet
Danke das du dich meinem Problem annimmst.
Ich glaube nicht, dass es an dem Code Sortiere_Unikate liegt.
Sortiert wird erst nachdem alle Daten ausgelesen sind.
Das auslesen braucht ewig lange (Excel 2003), sortiert wird in Sekundenschnelle.
Habe auch schon das Sortiere_Unikate Makro weggelassen, trotzdem dauert der Auslesevorgang ewig.
Danke
Gruß wafi
Anzeige
TIPP : Berechnung temporär deaktivieren
09.12.2011 12:51:10
NoNet
Hallo Wafi,
ich kann das nun mit einer selbst erstellten TEST-Datei nachbilden :
In den 31 Sheets stehen in den Bereichen E7:R172 je die Funktion =ZUFALLSBEREICH(10;100)
Das ergibt insgesamt 31 Sheets * 14 Spalten (E:R) * 166 Zeilen = 72.044 Zellen
Diese 72000 Zellen werden bei jedem Durchlauf der Schleifen neu berechnet, da in das Blatt "Daten" ein Wert eingetragen wird (Excel 2010 berechnet bei automatischer Berechnung bei jeder Zelländerung immer die gesamte Mappe !)
Dein Makro ändert im Blatt "Daten" bis zu 20584 Zellen (Schleife 31 * Schleife 166 * 4 Zellen (J, K, L, M)) und berechnet daher bei jeder Zelländerung die gesamte Mappe - in meinem Fall also bei 20584 Änderungen im Blatt "Daten" alle 72000 o.g. Zellen -
das ergibt 20584 *72044 = 1.482.953.696 (also: fast 1,5 Milliarden !) einzelne Berechnungen - und das dauert natürlich selbst auf schnellen PCs sehr lange (auf meinem PC für das o.g. Beispiel ca.11 Min.) !
Mögliche Lösung : speichere den aktuellen Berechnungsmodus im Code und schalte die Berechnung auf "manuell" :
dim intCalcStatus as Integer
intCalcStatus=Application.Calculation
Application.Calculation = xlCalculationManual
Damit dauerte der Durchauf auf meinem PC nur noch 8 Sekunden !
Und am Ende des Codes den zuvor gespeicherten Status wieder zurücksetzen :
Application.Calculation=intCalcStatus
Gruß, NoNet
Anzeige
AW: TIPP : Berechnung temporär deaktivieren
09.12.2011 14:15:39
wafi
Hallo NoNet
Vielen Dank für deine Hilfe und die Mühe dir du dir wegen mir gemacht hast.
Ich kann es zwar mit meinen bescheidenen VBA Kenntnissen nicht wirklich nachvollziehen,
aber es funktioniert super.
In sagenhaften 8 Sekunden ist alles fertig.
Nochmals vielen Dank
Gruß wafi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige