Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
812to816
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
812to816
812to816
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Speicherplatz-/Grafikproblem bei VBA-Prozedur

Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 15:35:36
Ralf Junglas
Hallo Forum-Leute,
für einen Kunden musste ich u. a. folgenden Ablauf mit Excel VBA programmieren:
1. es wird eine DIF-Datei in Excel geöffnet (ca. 4000 Zeilen),
2. die Zeilen der Datei werden in einer Do-Loop-Schleife abgearbeitet,
3. die Daten in den Zeilen werden in einer benutzerdefinierten Variablen abgelegt
und dann in einer Excelmappe in unterschiedliche Blätter geschrieben.
4. in der Statuszeile wird eine %-Angabe zum Fortschritt der Schleife angezeigt,
die Bildschirmanzeige aber mit Application.ScreenUpdating = False unterdrückt.
Das Problem:
der Ablauf wird immer langsamer und irgendwann gibt es auch Probleme bei der
Bildschirmdarstellung und irgendwann kommt eine Meldung, dass Excel nicht mehr
genügend Speicher zur Verfügung hat und der Vorgang bricht dann auch ab.
Die Importdatei ist knappe 1MB groß, die Zielmappe ca. 1,7MB und es sind
während der Laufzeit ca. 600MB freier Arbeitsspeicher frei.
Grafische Elemente gibt es in der Zielmappe nicht.
Weiß jemand, mit welchen Maßnahmen man das oben beschriebene Phänomen in den
Griff bekommen könnte ?
Vielen Dank für jede Antwort.
Gruß
Ralf Junglas

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

Betreff
Datum
Anwender
Anzeige
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 15:43:32
ramses
Hallo
Ohne Code ist das ein Ratespiel :-=
Zurücksetzen von Object Variablen ist sicher ein Hauptpunkt
Set myObject = .....
Code
Set myObject = Nothing
Leeren der Zwischenablage, falls verwendet.
Korrekte Deklaration der Variablen.
Aber so ganz ohne Code,... wie gesagt etwas schwierig :-)
Gruss Rainer
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 15:52:39
Ralf Junglas
Hallo Rainer,
hier der entscheidende Code-Teil. Die Variablen sind alle vorher ausdrücklich und mit
Typ deklariert, die Objekt-Variablen werden am Ende alle auf Nothing gesetzt:
' Import-Datei (TBSTAT.dif) aktivieren
wbImport_Daten.Activate
' ***** Sortieren nach: **********************************************
' 1. Gebiet
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
' Anzahl Zeilen ohne Überschrift
intZeilen = Application.WorksheetFunction.CountA(Worksheets(1).Range("$A:$A")) - 1
anzDS = 1 ' Zähler für Statuszeile
anzDS_Blatt = 0 ' Zähler für Einzelblatt
strGebiet_alt = ""
' ***** Schleife über alle Datensätze der DIF-Datei ******************
Do While Cells(anzDS + 1, 1) <> ""
' Gebiet = Mitarbeiter-Nr.
ds.intGebiet = Cells(anzDS + 1, SPA_Gebiet + 1)
If ds.intGebiet <> strGebiet_alt Then
anzDS_Blatt = 1 ' Zähler für Einzelblatt zurücksetzen
strGebiet_alt = ds.intGebiet
Else
anzDS_Blatt = anzDS_Blatt + 1
End If
ds.lngKdNr = Cells(anzDS + 1, SPA_Kundennr + 1)
ds.strStatus = Cells(anzDS + 1, SPA_Status + 1)
ds.strName = Cells(anzDS + 1, SPA_Name + 1)
ds.lngUmsatzVJ = Cells(anzDS + 1, SPA_UmsatzVJ + 1)
ds.lngUmsatzLfdJ = Cells(anzDS + 1, SPA_UmsatzLfdJ + 1)
ds.bytKlasse = Cells(anzDS + 1, SPA_Klasse + 1)
ds.bytPortfolio = Cells(anzDS + 1, SPA_Portfolio + 1)
ds.bytBesuchsvorgabe = Cells(anzDS + 1, SPA_Besuchsvorgabe + 1)
For aktion = 1 To bytAnzAktionen
ds.curAktion(aktion) = Cells(anzDS + 1, SPA_Aktion1 + aktion)
Next aktion
' ***** Übertragen der Daten in AD-Tabelle ******************
' Testweise Aktivieren des Gebietsblattes
wbTagesbericht.Worksheets(CStr(ds.intGebiet)).Activate
' Blatt existiert nicht: Schleife weiter
If Err = 9 Then
Err.Clear
GoTo weiterDs
End If
' merken des jeweiligen Blattnamens (gemäß Gebiet)
Set wsAD = wbTagesbericht.Worksheets(CStr(ds.intGebiet))
wsAD.Cells(anzDS_Blatt + 2, SPA_Kundennr) = ds.lngKdNr
wsAD.Cells(anzDS_Blatt + 2, SPA_Status) = ds.strStatus
wsAD.Cells(anzDS_Blatt + 2, SPA_Name) = ds.strName
wsAD.Cells(anzDS_Blatt + 2, SPA_Gebiet) = ds.intGebiet
wsAD.Cells(anzDS_Blatt + 2, SPA_UmsatzVJ) = ds.lngUmsatzVJ
wsAD.Cells(anzDS_Blatt + 2, SPA_UmsatzLfdJ) = ds.lngUmsatzLfdJ
wsAD.Cells(anzDS_Blatt + 2, SPA_Klasse) = ds.bytKlasse
wsAD.Cells(anzDS_Blatt + 2, SPA_Portfolio) = ds.bytPortfolio
wsAD.Cells(anzDS_Blatt + 2, SPA_Besuchsvorgabe) = ds.bytBesuchsvorgabe
For aktion = 1 To bytAnzAktionen
wsAD.Cells(anzDS_Blatt + 2, SPA_Aktion1 + aktion - 1) = ds.curAktion(aktion)
Next aktion
Application.StatusBar = "Bitte etwas Geduld. " & anzDS & " (" & Format(anzDS / intZeilen, "0%") & _
") Datensätze wurden importiert..."
weiterDs:
wbImport_Daten.Activate
anzDS = anzDS + 1
' ***** Ende der Schleife über alle Datensätze der DIF-Datei **************************
Loop
Vielen Dank und Gruß
Ralf
Anzeige
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 17:22:23
ramses
Hallo
Der Code ist ein wenig eigenartig :-)
Wieso ist die Fehlerbehandlung eigentlich global ausgeschaltet ?
Warum
For aktion = 1 To bytAnzAktionen
ds.curAktion(aktion) = Cells(anzDS + 1, SPA_Aktion1 + aktion)
Next aktion
Wo ist der Sinn der Schleife ?`"anzDs" ist gegeben und wird nicht verändert!? Willst "bytAnzAktionen" mal den Wert in "Cells(anzDS + 1, SPA_Aktion1 + aktion)" schreiben ?
Und hier das gleiche nochmal
For aktion = 1 To bytAnzAktionen
wsAD.Cells(anzDS_Blatt + 2, SPA_Aktion1 + aktion - 1) = ds.curAktion(aktion)
Next aktion
Der Sinn ist nicht klar. Der Wert in der Zielzelle "wsAD.Cells(anzDS_Blatt + 2, SPA_Aktion1 + aktion - 1)" wird einfach "bytAnzAktionen" mal überschrieben.
Schau mal welchen Wert "bytAnzAktionen" beim Eintritt in deine Schleife hat
Am Ende der Schleife "Set wsAD = Nothing"
Ich würde keine "Do-Loop"-Schleife verwenden. Kostet nur unnötig Zeit.
Verwende eine "For i = 1 to X" Schleife, denn die Anzahl der Datensätze hast du ja.
Das ist auf die Schnelle mal alles was ich daraus sehe.
Gruss Rainer
Anzeige
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 17:35:59
Ralf Junglas
Hallo Reiner,
- die Fehlerbehandlung habe ich vorher auf "On Error Resume Next" gesetzt, um
Laufzeitfehler gezielt abzufangen,
- die Variable anzDS wird vor dem Loop-Befehl hochgezählt,
- die Variable bytAnzAktionen wird weiter vorne in der Prozedur bestimmt,
- wsAD wird später auf Nothing gesetzt.
Ob eine For-Next-Schleife statt einer Do-Loop-Schleife mein Problem behebt, wage
ich zu bezweifeln, aber ich probiere es aus.
Vielen Dank und Gruß
Ralf
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
22.10.2006 19:53:23
ramses
Hallo
noch ein paar kurze Kommentare, da ich nicht den ganzen Code deiner Prozedur kenne:
"...die Fehlerbehandlung habe ich vorher auf "On Error Resume Next" gesetzt, um
Laufzeitfehler gezielt abzufangen,..."
Wenn "bytAnzAktionen" grösser 256 bzw. grösser als SPA_Aktion1 - aktion wird, dann hast du einen Fehler der nicht abgefangen wird: Cells(anzDS + 1, SPA_Aktion1 + aktion)
"...- die Variable anzDS wird vor dem Loop-Befehl hochgezählt,..."
Dann musst du doch nicht mehr prüfen "Do While Cells(anzDS + 1, 1) <> """
"...- die Variable bytAnzAktionen wird weiter vorne in der Prozedur bestimmt..."
Aber welchen Wert hat die Variable
"...- wsAD wird später auf Nothing gesetzt..."
Das muss VOR dem Loop der Schleife stehen, da du sonst "anzDS"-mal die Object-Variable neu im Speicher reservierst !!
Gruss Rainer
D
Anzeige
AW: Speicherplatz-/Grafikproblem bei VBA-Prozedur
23.10.2006 18:15:47
Ralf Junglas
Hallo Rainer,
- bytAnzAktionen kann nicht größer als 10 werden,
- der Hinweis darauf, dass wsAD jedesmal als Objektvariable neu reserviert wird, ist
sicher wichtig und mir bis jetzt nicht aufgefallen. Das werde ich ändern und
den Aublauf darauf überprüfen.
Vielen Dank.
Gruß
Ralf

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige