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

txt konvertierung belegt Arbeitsspeicher

txt konvertierung belegt Arbeitsspeicher
29.11.2016 13:50:49
Mobs2b
Guten Tag,
Ich habe ein Problem mit meiner VBA Programmierung und ich hoffe, dass ich hier Hilfe finde.
Meine VBA Kenntnisse sind so mittelmäßig, jedoch finde ich meistens was ich suche und kann es dann für mich nutzen. Nun habe ich das Problem, dass mir die Schleife den Arbeitsspeicher zunehmend belegt und nach 150+ Durchläufen stehen bleibt.
Ich denke, dass es an den Arrays liegt, die zur Konvertierung erstellt werden und dann anscheinend beim Schließen der Datei nicht gelöscht werden, jedoch finde ich nichts im Netz, was mir bei dem Problem weiter hilft.
Ich hoffe ihr könnt mir Helfen.
Mit freundlichem Gruß
der Mobs
hier der Teil des Skriptes mit der Schleife. In fett mein vermeidlicher Übeltäter.
Sub Tempverlauf_Neu()
Dim strPath As String
Dim inti As Integer
Dim fso As Object, File As Object
Dim i As Integer
Dim a As String
Dim FileY As String
Dim FileX As String
Dim letztezeile As Integer
Dim outmin As Single
Dim r As Integer
Dim v As Integer
Dim FileZ As String
Dim e As Integer
Dim k As Integer
Dim j As Integer
Dim Datum As String
Datum = (Format(Date, "YYMMDD"))
a = "Spannung und Temperatur"
i = 1
' Verzeichnis Speicherort der Daten
FileY = "...\"
' Verzeichnis der zu ladenen Datei
FileX = "...\"
Application.ScreenUpdating = False
' //Zuerst wird die Anzahl der Dateien ermittelt, die sich in dem Ordner befinden, der ausgewertet werden soll.//
' Ordnerpfan angeben
strPath = FileX
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(strPath).Files
' hier die Auswahl der Dateien, die gezählt werden sollen
If fso.GetExtensionName(File) = "TXT" And Left(File.Name, 4) = "Span" Then inti = inti + 1
Next File
Set fso = Nothing
' // Hier wird eine .TXT Datei in Excel geöffnet
' TXTDateiOeffnen Makro
'
'
For i = 1 To inti
Application.CutCopyMode = False
Workbooks.OpenText Filename:= _
FileX & "\" & a & i & ".TXT" _
, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, _
Semicolon:=True, _
Other:=False, FieldInfo:=Array(Array(1, 1), _
Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1))
' hier fehlt jetzt noch der plot in ein anderes sheet und das beenden der Datei.
' und für jede Textdatei soll am besten ein eigenes excel arbeitsblatt gemacht werden...
'Hier wir die letzte Zeile der Spalte A ermittelt
letztezeile = Worksheets(a & i).Cells(Rows.Count, 1).End(xlUp).Row
'Diagramm erstellen
'
Sheets.Add After:=ActiveSheet
Charts.Add
With ActiveChart
.ChartType = xlXYScatterLines
.SetSourceData Source:=Sheets(a & i).Range("A1:A" & letztezeile)
.FullSeriesCollection(1).Name = "=""Temperatur"""
.FullSeriesCollection(1).Values = "'" & a & i & "'" & "!$A$1:$A$" & letztezeile
End With
ActiveChart.Axes(xlValue).MajorGridlines.Select
With ActiveChart.FullSeriesCollection(1)
.MarkerStyle = -4142
End With
With ActiveChart.FullSeriesCollection(1).Format.Line
.Visible = msoTrue
.Weight = 0.25
End With
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = a
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Zeitverlauf"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Temperatur in Grad"
.Axes(xlValue).AxisTitle.Orientation = xlHorizontal
End With
With ActiveChart.Axes(xlValue)
.MaximumScale = 120
.MinimumScale = 20
End With
With ActiveChart.FullSeriesCollection(1)
.AxisGroup = 2
End With
With ActiveChart.Axes(xlValue).AxisTitle
.Left = 11
.Top = 14.026
End With
With ActiveChart.Axes(xlCategory).AxisTitle
.Left = 603.805
.Top = 450.232
End With
With ActiveChart.PlotArea
.Width = 507.835
.Left = 41.875
.Width = 585.835
End With
ActiveWorkbook.SaveAs Filename:= _
FileY & Datum & "_" & a & i & "_.xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Workbooks(Datum & "_" & a & i & "_.xlsx").Close savechanges:=False
Next i

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: txt konvertierung belegt Arbeitsspeicher
30.11.2016 12:29:48
Zwenn
Hallo Mobs2b,
beschäftige Dich mal mit dem Gültigkeitsbereich von Variablen. Du hast alles in eine einzige Sub geschrieben. Nun kenne ich die Länge der Texte nicht, die Du untersuchen willst und eigentlich kann ich mir bei reinem Text nicht vorstellen, dass Gigabyte-weise Speicher belegt wird. Trotzdem wird in Deinem Programm an keiner Stelle wieder Speicher frei gegeben, sondern erst, wenn das Makro beendet wird. Du kannst das Ganze wesentlich übersichtlicher gestalten, wenn Du Funktionen und Subs verwendest, in die Du Dein Makro aufteilst.
Der von einer Funktion oder eine Sub belegte Speicher wird nach ihrem Verlassen auch wieder frei. Verarbeite also alle Texte nacheinander über Unterprogramme, dann sollte es das von Dir beschriebene Problem nicht mehr geben.
Viele Grüße,
Zwenn
Anzeige
AW: txt konvertierung belegt Arbeitsspeicher
30.11.2016 16:11:38
Mobs2b
Hallo Zwenn,
vielen Dank für die Antwort. Was meinst du mit dem Gültigkeitsbereich?
Die Strings sind alles nur Verzeichnispfade und haben keine Länge von 265+ Zeichen. Die lassen sich jedoch auch nicht ändern.
Und die Integer passen auch alle. Da komme ich glaube auch nicht mit weniger hin.
Das mit den Unterfunktionen ist ein guter Punkt und ich werde das nochmal angehen. Bin jetzt auf den CAD Rechner gegangen, der hat 16Gig Arbeitsspeicher und packt es auch. Dieser läuft dann jedoch auch nicht weiter voll. Der Excelprozess belegt in der Zeit so 230Mb und bleibt dann konstant. Auf dem kleinen Laptop ( immerhin auch 4 Gig), läuft der Arbeitsspeicher kontinuierlich voll.
Kann es sein, dass Excel, da es irgendwo an Leistung fehlt, anfängt Dateien auszulagern oder Speicher zu reservieren, den es nicht wieder freigibt? verstehe nicht wo sonst der Unterschied liegen kann.
Für den CAD Rechner habe ich jetzt sogar alles in ein Sub gepackt. Also genau das, wovon mir jeder abraten würde, läuft aber ganz ok.
Bin mir aber auch nicht sicher, wie ich das in mehrere Subs unterteilen soll. Es ist doch nur das konvertieren einer Text Datei und das zeichnen eines Graphen in der Exceldatei. Und das immer wieder.
Die Sheets werden sauber geschlossen, es ist immer nur ein Sheet offen. und so viel Speicher belegen doch die paar Variablen nicht?
Anzeige
AW: txt konvertierung belegt Arbeitsspeicher
01.12.2016 11:14:20
Zwenn
Hallo Mobs2b,
warum Dein Makro auf dem einen Rechner läuft und auf dem anderen ein Speicherleck entsteht, kann ich Dir nicht sagen. Vielleicht liegt es an unterschiedlichen Excel Versionen, vielleicht an etwas völlig anderem. Unterm Strich ist es auch egal, denn so wie Du Deinen Code angelegt hast, alles in einer Sub, macht man es eben einfach nicht.
Man teilt das Gesamtproblem in Teilprobleme auf, die man dann einzeln als Unterprogramme (Prozeduren und Funktionen) entwickelt. Das sorgt für eine wesentlich bessere Lesbarkeit des Codes, vor allem für Dritte, die Deinen Code durchsehen. Es sorgt aber vor allem auch für eine bessere Fehlervermeidung. In Deinem Fall, musst Du den Fehler im gesamten Programmcode aufspühren. Taucht ein Fehler in einer Unterroutine auf, hast Du es viel leichter. Ausserdem ist auch die Entwicklung einfacher, weil Du dich immer nur auf ein Teilproblem zur Zeit konzentrieren kannst.
Es ist insgesamt einfach handwerklich besser, ein Programm nicht in einem Guss durchzucoden. Ein weiterer Grund ist der Umgang mit Konstanten und Variablen. Es ist am besten, wenn immer nur die Konstanten und Variablen zur Verfügung stehen, die das Programm aktuell braucht. Deshalb gibt es Gültigkeitsbereiche.
So ist eine mit DIM deklarierte Variable in einer Sub oder Function nur innerhalb dieser Sub oder Function sichtbar. Sobald das Unterprogramm verlassen wird, wird ausserdem der durch die in ihr definierten Konstanten und deklarierten Variablen wieder freigegeben.
Hier sind zwei Links, unter denen die Gültigkeitsbereiche in VBA erklärt werden:
https://support.microsoft.com/de-de/kb/141693
https://de.wikibooks.org/wiki/VBA_in_Excel/_G%C3%BCltigkeit_von_Variablen_und_Konstanten
Du schreibst:
Es ist doch nur das konvertieren einer Text Datei und das zeichnen eines Graphen in der Exceldatei. Und das immer wieder.
Damit hast Du bereits zwei Unterprogramme und Dein Hauptprogramm, aus dem Du die Unterprogramme aufrufst, grob definiert. Das Konvertieren des Textes und das Zeichnen des Graphen sind zwei völlig unterschiedliche Dinge, die auf jeden Fall in unterschiedliche Routinen gehören. Ob diese dann ihrerseits noch sinnvoll weiter aufgeteilt werden sollten musst Du selber entscheiden.
Dein Satz Und das immer wieder beinhaltet ja die Schleife, mit der Du Deine Text-Dateien abarbeitest, bis alle durch sind. Die gehört ins Hauptprogramm und innerhalb der Schleife rufst Du die Routinen zur Konvertierung des Textes und zur Erstellung des Graphen auf. Die notwendigen Parameter musst Du dann jeweils an die Routinen übergeben und den Rückgabewert (bei Funktionen), wieder entgegen nehmen und entsprechend weiter verarbeiten. Z.B. den konvertierten Text an die Routine zum zeichnen des Graphen geben.
Viele Grüße,
Zwenn
Anzeige
AW: txt konvertierung belegt Arbeitsspeicher
01.12.2016 16:06:29
Mobs2b
Moin Zwenn,
Vielen Dank für deine ausführliche Antwort. Ich werde mich da mal beimachen und den ganzen Kram umschreiben und es, wenn ich daran scheitere, es zumindest für das nächste Mal beherzigen.
Mit freundlichem Gruß
der mobs
AW: txt konvertierung belegt Arbeitsspeicher
02.12.2016 11:35:20
Mobs2b
Guten Tag,
ich habe jetzt deinen Rat beherzigt und das Programm so gut es geht untergliedert. Bin mir nicht sicher, ob das, was ich da geschafft habe 100ig konsequent und sinnvoll war. geht bestimmt noch schöner...
Wichtiger ist auch, dass mein Problem immernoch besteht. Nun die Frage, ob man die schleife noch weiter sinnvoll unterteilen kann oder ob ich sie zwar unterteilt habe, es jedoch keinen sinn ergibt, weil die einzelnen Funktionen nicht genug getrennt voneinander sind...
Bin mir nicht sicher, ob man versteht, was ich damit meine...
hier mal der komplette code
Sub Tempverlauf_Neu()
Dim inti As Integer
Dim i As Integer
Dim letztezeile As Integer
Dim v As Integer
Dim datum As String
Dim a As String
Dim FileY As String
Dim Filex As String
Dim FileZ As String
Dim Filek As String
datum = (Format(Date, "YYMMDD"))
a = "x"
i = 1
v = 10               ' das wievielte Bauteil soll genommen werden? für v einsetzen
'Verzeichnis Speicherort der Daten
FileY = "M:\...Mittag\a\"
'Verzeichnis der zu ladenen Datei
Filex = "M:\...Mittag\"
'Name der Datei für die Zusammenfassung der Graphen
FileZ = "DiaZx" & v & "."
'Name der Datei, in die aus jeder Datei ein Messwert kopiert wurde
Filek = "x"
Application.ScreenUpdating = False
Datacount Filex, inti
For i = 1 To inti
transTxtinExcel Filex, a, i, FileY, datum
letztezeilef a, i, letztezeile
xyDiagrammzeichnen letztezeile, a, i, FileY, datum
Next i
AParaIn1Datei FileY, datum, a, inti
alleBTDia datum, FileZ, v, inti, FileY
Graphenerstellen datum, v, FileY, FileZ, inti
End Sub
Function Datacount(Filex As String, inti As Integer)
'Funktion zum Zählen der Dateien innerhalb eines Ordners
Dim strPath As String
Dim fso As Object
Dim File As Object
' //Zuerst wird die Anzahl der Dateien ermittelt, die sich in dem Ordner befinden, der  _
ausgewertet werden soll.//
' Ordnerpfan angeben
strPath = Filex
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(strPath).Files
' hier die Auswahl der Dateien, die gezählt werden sollen
If fso.GetExtensionName(File) = "TXT" And Left(File.Name, 4) = "Span" Then inti = inti + 1
Next File
Set fso = Nothing
' // Hier wird eine .TXT Datei in Excel geöffnet
' TXTDateiOeffnen Makro
End Function
Function letztezeilef(a As String, i As Integer, letztezeile As Integer)
'Hier wir die letzte Zeile der Spalte A ermittelt
letztezeile = Worksheets(a & i).Cells(Rows.Count, 1).End(xlUp).Row
'Diagramm erstellen
End Function
Function transTxtinExcel(Filex As String, a As String, i As Integer, FileY As String, datum As  _
String)
'Function Txt Datei in Excel konvertieren
Application.CutCopyMode = False
Workbooks.OpenText Filename:= _
Filex & "\" & a & i & ".TXT" _
, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, _
Semicolon:=True, _
Other:=False, FieldInfo:=Array(Array(1, 1), _
Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1))
End Function
Function xyDiagrammzeichnen(letztezeile As Integer, a As String, i As Integer, FileY As String,  _
datum As String)
'Dieses Diagramm erstellt auf einem neuen Sheet aus den Werten der ersten Spalte im ersten  _
Sheet ein XYDiagramm
Sheets.Add After:=ActiveSheet
Charts.Add
With ActiveChart
.ChartType = xlXYScatterLines
.SetSourceData Source:=Sheets(a & i).Range("A1:A" & letztezeile)
.FullSeriesCollection(1).Name = "=""x"""
.FullSeriesCollection(1).Values = "'" & a & i & "'" & "!$A$1:$A$" & letztezeile
End With
ActiveChart.Axes(xlValue).MajorGridlines.Select
With ActiveChart.FullSeriesCollection(1)
.MarkerStyle = -4142
End With
With ActiveChart.FullSeriesCollection(1).Format.Line
.Visible = msoTrue
.Weight = 0.25
End With
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = a
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "x"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "x"
.Axes(xlValue).AxisTitle.Orientation = xlHorizontal
End With
With ActiveChart.Axes(xlValue)
.MaximumScale = 120
.MinimumScale = 20
End With
With ActiveChart.FullSeriesCollection(1)
.AxisGroup = 2
End With
With ActiveChart.Axes(xlValue).AxisTitle
.Left = 11
.Top = 14.026
End With
With ActiveChart.Axes(xlCategory).AxisTitle
.Left = 603.805
.Top = 450.232
End With
With ActiveChart.PlotArea
.Width = 507.835
.Left = 41.875
.Width = 585.835
End With
ActiveWorkbook.SaveAs Filename:= _
FileY & datum & "_" & a & i & "_.xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Workbooks(datum & "_" & a & i & "_.xlsx").Close savechanges:=False
End Function
Function AParaIn1Datei(FileY As String, datum As String, a As String, inti As Integer, Filek As  _
String)
'Diese Funktion nimmt aus jeder Messdatei jeweils die Bauteiltemperatur, das Spülluftvolumen,  _
das Datum und die Zeit zu einem Zeitpunkt,
'der durch die Zelle Vorgegeben wird. Im moment ist es die 5. Zeile.
Dim k As Integer
Dim outmin As Single
Workbooks.Add
Sheets.Add After:=ActiveSheet
k = 1
For k = 1 To inti
Workbooks.Open Filename:= _
FileY & datum & "_" & a & k & "_.xlsx"
Workbooks(datum & "_" & a & k & "_.xlsx").Worksheets(1).Activate
Range(Cells(5, 1), Cells(5, 3)).Copy
Workbooks("Mappe1").Worksheets(1).Activate
Range(Cells(k + 3, 1), Cells(k + 3, 3)).PasteSpecial
Workbooks(datum & "_" & a & k & "_.xlsx").Worksheets(1).Activate
Range(Cells(5, 5), Cells(5, 7)).Copy
Workbooks("Mappe1").Worksheets(1).Activate
Range(Cells(k + 3, 5), Cells(k + 3, 7)).PasteSpecial
Workbooks(datum & "_" & a & k & "_.xlsx").Worksheets(1).Activate
outmin = Application.WorksheetFunction.Min(Range("D1:D200"))
Workbooks("mappe1").Worksheets(1).Cells(k + 4, 4) = outmin
Cells(k + 4, 4) = Round(Cells(k + 4, 4), 2)
Application.CutCopyMode = False
Workbooks(datum & "_" & a & k & "_.xlsx").Close savechanges:=False
Next k
ActiveWorkbook.SaveAs Filename:= _
FileY & datum & Filek & "_" & ".xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End Function
Function alleBTDia(datum As String, FileZ As String, v As Integer, inti As Integer, FileY As  _
String)
'Diese Funktion kopiert die Messwerte der Bauteiltemperatur von jedem Bauteil, dass im Ordner  _
gespeichet ist in eine Datei und speichert diese
'separat ab
Dim b As Integer
Dim c As Integer
Dim e As Integer
Dim a As Integer
a = 1
b = 1
c = inti / v
' Der Dateiname muss an den Speichernamen angepasst werden.
'Neues Excelarbeitsblatt öffnen
Workbooks.Add
Sheets.Add After:=ActiveSheet
' Diagrammblatt erstellen
'eine weitere Variable wird benötigt, da die Dateinamen nun nicht mehr mit den Datenreihen  _
zahlen übereinstimmen
e = 1
For e = b To c
Workbooks.Open Filename:= _
FileY & datum & "_xx" & a & "_.xlsx"
Sheets("x" & a).Activate
Sheets("x" & a).Range("A1:A200").Copy
Windows("Mappe2").Activate
Sheets("Tabelle1").Activate
Columns(e).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Workbooks(datum & "_x" & a & "_.xlsx").Close savechanges:=False
If v = 1 Then
a = a + 1
Else
a = a + v - 1
End If
Next e
ActiveWorkbook.SaveAs Filename:= _
FileY & datum & FileZ & i & "_" & ".xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End Function
Function Graphenerstellen(datum As String, v As Integer, FileY As String, FileZ As String, inti  _
As Integer)
'Diese Funktion erstellt aus einer beliebig geladenen datei auf einem neuen Sheet aus allen  _
werten des ersten sheet ein Diagramm.
'Dabei werden die Daten Spaltenweise in ein XY Diagramm geschrieben.
'Zu beachten ist, dass die Tabelle nicht mehr als 256 Spalten haben darf, da Excel sonst an  _
seine Grenze stößt.
Dim b As Integer
Dim c As Integer
Dim j As Integer
b = 1
c = inti / v
j = 1
Sheets.Add After:=ActiveSheet
Charts.Add
ActiveChart.ChartType = xlXYScatterLines
For j = b To c
With Sheets("Diagramm1")
.SeriesCollection.NewSeries
.FullSeriesCollection(j).Values = _
Sheets("Tabelle1").Range(Sheets("Tabelle1").Cells(1, j), Sheets("Tabelle1").Cells(200,  _
j))
.FullSeriesCollection(j).Name = "x" & (j - 1) * v + 1
End With
' Sheets("Diagramm1").Axes(xlValue).MajorGridlines.Select
With Sheets("Diagramm1").FullSeriesCollection(j)
.Format.Line.Visible = msoTrue
.Format.Line.Weight = 0.25
.MarkerStyle = -4142
End With
Next j
If v = 1 Then
With Sheets("Diagramm1")
.HasTitle = True
.ChartTitle.Characters.Text = "x " & datum & " x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "x"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "x"
.Axes(xlValue).AxisTitle.Orientation = xlHorizontal
End With
Else
With Sheets("Diagramm1")
.HasTitle = True
.ChartTitle.Characters.Text = "x " & Format(Date, ("dd.mm.yy")) & " jedes " & v & ". x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "x"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "x" & vbLf & "x"
.Axes(xlValue).AxisTitle.Orientation = xlHorizontal
End With
End If
With Sheets("Diagramm1").Axes(xlValue).AxisTitle
.Left = 11
.Top = 14.026
End With
With Sheets("Diagramm1").Axes(xlCategory).AxisTitle
.Left = 603.805
.Top = 450.232
End With
With Sheets("Diagramm1").PlotArea
.Width = 507.835
.Left = 41.875
.Width = 585.835
End With
' Daten aus anderer Exceldatei öffnen und ins Diagramm einfügen
'andere Datei schließen
'Datei abspeichern und schließen
ActiveWorkbook.SaveAs Filename:= _
FileY & datum & FileZ & i & "_" & ".xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End Function
das Excel ist im übrigen einmal 32 bit und einmal 64 oder 86 bit...
mit freundlichem Gruß
der Mobs
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige