Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1148to1152
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 verbesserung

Makro verbesserung
Andre
Hi Leute,
Franz hat schon mit sehr viel Elan diesen Code geschrieben. Leider funktioniert er in der Praxis nicht.
Dieser Befehl sucht nach zwei Bedinungen und kopiert die entsprechenden Zeilen in ein anderes Tabellenblatt.
Die Quelle umfasst ca. 50k Zeilen mit 200 Spalten. Die Suchbereich ist in Prozent, obwohl in der Quelle auch Leerzeilen vorkommen.
Hier nun zwei Fragen:
1. Überlauf
Bei einer grösseren Datenmenge kommt nach einer Sekunde ein popup mit "Überlauf"
Kann mir einer sagen, wie ich das Makro abändern kann, damit es auch mit 50k Zeilen klarkommt?
2. Laufzeit
Kann man die Laufzeit noch verkürzen, wenn das Makro mit mehr Zeilen läuft?
Anbei noch mal eine Beispieldatei:
https://www.herber.de/bbs/user/69025.xls
Gruss
Andre

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Makro verbesserung
12.04.2010 15:59:30
Ramses
Hallo
Ändere im Code die Zeile
"... Dim i As Integer.."
in
Dim i As Long
Die Laufzeit lässt sich nicht gross verkürzen, ausser du kaufst dir einen neuen Rechner mit satter Leistung.
Sei doch froh dass du das nun nicht mehr von Hand machen musst.
Gruss Rainer
AW: Makro verbesserung
12.04.2010 16:34:43
Andre
Hi,
habe mal mit Long ausprobiert, bricht zwar nicht gleich ab, aber nach 10 Minuten schiess ich Excel ab, da es einfach zu lange dauert.
jetzt muss ich doch noch mal lange ausholen, damit mein Problem mit dem Makro besser verstanden wird.
In meiner alten Datei habe ich bei jeder Zeile eine Wenn Abfrage Formel mit eine Bezug auf eine Zellen im Homesheet. Dh. es können zwei Beträge eingegeben werden und danach wird im Data sheet ein Ja oder nein berechnet. Auf das ganze Feld wird eine Pivot Tabelle gezogen. Damit kann man eigentlich ganz gut arbeiten.
Leider funktioniert aber die Pivot tabelle nur begrenzt, da ich bereits das Limit bei manchen Feldern erreicht habe, kann sie nicht mehr alles anzeigen.
Deshalb wollte ich die Sache anders angehen und nur die relevanten Daten in ein neues Sheet kopieren und darauf die Pivot laufen lassen, damit die Daten kleiner werden.
Die Leute sollten alles bekommen und danach einfach ihre range eingeben und das Makro sucht die entsprechenden Daten. Aber wenn das Makro 10 Minuten läuft macht es keinen Sinn mehr, da es einfach zu lange dauert.
Deshalb wollte ich fragen, ob das Makro noch optimiert werden kann, oder vielleicht hat jemand eine andere Lösung parat.
Gruss
Andre
Anzeige
AW: Makro verbesserung
12.04.2010 16:02:07
Rudi
Hallo,
dimensioniere mal die Integer-Variablen als Long.
Gruß
Rudi
AW: Makro verbesserung
12.04.2010 16:37:53
Andre
Hi,
habe mal mit Long ausprobiert, bricht zwar nicht gleich ab, aber nach 10 Minuten schiess ich Excel ab, da es einfach zu lange dauert.
jetzt muss ich doch noch mal lange ausholen, damit mein Problem mit dem Makro besser verstanden wird.
In meiner alten Datei habe ich bei jeder Zeile eine Wenn Abfrage Formel mit eine Bezug auf eine Zellen im Homesheet. Dh. es können zwei Beträge eingegeben werden und danach wird im Data sheet ein Ja oder nein berechnet. Auf das ganze Feld wird eine Pivot Tabelle gezogen. Damit kann man eigentlich ganz gut arbeiten.
Leider funktioniert aber die Pivot tabelle nur begrenzt, da ich bereits das Limit bei manchen Feldern erreicht habe, kann sie nicht mehr alles anzeigen.
Deshalb wollte ich die Sache anders angehen und nur die relevanten Daten in ein neues Sheet kopieren und darauf die Pivot laufen lassen, damit die Daten kleiner werden.
Die Leute sollten alles bekommen und danach einfach ihre range eingeben und das Makro sucht die entsprechenden Daten. Aber wenn das Makro 10 Minuten läuft macht es keinen Sinn mehr, da es einfach zu lange dauert.
Deshalb wollte ich fragen, ob das Makro noch optimiert werden kann, oder vielleicht hat jemand eine andere Lösung parat.
Gruss
Andre
Anzeige
AW: Makro verbesserung
12.04.2010 18:08:49
Rudi
Hallo,
ungetestet
Private Sub copy_Act_Sav()
Dim ActSavprozentMin, ActSavprozentMax As Long
Dim i As Long
Dim LZDataRow As Long
Dim Ziel As Worksheet, Quelle As Worksheet
Dim LZData As Range
Dim arrTmp(), n As Long
Application.ScreenUpdating = False
Application.Calculation = xlManual
wb_ziel = ActiveWorkbook.Name
ActSavprozentMin = Workbooks(wb_ziel).Worksheets("Home").Cells(2, 3)
ActSavprozentMax = Workbooks(wb_ziel).Worksheets("Home").Cells(2, 4)
Set Quelle = Workbooks(wb_ziel).Worksheets("Data")
Set Ziel = Workbooks(wb_ziel).Worksheets("test")
i = 1
Do Until Quelle.Cells(i, 1) = ""
If (ActSavprozentMin > Quelle.Cells(i, 4)) _
Or (ActSavprozentMax 

Anzeige
AW: Makro verbesserung
13.04.2010 10:32:05
Andre
Hi Rudi,
ich bin wirklich sprachlos, ich muss zwar noch das Makro auf 200 Spalten erweitern und hoffe, dass es in der Geschwindkeit bleibt, aber jetzt habe ich einen guten Ansatz.
Ich wünsche dir noch einen schönen Tag und hoffe noch mehr von dir zu lernen.
Gruss
Andre
AW: Makro verbesserung
13.04.2010 11:09:55
Andre
Hi Franz und co,
ich habe das Makro mal mit 100 Spalten probiert und ist wieder knapp bei einer Minute.
Kann man dieses Makro oder eine andere Lösung finden oder ist es einfach nicht möglich diese Operation mit
50k Zeilen und 200 Spalten unter einer Minute zu erreichen.
Gruss
Andre
Sub copy_bestimmte_Zellen_kopieren()
Dim ActSavprozentMin, ActSavprozentMax As Long
Dim i As Long
Dim LZDataRow As Long
Dim Ziel As Worksheet, Quelle As Worksheet
Dim LZData As Range
Dim arrTmp(), n As Long
Application.ScreenUpdating = False
Application.Calculation = xlManual
wb_ziel = ActiveWorkbook.Name
ActSavprozentMin = Workbooks(wb_ziel).Worksheets("Home").Cells(2, 3)
ActSavprozentMax = Workbooks(wb_ziel).Worksheets("Home").Cells(2, 4)
Set Quelle = Workbooks(wb_ziel).Worksheets("Data")
Set Ziel = Workbooks(wb_ziel).Worksheets("test")
i = 1
Do Until Quelle.Cells(i, 1) = ""
If (ActSavprozentMin > Quelle.Cells(i, 201)) _
Or (ActSavprozentMax 

Anzeige
AW: Makro verbesserung
13.04.2010 13:11:34
Rudi
Hallo,
du willst immerhin 10.000.000 Zellen untersuchen.
Ohne die permante Redimensionierung dürfte es noch etwas schneller sein.
Sub copy_bestimmte_Zellen_kopieren()
Dim ActSavprozentMin, ActSavprozentMax As Long
Dim i As Long
Dim LZDataRow As Long
Dim Ziel As Worksheet, Quelle As Worksheet
Dim LZData As Range
Dim arrTmp(), n As Long, k As Integer
Const iColumns As Integer = 200
Application.ScreenUpdating = False
Application.Calculation = xlManual
With ActiveWorkbook
ActSavprozentMin = .Worksheets("Home").Cells(2, 3)
ActSavprozentMax = .Worksheets("Home").Cells(2, 4)
Set Quelle = .Worksheets("Data")
Set Ziel = .Worksheets("test")
End With
ReDim arrTmp(1 To iColumns, 1 To Application.CountA(Quelle.Columns(1)))
With Quelle
For i = 1 To .Cells(1, 1).End(xlDown)
Select Case .Cells(i, 201)
Case Is  ActSavprozentMax
n = n + 1
' Datenbereich aus Quelle selektieren und kopieren
For k = 1 To iColumns
arrTmp(k, n) = .Cells(i, k)
Next k
End Select
Next i
End With
ReDim Preserve arrTmp(1 To iColumns, 1 To n)
With Ziel
' Bezug auf erste Spalte Data ab A2 - nächste leere Zelle suchen
LZDataRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If LZDataRow 

Gruß
Rudi
Anzeige
AW: Makro verbesserung
13.04.2010 15:21:46
Andre
Hi Rudi,
nein eigentlich will ich nur einen Wert in einer Spalte pro Zeile untersuchen und danach die komplette Zeile in ein anderes Tabellensheet kopieren.
Leider läuft dein Makro nicht durch. Es kommt der Fehler "Typ unverträglich". Irgendeine Deklaration ist nicht ganz sauber, aber da ich deine code nur zur Hälft verstehe, brauche ich mal wieder deine Hilfe.
Gruss
Andre
Lösung per Filter
13.04.2010 15:45:15
Rudi
Hallo,
Sub copy_bestimmte_Zellen_kopieren()
Dim ActSavProzentMin, ActSavProzentMax As Long
Dim Ziel As Worksheet, Quelle As Worksheet
Dim rZiel As Range
Const iColumns As Integer = 30
Application.ScreenUpdating = False
Application.Calculation = xlManual
With ActiveWorkbook
ActSavProzentMin = .Worksheets("Home").Cells(2, 3)
ActSavProzentMax = .Worksheets("Home").Cells(2, 4)
Set Quelle = .Worksheets("Data")
Set Ziel = .Worksheets("test")
End With
With Ziel
If Application.CountA(.Columns(1)) = 0 Then
Set rZiel = .Cells(1, 1)
Else
Set rZiel = .Cells(Rows.Count, 1).End(xlUp).Offset(1)
End If
End With
With Quelle
.Cells(1, 1).AutoFilter Field:=iColumns + 1, Criteria1:=">" & ActSavProzentMin, _
Operator:=xlAnd, Criteria2:=" 1 Then rZiel.EntireRow.Delete
End With
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub

Gruß
Rudi
Anzeige
AW: Lösung per Filter
13.04.2010 16:27:14
Andre
Hi Rudi,
bei der range hast du angeben, meine Daten gehen bis 202. Aber ab 201 schreibt Excel "400".
Die Geschwindikeit wäre Super. Aber leider kopiert er unvollständig. Bei manchen Zeilen werden nicht alle Spalten kopiert, sonder es fehlen ca. 20 Spalten!
Wie wäre es wenn, wenn man das ganze Blatt kopiert und die negativen Zeilen löscht? Ist eine Löschung schneller?
Gruss
Andre
AW: Lösung per Filter
13.04.2010 16:31:54
Andre
Hi Rudi,
Sorry für den Doppelpost, hatte 30 vergessen.
bei iColumns hast du 30 angeben, meine Daten gehen bis 202. Aber ab 201 schreibt Excel "400".
Die Geschwindikeit wäre Super. Aber leider kopiert er unvollständig. Bei manchen Zeilen werden nicht alle Spalten kopiert, sonder es fehlen ca. 20 Spalten!
Wie wäre es wenn, wenn man das ganze Blatt kopiert und die negativen Zeilen löscht? Ist eine Löschung schneller?
Gruss
Andre
Anzeige
AW: Lösung per Filter
13.04.2010 16:36:55
Rudi
Hallo,
bei der range hast du angeben, meine Daten gehen bis 202

Wo?
Du musst iColumns auf deine Datenspalten anpassen. Unmittelbar dahinter muss die Kriterienspalte sein.
Bei manchen Zeilen werden nicht alle Spalten kopiert

Kann nicht sein. Es wird der komplette sichtbare Bereich kopiert.
Getestet mit 50000 Zeilenx200 Spalten
Gruß
Rudi
AW: Lösung per Filter
13.04.2010 18:36:14
Andre
Hi Rudi,
jetzt habe ich es gefunden, du hast bei der range die colums mit dem Suchkriterium verbunden,
aber die gewünschte Spalte könnte aber auch in der Mitte sein. Deshalb geht die range immer nur
bis zum Suchkriterium. Ich habe für die bestehenden columns eine weitere konstante deklariert.
.Range(.Columns(1), .Columns(iColumnsall)).SpecialCells(xlCellTypeVisible).copy rZiel
Nur so eine Frage, aber im Filter kann ich nur zwei Kriterien haben, oder?
Gruss
Andre
Anzeige
AW: Lösung per Filter
13.04.2010 19:46:59
Rudi
Hallo,
ja, du kannst nur 2 Filterkriterien verwenden. Filtere einfach mehrfach.
Schneller geht's sicher nicht.
Gruß
Rudi
AW: Lösung per Filter
14.04.2010 09:46:39
Andre
Hi Rudi,
erstmal vielen Dank für deine tolle Hilfe. Ich werde jetzt mit diesem Code probieren mein Tool aufzusetzen.
Hoffe das es so klappt, wie ich mir das vorstelle.
Gruss
Andre

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige