AW: Grosse Datenmengen in EXCEL imprtieren
01.01.2007 10:42:32
ingUR
Hallo, Patric,
@Nepumuk hat sein Programm bereits so ausgerichtet, dass Du mit jedem Aufruf die Daten eines Monats, die Du über den "Öffnen"-Dialog aufrufst, in das aktuelle Tabellenblatt schreibst.
Nach dem Einlesen benennst Du das Blatt um und fügst ein neues Blatt ein, wechselst auf dieses und startest den Einlesprozeß erneut.
Bei 24 Monaten ist dieses eine zweiundzwanzigmalige Arbeit um alle Daten in einer EXCEL-Arbeitsmappe zu haben. Die EXCEL-Datei wird sich allerding mit jeder neu eingelesenen TXT-Datei um ca. 1,2 MB im Speicherumfang vergrößern, Du als für 24 Monate eine ca. 28 MB große XLS-Datei erzeugt wirst, die so noch keine weiteren Berechnungsformel und Prozeduren enthält.
Hier nun die etwas abgänderte Prozedur, weiterhin basirend auf dem Grundgerüst von @Nepumuk, dass die ausgewählte einzulesende TXT-Datei in ein neues Arbeitsblatt einliest und das Tabellenblatt nach dem TXT-Dateinamen umbenennt.
Existiert ein Tqbellenblatt mit diesem Namen bereits, wird kein neues Tabellenblatt eingefügt, sondern es wird das bereits existierende Blatt genommen, die bisherigen Daten darauf gelöscht und die neune Daten geschrieben (Ersetzt da bisherige Programm vollstäbndig):
Option Explicit
Public objFSO As New FileSystemObject
Public Sub prcImport()
Dim vntFilename As Variant, vntTextArray As Variant, vntCellsArray As Variant
Dim lngRow As Long
Dim ws As Worksheet, wsName As String
vntFilename = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If vntFilename = False Then Exit Sub
Application.ScreenUpdating = False
Set objFSO = CreateObject("Scripting.FileSystemObject")
wsName = objFSO.GetFileName(vntFilename)
wsName = Left(wsName, InStr(wsName, ".") - 1)
On Error Resume Next
Set ws = Worksheets(wsName)
If ws Is Nothing Then
Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
ws.Name = wsName
End If
With ws
.Cells.ClearContents
vntTextArray = Split(objFSO.getfile(vntFilename).OpenAsTextStream.ReadAll, ";")
For lngRow = 2 To UBound(vntTextArray)
If Not CBool(InStr(1, vntTextArray(lngRow - 2), "|")) Then Exit For
vntCellsArray = Split(vntTextArray(lngRow - 2), "|")
Range(.Cells(lngRow, 1), .Cells(lngRow, UBound(vntCellsArray) + 1)).Value = vntCellsArray
Next
Dim r As Long, offs As Integer, lRow As Long
For lRow = lngRow - 2 To UBound(vntTextArray)
If InStr(vntTextArray(lRow), ".") Then
r = 1
offs = offs + 1
.Cells(r, 3 + offs) = vntTextArray(lRow)
Else
r = r + 1
If IsNumeric(vntTextArray(lRow)) Then
.Cells(r, 3 + offs) = CDbl(vntTextArray(lRow))
Else
.Cells(r, 3 + offs) = "" ' oder 0
End If
End If
Next
.Columns.AutoFit
End With
Set objFSO = Nothing
Set ws = Nothing
Application.ScreenUpdating = True
End Sub
Natürlich kann man den Prozeß zum Einlesen in eine For-Schleife legen, wozu allerdings entweder die Namensliste der TXT-Dateien vorliegen müßte oder aber die TXT-Dateinamen bilden sich nach einer gemeinsamen Regel, z.B. "ak_" & JJJJ & "_" & MM & ".txt". Das die TXT-Dateinen dabei in einemm gemeinsamen Verzeichnis abgelegt sind, wird dabei als gegeben - da sinnvoll - betrachtet.
Auch kann man weitere Operationen VBA- bzw. zellenformelorientiert planen und in die Arbeitsmappe einbauen. Allein die Möglichkeiten und Wege sind so vielfältig und der organsiatorische Aufwand so speziell problembezogen, dass hier m.E. der gegebenen Einstieg durch das Einlesen der Daten zur eigenen Weiterentwicklung mehr als nur einfach ausgearbeitet ausreichend gegeben ist.
So ist das auslesen der OHLC-Kurse eines Monats (um von den Wochen-OHLC-Kursen gar nicht erst zu reden) für die Symbole bereits damit verbunden, dass eine Liste der Symbole verwaltet werden muß, die Zu- und Abgänge von Sympolen erkennt und Umbenenungen ermöglicht - Du hattest bereits auf diese Notwendigkeit hingewiesen.
Ein weiteres Beispiel: Die Relative Stärke (nach Levy) der Papiere zu berechnen, erfordert weiter eine Dynamisierung der Zellenformeln: RS[Symbol] = Close[Symbol(i), t0] / Close[Symbol(i), t0-t], mit veränderlichem Symbol und t.
Auch die Berechnung eines gleitenden Durchschnittswertes muß tabellenblattübergreifend dynamisch in Abhängigkeit vom Symbolparameter und akltuellem t0 bei vorgegebener Überwachungslänge erfolgen.
Bereits diese einfachen Operationen erfordern eine Programmplanung und Umsetzung, die m.E. dem Rahmen des Forums, das wohl vorrangig Hilfe zur weiteren Selbsthilfe geben soll, sprengen würde, da die Lösung nicht von allgemeiner Verwertbarkeit sein werden, denn Bollingerbänder, Portfolio-Auswertungen bis hin zur Risikoanalyse erfordern weitere besondere Schritte, die vermutlich geschickter mit einer geänderten Datensatzverwaltung (externer Datendatei as Datenserver) zu erledigen sein werden, als über die veränderbare Tabellenstruktur der Arbeitsmappe als Datenbank.
Da ich mich allerdings selber mit der Aktienanalyse ein wenig beschäftige (nutzte dazu jedoch die TradeStation und nur für Besondere Auswertungen EXCEL), können wir gerne, wenn Du magst, über dieses Prokjekt in Verbindung bleiben.
Gruß,
Uwe