Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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!
Anzeige

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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Dateigröße in Excel nach Ausführung eines Makros reduzieren


Schritt-für-Schritt-Anleitung

  1. Überprüfung des benutzten Zellbereichs: Verwende folgendes Makro, um den benutzten Bereich in deinem Arbeitsblatt zu überprüfen. Es zeigt dir, ob dein Arbeitsblatt mehr Zellen verwendet, als tatsächlich Daten enthält:

    Sub Tabelle_UsedRangeAdresse()
        If ActiveSheet.Type = xlWorksheet Then
            MsgBox "Bereich UsedRange: " & ActiveSheet.UsedRange.Address(ReferenceStyle:=xlA1), _
            vbInformation + vbOKOnly, ActiveWorkbook.Name & " - " & ActiveSheet.Name
        End If
    End Sub
  2. Bereinigung überflüssiger Zellen: Lösche alle leeren Zeilen und Spalten, die über den tatsächlichen Datenbereich hinausgehen. Dies kannst du mit folgendem Makro durchführen:

    Sub BlaetterBereinigen()
        Application.ScreenUpdating = False
        Call CleanUp_Sheet(wks:=ActiveSheet, _
                            SpalteCheck:=0, _
                            ZeileCheck:=0, _
                            lngLookIn:=xlValues + 1)
        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)
        'Hier folgt der Code zur Bereinigung
    End Sub
  3. Speichern und Überprüfen: Speichere die Datei, schließe sie und öffne sie erneut. Überprüfe, ob die Dateigröße reduziert wurde.


Häufige Fehler und Lösungen

  • Dateigröße steigt trotz fehlender Daten: Dies kann an überflüssigen Zellformatierungen und dem benutzten Zellbereich liegen. Stelle sicher, dass du alle überflüssigen Zeilen und Spalten gelöscht hast.

  • Langsame Makro-Ausführung: Wenn dein Makro lange läuft, kann dies an ineffizienten Schleifen oder unnötigen Formatierungen innerhalb des Makros liegen. Überprüfe deinen Code und optimiere ihn.

  • Pivot-Tabellen: Wenn du viele Pivot-Tabellen verwendest, stelle sicher, dass die Option "Quelldaten mit Datei speichern" deaktiviert ist. Dies kann helfen, die Excel-Dateigröße zu verkleinern.


Alternative Methoden

  • Daten in eine neue Datei übertragen: Statt die Copy & Paste-Variante zu nutzen, kannst du die Daten in eine neue Datei exportieren. Verwende dazu das „Speichern unter“-Menü und wähle ein neues Format (z.B. .xlsx).

  • Verwendung von Makros: Du kannst ein Makro erstellen, das regelmäßig überflüssige Zellen und Formatierungen entfernt, um die Excel-Dateigröße konstant zu halten.


Praktische Beispiele

  • Beispiel zur Bereinigung: Hier ist ein einfaches Makro, das alle leeren Zellen in einem bestimmten Bereich löscht:

    Sub Leere_Zellen_Loeschen()
        Dim Bereich As Range
        Set Bereich = ActiveSheet.Range("A1:A100") 'Anpassen nach Bedarf
        Bereich.SpecialCells(xlCellTypeBlanks).Delete
    End Sub
  • Pivot-Tabelle optimieren: Wenn du eine Pivot-Tabelle verwendest, kannst du die Datenquelle so einstellen, dass sie nicht mit der Datei gespeichert wird. Dies spart Platz.


Tipps für Profis

  • Verwende Formatierungen sparsam. Zu viele individuelle Formatierungen können die Excel-Dateigröße erheblich erhöhen.

  • Überprüfe regelmäßig den benutzten Bereich deiner Blätter. Verwende das Makro aus der Schritt-für-Schritt-Anleitung, um sicherzustellen, dass du nicht mehr Zellen verwendest, als notwendig.

  • Automatisiere die Bereinigung deiner Arbeitsblätter durch Makros, um die Dokumentengröße zu verkleinern und die Leistung zu verbessern.


FAQ: Häufige Fragen

1. Was ist ein Makro in Excel? Ein Makro in Excel ist eine Reihe von Anweisungen, die automatisierte Aufgaben ausführen, um wiederholte Arbeiten zu erleichtern.

2. Wie kann ich die Excel-Dateigröße reduzieren? Du kannst die Excel-Dateigröße reduzieren, indem du leere Zeilen und Spalten löschst, überflüssige Zellformatierungen entfernst und sicherstellst, dass deine Pivot-Tabellen nicht unnötige Daten speichern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige