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

Dateigröße steigend nach Ausführung Makro

Dateigröße steigend nach Ausführung Makro
29.07.2016 10:35:15
Michael
Guten Tag,
ich habe eine Excel-Datei mit etwa 500 kB angelegt. Es handelt sich um eine Tabelle mit vielen Spezifikationen zu einem Fahrzeug. Ausgehend davon werden mehrere Pivot-Tabellen auf zwei Arbeitsblätter erstellt. Diese enthalten die gleichen Informationen und dienen lediglich für eine andere, etwas benutzerfreundlichere Darstellung als Matrix.
Um den Schreibaufwand zu erleichtern, habe ich eine Aktualisierung per Makro programmiert. Es werden Zeilen hinzugefügt, wenn Daten der Ursprungstabelle hinzugefügt werden, werden die Pivot-Tabellen aktualisiert und anschließend werden leere Zeilen gelöscht. Zusätzlich werden darauffolgend Formatierungen vorgenommen.
Nun zum eigentlichen Problem:
Ohne wirklich Daten in der Ursprungstabelle hinzuzufügen, das heißt es wird nur der Button zum Ausführen des Makros gedrückt, steigt die Dateigröße immens an (nach nur wenigen Durchläufen auf bis zu 3 MB; pro Klick etwa exponentiell um 20-30 kB). Außerdem dauert die Ausführung des Makros relativ lange (knapp 10 Sekunden).
Woran kann es liegen, dass die Dateigröße ansteigt, obwohl keine neuen Daten hinzugefügt werden?
Gibt es einen internen Cache, den man leeren kann?
Gibt es die Möglichkeit die Daten in eine neue Datei zu überführen (nicht die Copy&Paste-Variante von Speichern unter)?
Im Grunde soll die Dateigröße verhältnismäßig konstant bleiben und nicht auf mehrere MB anwachsen.
Ich selbst habe wenig Erfahrung mit VBA Makro Programmierung und habe mir das meiste selbst beigebracht bzw. als Informationen gesammelt.
Tipps in Richtung Prüfung des verwendeten Datenbereichs, Löschen von Leerzeilen, Exportieren und Entfernen/Importieren von Makros und Überprüfen der Zellen auf Formatierungen habe ich bereits getestet. Dabei hat sich die Dateigröße nur geringfügig reduziert.
Hier das programmierte Makro:

