Anzeige
Archiv - Navigation
1544to1548
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
Code schneller machen
09.03.2017 09:46:51
Volker
Guten Morgen zusammen.
bin neu hier und brauch eure Hilfe.
Ich muss große Datenmengen aus einer Datei in eine andere Kopieren.
Verwende diesen Code, der auch funktioniert, aber bei großen Mengen eben ziemlich langsam ist.
Gibt es irgendeine Möglichkeit dies zu beschleunigen?
Danke für eure Hilfe.
Volker
Sub SLSCockpit_Schaltfläche1_Klicken()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Worksheets("SLS Cockpit").Range("A33:CP50000").Clear
Worksheets("SLS Cockpit").Range("CQ34:CY50000").ClearContents
Dim WBZiel As Workbook, ExportDatei As Variant, WBQuelle As Workbook, WSZiel As Worksheet
Set WBZiel = ThisWorkbook
ExportDatei = Application.GetOpenFilename("\\brose.net\users\KOP\homet\ttkrebs\UserDir\ _
Desktop\Tabelle von Basis (1).xlsx", "Bitte die Datei zum Kopieren öffnen ...")
ExportDatei = CStr(ExportDatei)
If ExportDatei = "Falsch" Then Exit Sub
Set WBQuelle = Workbooks.Open("\\brose.net\users\KOP\homet\ttkrebs\UserDir\Desktop\Tabelle  _
von Basis (1).xlsx")
With WBQuelle
.Sheets("Tabelle1").Range("A2:CP50000").Copy WBZiel.Sheets("SLS Cockpit").Range("A33: _
CP50000")
.Close savechanges:=False
End With
WBZiel.Sheets("SLS Cockpit").Activate
Dim z As Long
Dim s As Long, lPruefSpalte As Long
lPruefSpalte = 1
With ActiveSheet
For z = .UsedRange.Row To .UsedRange.Row + .UsedRange.Rows.Count - 1
If z > .UsedRange.Row + 1 And Trim(CStr(.Cells(z, lPruefSpalte).Value))  ""  _
Then
For s = .UsedRange.Column To .UsedRange.Column + .UsedRange.Columns.Count - 1
If .Cells(z - 1, s).HasFormula = True And .Cells(z, s).HasFormula = False  _
_
Then
.Cells(z, s).FormulaR1C1 = .Cells(z - 1, s).FormulaR1C1
End If
Next s
End If
Next z
End With
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
pc.Refresh
Next
Application.ScreenUpdating = True
Application.Calculation = LoBerechnung
Call Calculate
MsgBox "Import successful!"
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: zuerst: Analyse
09.03.2017 11:18:27
Fennek
Hallo,
eine Prüfung, welche Teile des Codes wie lange benötigen, wäre m.E. ein guter Anfang.
Beim Lesen bin ich an dieser Zeile hängengeblieben, funktioniert das wirklich?

With WBQuelle
.Sheets("Tabelle1").Range("A2:CP50000").Copy WBZiel.Sheets("SLS Cockpit").Range("A33: _
CP50000")
Die Ranges sind verschieden groß. Normalerweise wird als Ziel nur die obere linke Ecke angegeben.
mfg
AW: zuerst: Analyse
09.03.2017 11:51:02
Volker
Hallo Fennek,
ja, funktioniert wirklich. :)
Ich hab jetzt schonmal die Zeile etwas angepasst, sodass er nur bis zur ersten freien Zeile sucht.
With WBQuelle
.Sheets("Tabelle1").Range("A2:CP2").End(xlUp).Offset(1, 0).Copy WBZiel.Sheets("SLS Cockpit").Range("A33:CP33").End(xlUp).Offset(1, 0)
Dauert aber leider trotzdem noch zu lange (Meines Erachtens das Einfügen in die neue Datei).
Bezüglich dem Kopieren:
Ich kann nicht von A1 aus kopieren, da es mir beim Einfügen die Filterfunktion in der neuen Datei zerstören würde. Diese brauch ich aber für die integrierte Pivottabelle.
Anbei eine Ansicht zur besseren Veranschaulichung:
Userbild
VG
Volker
Anzeige
AW: zuerst: Analyse
09.03.2017 13:55:43
Michael
Hi,
wie Fenneck bereits schrieb: die linke, obere Ecke reicht; die Konstruktion
WBZiel.Sheets("SLS Cockpit").Range("A33:CP33").End(xlUp).Offset(1, 0)

ist fragwürdig, denn Du "suchst" von A33 aus nach oben, das könnte sonst wohin kopieren, denn
Userbild
.End(xlUp) durchsucht offensichtlich nur die linkeste Spalte des angegebenen Bereichs.
Wie wäre es, wenn Du die Höhe der gefundenen Daten zuerst Mal ermittelst und in eine Variable steckst:
With WBQuelle
.maxZ = .Sheets("Tabelle1").Range("A" & .rows.count).End(xlUp).row
.Sheets("Tabelle1").Range("A3:CP" & maxz).Copy WBZiel.Sheets("SLS Cockpit").Range("A34") _

Warum mit Offset? Einfach ab A3 kopieren...
Weitere Optimierung:
If Z > .UsedRange.Row + 1 And Trim(CStr(.Cells(Z, lPruefSpalte).Value))  "" Then

ist überflüssig und kostet nur Zeit, beginne die Schleife zwei Zeilen tiefer, also:
For z = .UsedRange.Row + 2 To
Garniere Deinen Code mit Zeitmessung, hier eingefügt in Deinen geposteten Code (ohne die genannten Änderungensmöglichkeiten):
Sub SLSCockpit_Schaltfläche1_Klicken()
Dim t0 As Single, t1 As Single, t2 As Single
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Worksheets("SLS Cockpit").Range("A33:CP50000").Clear
Worksheets("SLS Cockpit").Range("CQ34:CY50000").ClearContents
Dim WBZiel As Workbook, ExportDatei As Variant, WBQuelle As Workbook, WSZiel As Worksheet
Set WBZiel = ThisWorkbook
ExportDatei = Application.GetOpenFilename("\\brose.net\users\KOP\homet\ttkrebs\UserDir\ _
Desktop\Tabelle von Basis (1).xlsx", "Bitte die Datei zum Kopieren öffnen ...")
ExportDatei = CStr(ExportDatei)
If ExportDatei = "Falsch" Then Exit Sub
Set WBQuelle = Workbooks.Open("\\brose.net\users\KOP\homet\ttkrebs\UserDir\Desktop\Tabelle  _
_
von Basis (1).xlsx")
t0 = Timer
With WBQuelle
.Sheets("Tabelle1").Range("A2:CP50000").Copy WBZiel.Sheets("SLS Cockpit").Range("A33: _
CP50000")
.Close savechanges:=False
End With
t1 = Timer
WBZiel.Sheets("SLS Cockpit").Activate
Dim z As Long
Dim s As Long, lPruefSpalte As Long
lPruefSpalte = 1
With ActiveSheet
For z = .UsedRange.Row To .UsedRange.Row + .UsedRange.Rows.Count - 1
If z > .UsedRange.Row + 1 And Trim(CStr(.Cells(z, lPruefSpalte).Value))  "" _
Then
For s = .UsedRange.Column To .UsedRange.Column + .UsedRange.Columns.Count -  _
1
If .Cells(z - 1, s).HasFormula = True And .Cells(z, s).HasFormula =  _
False _
_
Then
.Cells(z, s).FormulaR1C1 = .Cells(z - 1, s).FormulaR1C1
End If
Next s
End If
Next z
End With
t2 = Timer
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
pc.Refresh
Next
Application.ScreenUpdating = True
Application.Calculation = LoBerechnung
Call Calculate
MsgBox (Timer - t2) * 1000 & " / " & (t2 - t1) * 1000 & " / " & (t1 - t0) * 1000
MsgBox "Import successful!"
End Sub

Schöne Grüße,
Michael
Anzeige
Nachtrag
09.03.2017 14:11:25
Michael
vergessen: der Ausdruck
Trim(CStr(.Cells(Z, lPruefSpalte).Value)) ""
läßt sich auch vereinfachen:
Trim(.Cells(Z, lPruefSpalte).Text) ""
Es wäre interessant zu wissen, was denn in den Zellen mit .hasformula=false drinsteht: leer? Werte?
Je nach dem könnte man nämlich eine Schleife á la
Sub Makro1()
Dim c As Range
For Each c In ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks)
MsgBox "leere Zelle gefunden; Adresse: " & c.Address(0, 0)
Next
End Sub
verwenden.
Gruß,
M.
AW: Nachtrag
09.03.2017 14:51:57
Volker
Hi Michael
Das ist unterschiedlich.
Es geht darum.
gehen wir davon aus, dass 100 Zeilen ab Zeile 33 in den Spalten A bis CY befüllt sind.
Nun importiere ich neue Daten. Diese bestehen nur aus Daten von der Spalte A bis CP.
Diese Daten füllen aber nur 50 Zeilen.
Jetzt sind aber in den Spalten CQ bis CY zu viel Daten vorhanden, die nicht benötigt werden und zu falschen Zählergebnissen führen.
Jetzt werden mit diesem Code die 50 überflüssigen Zeilen gelöscht. (Orientierung an der letzten befüllten Zeile in CP)
Sollten allerdings 200 Zeilen nach dem Import von A bis CP befüllt sein, werden die Zeilen von CQ bis CY mit den Formeln der letzten befüllten Zeile von CQ bis CY, befüllt.
Der Bereich CQ bis CY gleicht sich also immer an den Bereich A bis CP an. (Anzahl Zeilen)
Hoffe du verstehst was ich meine.
Bin noch nicht wirklich fit mit VBA.
VG
Volker
PS: das mit dem "Trim" funktioniert. Allderings ist die Veränderung marginal.
Anzeige
ohne Beispieldatei schwer nachvollziehbar
09.03.2017 15:31:52
Michael
Hi,
mach doch mal bitte eine Datei mit zwei Blättern mit Daten und hebe die unterschiedlichen Fälle farblich hervor, damit wir uns was Konkretes vorstellen können.
Mir ist das zu schwammig: welche Daten sind auf welchem Blatt an welcher Position?
Eigentlich reichen ein paar Zeilen und Spalten zum Verständnis, aber wenn Du Dir Deiner VBA-Kenntnisse nicht so sicher bist, ist die "echte" Struktur vorteilhafter für Dich zum Anpassen.
Gruß,
M.
P.S.: und die Zeitmessung?!

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige