hab mir deinen Code grad mal durchgelesen!
Danke, daß sieht sehr gut aus!
fahr jetzt erstmal einkaufen, werd dann später mal nen Test wegen der Laufzeit machen! (und das Ergebnis hier reinschreiben!)
Abschlussbericht
Abschlussbericht!
also dein Code ist richtig gut, ist zwar etwas langsamer als die Version mit binären Dateien (ca +30%) und die erstellten Dateien sind ca 3x so groß, aber immer noch besser als die von der reinen txt Datei, die sind nochmal 5x so groß.
Werde morgen nochmal mit den anderen reden, wie die es gern hätten (hab ja jetzt Vor- und Nachteile) und kann mich dann endlich ans schrieben von Version 0.1 machen
Auf jeden Fall werde ich so Sachen wie:
Application.ScreenUpdating = False
Application.StatusBar = "Schreibe Datei "
On Error GoTo Fehler
mal zu meinen Grund-Befehlen hinzufügen!
Vielen Dank nochmal an alle!
Hallo Zodan,
also dein Code ist richtig gut, ist zwar etwas langsamer als
die Version mit binären Dateien (ca +30%) und die erstellten
Dateien sind ca 3x so groß, aber immer noch besser als die von
der reinen txt Datei, die sind nochmal 5x so groß.
da kann man wenig dran machen. Du sagst ja du hast in einem Ordner zigtausende xls-Dateien, um die auszulesen muß man sie erstmal alle via Excel nacheinander öffnen und schließen, da verrinnt halt die Zeit.
Deshalb würde auch eine RamDisk nichts bringen. Um ihre Vorteile zu nutzen müßte man erstmal alle Dateien in die RamDisk kopieren und sie dann dort öffnen/schließen. das ginge dann schon gewaltig schneller, aber die Zeit fürs Reinkopieren ist schon mal verflossen.
Wie das Leben so spielt, eben suchte ich an sich nach etwas anderem, aber fand dieses:
http://www.vbanet.de/newsletter_31.html
Nach erstem Überfliegen sehe ihc da ggfs. Möglichkeiten, Codefragmente daraus zu benutzen und auch einige Anregungen für dich, deine Problematik.
Ich weiß, mittels einem Ecel4makro kann man auch eine Zelle aus geschlossenen Dateien auslesen, aber da dies nur eine Zelle ist bedingt das dann viele Schleifen drumrum um in zigtausend Dateien viele Zellen auszulesen.
Ob dies dann schneller ist als mit einer Schleife alle Dateien zu öffnen/schließen und jedesmal den Inhalt auf einen Rutsch einzulesen weiß ich nicht.
Werde morgen nochmal mit den anderen reden, wie die es gern
hätten (hab ja jetzt Vor- und Nachteile) und kann mich dann
endlich ans schrieben von Version 0.1 machen
So wie ich das alles verstanden habe, hast du x Ordner mit jeweils sehr vielen xls-Dateien, die einmalig „umgesetzt“ werden müssen.
Gelegentlich( also nicht stündlich o.ä.) kommt ein neuer Ordner hinzu, der genauso umgesetzt werden soll.
Dann spielt m.E. die Codelaufzeit nicht mehr die große Rolle, sowas läßt man über Nacht laufen und fertig.
Als Ergebnis hat man dann in jedem Ordner 250 Dateien, ob das jetzt txt-dateien oder xls-Dateien sind, wird halt festgelgt.
Gruß
Reinhard
Danke!
erstmal alle via Excel nacheinander öffnen und schließen, da
verrinnt halt die Zeit.
das einlesen der Dateien dauert bei beiden Verfahren fast gleichlang, dass schrieben dauert so lange.
bei 2456 Datein dauert es bei dir (lesen/schreiben) 322/186sec und mit bin´s 339/24
aber unter 10min sind für die Menge an Daten für mich ok!
Deshalb würde auch eine RamDisk nichts bringen.
das war ja auch nur ne Idee, wenn man jede Datei öfters öffnen müßte, wäre es interessant!
Danke les ich mir durch! (und lern mindestens was dabei!)
Ich weiß, mittels einem Ecel4makro kann man auch eine Zelle aus geschlossenen Dateien auslesen
werde ich wenn die Zeit es zuläßt auch mal ausprobieren, wobei ich nciht denke, daß es schneller ist!
So wie ich das alles verstanden habe, hast du x Ordner mit
jeweils sehr vielen xls-Dateien, die einmalig „umgesetzt“
werden müssen.
eigentlich handelt es sich immer um einen Ordner, aber dass ist im Endeffekt ja auch egal wie die Datein verteilt sind, muß man halt den Pfad anpassen!
Eine ruhige und erfolgreiche Woche noch!
schnelle Excellösung
Hallo Zodan,
aufgrund des Links habe ich jetzt was schnelles gebastelt.
Zum Testen hatte ich 100 xls-Dateien mit 250 Zeilen a 11 Spalten in einem Ordner.
Zum Einlesen der 100 Dateien werden auf meinem betagten Rechner (unter 1 GB MHz) unter 3 Sekunden gebraucht, also 0,03 Sek pro Datei, was dann für 50.000 Dateien eine Zeit von ca. Option Explicit
’
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim ws, Datanz, DatproBlatt
If Target.Address „$F$1“ Then Exit Sub
On Error GoTo Fehler
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each ws In Worksheets
If ws.Name Like „Dat*“ Then Datanz = Datanz + 1
Next ws
With Worksheets(„Ausgabe“).Range(Cells(1, 1), Cells(23 * Datanz, 4))
.FormulaLocal = „=INDIREKT(“„Dat“"&Ganzzahl((zeile()-1)/23)+1&""!""&ZEICHEN(64+SPALTE())&(ZEILE()-1)*250+$F$1-GANZZAHL((ZEILE()-1)/23)*23*250)"
.Value = .Value
End With
Fehler:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
In ein beliebiges Standardmodul:
Option Explicit
'
Sub ee()
Dim F, Activesheet, lngZei, intAnz, strDatNam, strTabelleName, strBereich
Dim Start, Datanz, X, D
Call Loesch
Start = Now
strBereich = Range("A1:K250").Address(RowAbsolute:=True, \_
ColumnAbsolute:=True, ReferenceStyle:=xlR1C1)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Application.FileSearch
.NewSearch
.LookIn = "C:\FreqTest3"
.SearchSubFolders = False
.FileType = msoFileTypeExcelWorkbooks
.Execute
For F = 1 To .FoundFiles.Count
If (F - 1) Mod 23 = 0 Then 'Pro Blatt nur Daten aus 23 Dateien
Datanz = Datanz + 1
Worksheets.Add after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = "Dat" & Datanz
End If
strDatNam = Dir(.FoundFiles(F))
lngZei = Worksheets("Dat" & Datanz).Range("A" & Rows.Count).End(xlUp).Row - 1 \* (Cells(1, 1) "")
With Worksheets("Dat" & Datanz).Range("A" & lngZei & ":" & "K" & lngZei + 249)
.FormulaArray = "='c:\FreqTest3\[" & strDatNam & "]" & \_
"Tabelle1'!" & strBereich
.Value = .Value
End With
Next F
End With
For D = 1 To Datanz
Worksheets("Dat" & D).Range("A:B,D:smiley:,F:F,G:I").Delete
Next D
'For D = 1 To 250
' Worksheets.Add after:=Worksheets(Worksheets.Count)
' Worksheets(Worksheets.Count).Name = "Freq" & D
' With Worksheets("Freq" & D).Range("A1:smiley:" & 100)
' '=INDIREKT("Dat1"&"!"&ZEICHEN(64+SPALTE())&(ZEILE()-1)\*250+1)
' .FormulaLocal = " =INDIREKT(""Dat""&D&""!""&ZEICHEN(64+SPALTE())&(ZEILE()-1)\*250+1)"
' .Value = .Value
' End With
'Next D
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox Format(Start - Now, "hh:mm,ss")
Worksheets("Ausgabe").Activate
Worksheets("Ausgabe").Range("A:smiley:").ClearContents
Application.EnableEvents = False
Worksheets("Ausgabe").Range("F1") = ""
Application.EnableEvents = True
End Sub
'
Sub Loesch()
Dim n
Application.DisplayAlerts = False
For Each n In ActiveWorkbook.Worksheets
If n.Name Like "Dat\*" Or n.Name Like "Freq\*" Then n.Delete
Next n
Application.DisplayAlerts = True
End Sub
*kicher* *rofl*
und ich dachte schon mein Excel hätte irgendein Problem, weil es auf einmal Activesheet nicht mehr erkannte *hihi*
Streich bitte die Variable „Activesheet“ aus der Dim Anweisung…
Gruß
Reinhard