Sub Test()
Dim last     As Long 'letzte Zeile
Dim i        As Long 'Zeile
Dim k        As Long
Dim lastcell  As Long
'Variablendeklarationen
last = Range("B1000").End(xlUp).Row
'letzte belegte Zelle
i = 19
k = 19
'Anzahl Zeilen in Ursprungstabelle
'Unruhiger Bildschirm
Application.ScreenUpdating = False
'Löschen Schattentabelle
Sheets("Pivot Schattentabelle").Select
Columns("C:D").Delete
Sheets("Pivot Tabelle").Select
Range("E19:XFD1000").Delete
Cells.FormatConditions.Delete
'Zellen einfügen! Wichtig: letzte beschriebene Zelle muss neu ermittelt werden!
Do Until i = last
'Code wiederholt ausführen bis i größer als last ist
If Cells(i, 3).Value  "" Then
'Code ausführen wenn Zelle einen Wert hat
i = i + 1
'Zeile um 1 erhöhen
last = Range("B1000").End(xlUp).Row
Else
'Wenn Bedingung nicht erfüllt ist, dann ...
Range(Rows(i + 1), Rows(i + 10)).Insert Shift:=xlDown
'unter der Zelle 10 Zeilen einfügen
i = i + 11
'Zeile um 11 erhöhen um Endlosschleife zu vermeiden
last = Range("B1000").End(xlUp).Row
End If
Loop
'SchattenPivot
Call SchattenPivotHinzufügen
'Aktualisieren der Pivot-Matrix
Dim wS As Worksheet
Dim pt As PivotTable
For Each wS In ActiveWorkbook.Worksheets
For Each pt In wS.PivotTables
pt.RefreshTable
Next pt
Next wS
'SchattenPivot
Call SchattenPivotZellenLöschen
'SchattenPivot
Call SchattenPivotXeinfügen
Sheets("Pivot Tabelle").Select
'Dynamisches Löschen von leeren Zellen
For a = ActiveSheet.Cells(2000, 2).End(xlUp).Row To 19 Step -1
If ActiveSheet.Cells(a, 2).Value = "" And ActiveSheet.Cells(a - 1, 2).Value = "" Then
Rows(a).Delete Shift:=xlUp
End If
Next a
'Spaltenbreite von A, B, C, D
Columns("A:A").Select
Selection.ColumnWidth = 0
Columns("B:B").Select
Selection.ColumnWidth = 35
Columns("C:C").Select
Selection.ColumnWidth = 35
Columns("D:D").Select
Selection.ColumnWidth = 21
'Text im Kopf immer linksbündig
'noch dynamisch machen, wenn rdyn dazukommt !!
'lastcell = Cells(17, 256).End(xlToLeft).Select
Range("D4", "GJ17").Select
With Selection
.HorizontalAlignment = xlLeft
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'X in Pivot-Matrix einfügen
Call PivotXeinfügen
'Formatierung der Ansicht
Call Formatierung
'Sprung in B1
Range("B1").Select
'Zwischenspeicher löschen
ClearClipboard = True
'Unruhiger Bildschirm
Application.ScreenUpdating = True
End Sub
Sub SchattenPivotHinzufügen()
Sheets("Pivot Schattentabelle").Select
Dim lastrow     As Long
Dim x        As Long
Dim y        As Long
'letzte belegte Zelle
lastrow = Range("B1000").End(xlUp).Row
'Startzeile
x = 3
y = 3
'Zellen einfügen
Do Until x = lastrow
'Code wiederholt ausführen bis i größer als last ist
If Cells(x, 2).Value  "" Then
'Code ausführen wenn Zelle einen Wert hat
x = x + 1
'Zeile um 1 erhöhen
lastrow = Range("B1000").End(xlUp).Row
Else
'Wenn Bedingung nicht erfüllt ist, dann ...
Range(Rows(x + 1), Rows(x + 10)).Insert Shift:=xlDown
'unter der Zelle 15 Zeilen einfügen
x = x + 11
lastrow = Range("B1000").End(xlUp).Row
End If
Loop
End Sub
Sub SchattenPivotXeinfügen()
Sheets("Pivot Schattentabelle").Select
Dim spalte As Long
Dim zeile As Long
Dim last As Long
spalte = 3
zeile = 3
last = Range("B1000").End(xlUp).Row
Do Until zeile = last + 1
If Cells(zeile, 1).Value  "" Then
Cells(zeile, spalte).FormulaR1C1 = "=RC[-2]&RC[-1]"
zeile = zeile + 1
last = Range("B1000").End(xlUp).Row
Else
zeile = zeile + 1
last = Range("B1000").End(xlUp).Row
End If
Loop
End Sub
Sub SchattenPivotZellenLöschen()
Sheets("Pivot Schattentabelle").Select
Dim last     As Long
last = Range("B1000").End(xlUp).Row
'Dynamisches Löschen von leeren Zellen --> eine muss übrig bleiben
Dim lngSpalteSchatten As Long
'** Spalte, die auf Leerzeichen geprüft werden soll
lngSpalteSchatten = 1
For b = ActiveSheet.Cells(1000, lngSpalteSchatten).End(xlUp).Row To 3 Step -1
If ActiveSheet.Cells(b, 1).Value = "" And ActiveSheet.Cells(b - 1, 2).Value = "" Then
Rows(b).Delete Shift:=xlUp
End If
Next b
End Sub
Sub PivotXeinfügen()
Dim lastrow As Long
Dim lastcolumn As Long
Dim spalte As Long
Dim zeile As Long
Sheets("Pivot Tabelle").Select
lastrow = Range("B1000").End(xlUp).Row
lastcolumn = Cells(17, 256).End(xlToLeft).Column
For spalte = 5 To lastcolumn Step 1
For zeile = 19 To lastrow Step 1
Cells(zeile, spalte).FormulaR1C1 = "=IF(ISNA(VLOOKUP(R18C&RC2,'Pivot  _
Schattentabelle'!R3C3:R500C3,2,FALSE)),"""",""l"")"
Next
Next
End Sub
Sub Formatierung()
Dim firstcellmatrix As Long
Dim lastcellmatrix As Long
Dim lastrow As Long
lastrow = Range("B2500").End(xlUp).Row
lastcellmatrix = Cells(lastrow, 256).End(xlToLeft).Select
Range(Selection, "E19").Select
With Selection.Font
.Name = "Wingdings"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$B19="""""
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Borders(xlLeft).LineStyle = xlNone
Selection.FormatConditions(1).Borders(xlRight).LineStyle = xlNone
Selection.FormatConditions(1).Borders(xlBottom).LineStyle = xlNone
With Selection.FormatConditions(1).Borders(xlTop)
.LineStyle = xlContinuous
.TintAndShade = 0
.Weight = xlThin
End With
Selection.FormatConditions(1).StopIfTrue = False
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=FINDEN(""S"";$B19)=1"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
Selection.FormatConditions(1).Borders(xlLeft).LineStyle = xlNone
Selection.FormatConditions(1).Borders(xlRight).LineStyle = xlNone
Selection.FormatConditions(1).Borders(xlTop).LineStyle = xlNone
With Selection.FormatConditions(1).Borders(xlBottom)
.LineStyle = xlContinuous
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark2
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
End Sub

Die zugehörige Excel-Datei kann ich aus Geheimhaltungsgründen nicht beifügen.
Ich hoffe Ihr könnt mir dabei weiterhelfen!
Vielen Dank!

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateigröße steigend nach Ausführung Makro
30.07.2016 04:11:07
fcs
Hallo Michael,
ich tippe mal, dass durch die vielen Einfüge-, Lösch- und Formatierungs-Aktionen der benutzte Zellbereich immer weiter vergrößert.
Auch Zellformatierungen erhöhen die Größe einer Datei. Insbesondere dann, wenn sehr viele Zellen/Zellbereiche individuell formatiert werden.
Prüfe mal mit folgendem Makro den verwendeten Zellbereich:
Sub Tabelle_UsedRangeAdresse()
'Zeigt für das aktive Tabellenblatt den benutzten Zellbereich an
If ActiveSheet.Type = xlWorksheet Then
MsgBox "Bereich UsedRange: " & ActiveSheet.UsedRange.Address(ReferenceStyle:=xlA1), _
vbInformation + vbOKOny, ActiveWorkbook.Name & " - " & ActiveSheet.Name
End If
End Sub

Zellbereiche in denen nur Formen, Shapes, Bilder etc. plaziert sind werden dbaei ggf. nicht berücksichtigt. Zellen mit Formatierungen -aber ohne Daten- sind aber schon in diesem Bereich.
Sollte der angezeigte Bereich in deinen Blättern größer sein als der mit Daten belegte Bereich, dann musst du hier mal aufräumen und bei allen Spalten rechts von den eigentlichen Alles löschen, oder die Spalten löschen, ebenso bei allen Zeilen unterhalb der eigenlichen Daten.
Diese Prüfung/Aktion musst du in allen Tabellenblättern machen.
Danach die Datei speichern, schließen und wieder öffnen und prüfen, ob sich die Datei wieder verkleinert hat.
Ein weiterer Faktor für Speicherbedarf können die Pivot-Tabellenberichte sein.
Hier ggf. die Option "Quelldaten mit Datei speichern" deaktivieren und die Option "Aktualisieren beim Öffnen der Datei" aktivieren.
An welchen Positionen du jetzt deine Makros anpassen musst, um das Anwachsen der dateigröße zu verhindern/minimieren, kann bei der vielzahl an Code-Zeilen nicht ohne weiteres sagen.
Evtl. tut es ein Aufräum-Makro, das die letzte Zeile/Spalte mit Daten ermittelt und die letzte benutzte Zeile/Spalte und dann ggf. überzählige Zeilen/Spalten löscht. Diese Makro muss dann für alle Problemlätter ausgeführt werden. Nachfolgenden ein beispiel für ein entsprechendes Makro.
Gruß
Franz
'Beispiele für Aufruf des CleanUp-Makros
Sub BlaetterBereinigen()
Application.ScreenUpdating = False
Call CleanUp_Sheet(wks:=ActiveSheet, _
SpalteCheck:=0, _
ZeileCheck:=0, _
lngLookIn:=xlValues + 1)
Call CleanUp_Sheet(wks:=Worksheets("Tabelle1"), _
lngLookIn:=xlFormulas)
Application.ScreenUpdating = True
End Sub
Sub CleanUp_Sheet(wks As Worksheet, _
Optional ByVal SpalteCheck As Long = 0, _
Optional ByVal ZeileCheck As Long = 0, _
Optional ByVal lngLookIn = -4123, _
Optional ByVal optEinblenden As Boolean = True)
Dim ZeileData As Long, ZeileUsed As Long
Dim SpalteData As Long, SpalteUsed As Long
Dim Zelle As Range
Dim objList As ListObject
Dim strMsgText As String, strMsgTitle As String
'Makro löscht im Tabellenblatt Zeilen/Spalten im benutzten Bereich, die außerhalb des _
Bereichs mit den eigentlichen Daten liegen
'Makro blendet vor Löschaktion alle Zeilen und Spalten ein und setzt Filter zurück!
'wks = Worksheet/Tabellenblatt in dem überflüssige Zellbereiche gelöscht werden sollen
'SpalteCheck wenn = 0 dann wird die letzte Daten-Zeile in allen Spalten gesucht _
wenn >0, dann wird die letzte Daten-Zeile in dieser Spalte gesucht
'ZeileCheck wenn = 0 dann wird die letzte Daten-Spalte in allen Zeilen gesucht _
wenn >0, dann wird die letzte Daten-Spalte in dieser Spalte gesucht
'lngLookIn wenn = xlValues bzw. -4163 , dann werden Formeln mit Ergbnis "" ggf. gelöscht _
wenn = xlFormulas bzw. -4123, dann werden Formeln mit Ergbnis "" nicht gelöscht
strMsgTitle = "Makro ""CleanUp_Sheet"" - Prüfung Parameter"
If SpalteCheck  ZeileData Then
.Range(.Rows(ZeileData + 1), .Rows(ZeileUsed)).Delete
End If
If SpalteUsed > SpalteData Then
.Range(.Columns(SpalteData + 1), .Columns(SpalteUsed)).Delete
End If
End With 'wks
End Sub

Anzeige
AW:Hinweise waren auch für mich wertvoll, ...
30.07.2016 09:33:59
MB12
da ich an einer Datei mit vielen Pivots etwas ähnliches beobachtet habe.
Danke schön, Franz
Gruß, Margarete

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige