VBA Excel 2000 Textdatei einlesen

Hi,

so das nächste Problem in meinem Programm!

Also erstmal zum Grundproblem:

Ich habe 7x2000 Dateien aus einer Messreihe(verschiedene Messzeitpunkte)(und es gibt mehrere Messreihen, das Programm soll aber immer nur eine „verwalten“)
jede Datei beinhaltet zu 250 Frequenzen je 4 Messwerte

diese Daten muß ich so aufbereiten, daß man die Messergebnisse zu einer Frequenz angezeigt werden.

so, da es sehr lange (hab mir sagen lassen 30min) dauert bis die Daten aus allen Dateien einzel ausgelesen sind, muß ich mir was einfallen lassen!

Meine Idee war:
die ganzen Daten so anordnen, daß in einer Datei immer nur die Daten zu einer Frequenz liegen. (dauert einmal lang, ist dann aber sehr schnell)

Da mir das erstellen und schrieben in Excel Tabellen nicht bekannt ist und ich auch nicht weiß wo ich suchen kann, hab ich mir überlegt, dazu eine einfache Textdatei zu verwenden!
mit:
Set filess = CreateObject(„scripting.filesystemobject“)
Set file = filess.createtextfile(pfad & „test.txt“, True)
y = 1
For x = 1 To anzahl
file.writeline (Worksheets(2).Cells(x, y) & „;“)
Next

klappt das im Test auch ganz gut.

Das importieren der Datei wollte ich dann einfach wie mit Daten -> externe Daten -> Textdatei importieren machen.
Hab mir das Makro mal aufzeichnen lassen und auch halbwegs verstanden, aber damit werden die Daten nicht nur einfach eingelesen und gut, sondern sie werden verknüpf! (auch wenn man die Aktualisierung ausschaltet) das heißt, Excel speichert sich woher die Daten sind, auch wenn ich sie schon wieder gelöscht haben! -> Datenmüll!

Gibt es eine Möglichkeit dies zu unterbinden?
Vielleicht gibt´s auch eine „readline“? Wie ist dafür der Syntax?
oder wie kann ich Daten in eine andere Excel Datei schreiben?
lesen mach ich momentan mit:

with cells(x,y)
.Value = „=’“ & pfad & „[“ & Dateiname & „]“ & „werte’!D“ & Frequentschritt
.Value = .Value

Hi Zondan,

Ich habe 7x2000 Dateien aus einer Messreihe(verschiedene
Messzeitpunkte)(und es gibt mehrere Messreihen, das Programm
soll aber immer nur eine „verwalten“)
jede Datei beinhaltet zu 250 Frequenzen je 4 Messwerte

mir bleibt unklar wieviele Dateien es sind, 14.000 oder xmal 14.000,
aber erstmal nicht so wichtig.

Liegen die Dateien pro Messpunkt oder Messreihe in einem Unterordner, oder alle in einem Ordner, werden nur durch den Namen unterschieden?

diese Daten muß ich so aufbereiten, daß man die Messergebnisse
zu einer Frequenz angezeigt werden.
so, da es sehr lange (hab mir sagen lassen 30min) dauert bis
die Daten aus allen Dateien einzel ausgelesen sind, muß ich
mir was einfallen lassen!

sowas kann man nur grob schätzen, hängt stark davon ab ob du einen ZX81 hast oder einen Gray Computer :smile:
Aber ist schon richtig, Dateiöffnung/schließung dauert „ewig“.

Meine Idee war:
die ganzen Daten so anordnen, daß in einer Datei immer nur die
Daten zu einer Frequenz liegen. (dauert einmal lang, ist dann
aber sehr schnell)

Sehe ich genauso.

Da mir das erstellen und schrieben in Excel Tabellen nicht
bekannt ist und ich auch nicht weiß wo ich suchen kann, hab
ich mir überlegt, dazu eine einfache Textdatei zu verwenden!
mit:
Set filess = CreateObject(„scripting.filesystemobject“)
Set file = filess.createtextfile(pfad & „test.txt“, True)
y = 1
For x = 1 To anzahl
file.writeline (Worksheets(2).Cells(x, y) & „;“)
Next

FSO benutze ich sehr seltn, kenne mich da nicht sehr aus.

oder wie kann ich Daten in eine andere Excel Datei schreiben?
lesen mach ich momentan mit:
gibts da was schnelleres?

Die Idee mit Textdatei ist ja auch nicht schlecht, wenn du alle Daten, also immer 4 Werte, gleichlang, nacheinander in eine Gesamtdatei packst, könntest du Satzweise darauf zugreifen, d.h. der 3.te, 253.te, 503.te, usw Satz bezieht sich auf die 3te Frequenz.
Und Satzweise geht schneller auszulesen als Sequentiell, denn du sagst dem makro, zeige mir den 3ten, 253ten 503ten satz usw.
Ähem, Rainer ^ Alex u.e.e.a. (e1=eventuell,e2=einige *gg*) haben da viel mehr Wissen zu Dateiauslesen/schreiben :smile:)

Ich habe da was für excel gebastelt, steht nachfolgend. Das kann noch getunt werden zur Beschleunigung, aber erst mal wichtiger das es erstmal in die Richtung zeigt in die du willst.

Schau mal in der VBA-Hilfe nach Excecute,Filesearch,Searchsubfolder usw., dort findest du Beispielcode (ich hab hier keine vba-Hilfe) in dem eine with Filesearch Schleife steht, in du mußt du noch meinen Code integrieren damit du auf .Foundfiles zugreifen kannst.

Der Code ist völlig ungetestet so runtergeschrieben, also wirds noch diverse Fehler geben. Bzw. getestet iws habe ich nur den Dim Befehl, aber der Debugger hat nicht gemotzt.

Hatte auch schon die Überlegung um die Zugriffszeiten so
senken mit einem „RAMDrive“ zu arbeiten, aber das wird wohl
etwas zu viel Aufwand sein!

Wieso, du mußt doch nur beim Start von Win eine Ramdrive anlegen, deine Dateien da reinkopieren…
Das müßte doch eine Batchdatei im Autostart-Ordner erledigen können.
Frage mich aber bitte nicht nach dem Befehl dafür, meine letzte Ramdrive legte ich unter Dos3.3 an :smile:)

Gruß
Reinhard

Option Explicit
Option Base 1
Sub tt()
Dim a(14000, 250, 4) As Double, N As Integer, Z As Byte, S As Byte
Dim W As Byte
Application.ScreenUpdating = False
'
' hier code aus der Hilfe einfügen für .foundfiles
'
For N = 1 To .FoundFiles.Count ' 14.000 ?
 Workbooks.Open .FoundFiles(N)
 For Z = 1 To 250
 For S = 1 To 4
 a(N, Z, S) = Cells(Z, S)
 Next S
 Next Z
 Workbooks(.FoundFiles(N)).Close savechanges:=False
Next N
For W = 1 To 250
 Workbooks.Add
 ActiveWorkbook.Name = "Freq" & W
Next W
For N = 1 To .FoundFiles.Count ' 14.000 ?
 For Z = 1 To 250
 For S = 1 To 4
 Workbooks("Freq" & Z).Worksheets(1).Cells(N, S) = a(N, Z, S)
 Next S
 Next Z
Next N
For W = 1 To 250
 Workbooks("Freq" & W).Close savechanges:=True
Next W
Application.ScreenUpdating = True
End Sub

Hallo Reinhard,

Achtung! w-w-w hat mir wieder den Code zerschossen. Überall wo ich ein Anführungszeichen (kann ich hier jetzt auch nicht mehr schreiben.:smile: geschrieben habe steht innerhalb der Pre-Tags jetzt '. Die Pfade sind so natürlich nicht zu gebrauchen, müssen von Hand nachgearbeitet werden. Sorry, ich habe es schon im BugBrett gemeldet.

Und Satzweise geht schneller auszulesen als Sequentiell, denn
du sagst dem makro, zeige mir den 3ten, 253ten 503ten satz
usw.
Ähem, Rainer ^ Alex u.e.e.a. (e1=eventuell,e2=einige *gg*)
haben da viel mehr Wissen zu Dateiauslesen/schreiben :smile:)

in ein Array mit privaten Typen lesen und schreiben geht noch schneller und ist auch schön einfach zu handhaben. Komfortabler wird es kaum gehen.
Die Programmteile der Anzeige im Flexgrid an Excel anpassen müsstest Du machen, das kann ich nicht.

Option Explicit

Private Type Satz
 Frequenz As Single
 Messwert(3) As Single
End Type

Dim f() As Satz

Private Sub Command1\_Click()
 'Daten aufbauen und anzeigen
 Dim i As Integer, j As Integer, r As Integer, c As Integer
 ReDim f(10) 'nur Beispiel
 For i = 0 To 10
 f(i).Frequenz = i \* 100
 For j = 0 To 3
 f(i).Messwert(j) = Int(Rnd(1) \* 10)
 Next
 Next

 'Tabellensteuerelement von VB
 MSFlexGrid1.Cols = 5
 MSFlexGrid1.Rows = 12

 For r = 1 To 11
 For c = 1 To 4
 MSFlexGrid1.TextMatrix(r, 0) = f(r - 1).Frequenz
 MSFlexGrid1.TextMatrix(r, c) = f(r - 1).Messwert(c - 1)
 Next
 Next
End Sub

Private Sub Command2\_Click()
 'Daten in ein Textfile schreiben
 Dim na As String
 Dim ff As Integer
 na = 'C:\Test.txt'
 ff = FreeFile
 Open na For Binary As #ff
 Put #ff, , f()
 Close #ff
End Sub

Private Sub Command3\_Click()
 'Daten aus Textfile lesen und anzeigen
 Dim r As Integer, c As Integer
 Dim na As String
 Dim ff As Integer
 na = 'C:\Test.txt'
 ff = FreeFile
 ReDim f(FileLen(na) / 20) '20Bytes = 5\*4 Bytes
 Open na For Binary As #ff
 Get #ff, , f()
 Close #ff

 'Tabellensteuerelement von VB
 MSFlexGrid1.Cols = 5
 MSFlexGrid1.Rows = 12

 For r = 1 To 11
 For c = 1 To 4
 MSFlexGrid1.TextMatrix(r, 0) = f(r - 1).Frequenz
 MSFlexGrid1.TextMatrix(r, c) = f(r - 1).Messwert(c - 1)
 Next
 Next
End Sub

Das ist doch recht hübsch? :smile:
(getestet mit VB6)

Gruß, Rainer

Hallo Rainer,

Und Satzweise geht schneller auszulesen als Sequentiell, denn
du sagst dem makro, zeige mir den 3ten, 253ten 503ten satz
usw.

in ein Array mit privaten Typen lesen und schreiben geht noch
schneller und ist auch schön einfach zu handhaben.
Komfortabler wird es kaum gehen.
Die Programmteile der Anzeige im Flexgrid an Excel anpassen
müsstest Du machen, das kann ich nicht.

Kein Problem an sich, ähem was issen ein FlexGrid?
Wenn ich das in Excel finde isses ja gut, wenn nicht habe ich ein Problem.

In dem Zusammenhang, ich las im Internet, ListView bietet andere=bessere Möglichkeiten als ListBox, schön, ich versuchte also in eine Form (in Excel Userform) ein Listview einzubauen, ich konnte es in Excel auch aus der Liste der Steuerelemente auswählen, aber danach war Schluß, ich konnte es nicht einfügen usw.
Kam irgendeine bescheuerte fehlermeldung :frowning:

Braucht man dafür einen speziellen Verweis o.ä.?

Und das Gleiche könnte ja mit dem FlexGrid Element passieren *noch nicht probiert*

Nach dem Kirchgang ist man schlauer, naja, she ich nicht unbedingt so, ich teste deinen Code, danach weiß ich was der Code bewirkte, ob ich dadurch schlauer wurde, naja :smile:

Gruß
Reinhard

Hallo Reinhard,

Kein Problem an sich, ähem was issen ein FlexGrid?

das sieht etwa aus, wie das Tabellenblatt in Excel.

Wenn ich das in Excel finde isses ja gut, wenn nicht habe ich
ein Problem.

Nein, da sind X-Y-Koordinaten (r wie Row, c wie Col), damit solltest Du die Werte in Zellen von Excel bekommen.

In dem Zusammenhang, ich las im Internet, ListView bietet
andere=bessere Möglichkeiten als ListBox, schön, ich versuchte
also in eine Form (in Excel Userform) ein Listview einzubauen,
ich konnte es in Excel auch aus der Liste der Steuerelemente
auswählen, aber danach war Schluß, ich konnte es nicht
einfügen usw.
Kam irgendeine bescheuerte fehlermeldung :frowning:

Braucht man dafür einen speziellen Verweis o.ä.?

Nein, nur die richtige Syntax, aber die ist nicht so einfach.

Und das Gleiche könnte ja mit dem FlexGrid Element passieren
*noch nicht probiert*

Du sollst ja auch ins Worksheet schreiben und nicht ins Flexgrid, nur kann ich das nicht. :smile:

Nach dem Kirchgang ist man schlauer, naja, she ich nicht
unbedingt so, ich teste deinen Code, danach weiß ich was der
Code bewirkte, ob ich dadurch schlauer wurde, naja :smile:

Sieh’s noch mal an, die Variante ist schön. :smile:

Gruß, Rainer

Danke,
dass bringt mich schon um einiges weiter!
werd mich morgen mal hinsetzen und die zwei Programme anpassen, testen und so wie ich´s seh das beste aus beiden zusammenschreiben!

Das foundfiles und das Flexgrid in Verbindung mit dem eigenen Typ gefällt mir, kenne das letzte (typ) schon aus C, wäre aber nicht auf die Idee gekommen das hier anzuwenden.

Bei Command3_Click muß aber der Befehl für FlexGrid und f() umgedreht werden!

morgen mittag dürfte ich dann die ersten Ergebnisse haben und werd mich dann auch wieder melden!

Gruß zondan

Hallo,

dass bringt mich schon um einiges weiter!

das freut mich.

Das foundfiles und das Flexgrid in Verbindung mit dem eigenen
Typ gefällt mir, kenne das letzte (typ) schon aus C, wäre aber
nicht auf die Idee gekommen das hier anzuwenden.

*gg* Das hat sich angeboten fand ich, so kann man das Array so schön bequem weg schreiben und lesen.

Bei Command3_Click muß aber der Befehl für FlexGrid und f()
umgedreht werden!

Wenn Du die Daten aus dem Tabellenblatt in das Array übertragen und sichern möchtest, ja.

morgen mittag dürfte ich dann die ersten Ergebnisse haben und
werd mich dann auch wieder melden!

Das wäre schön, würde mich freuen.
Der Code ist aber wie gesagt aus VB6, wie viel davon 1:1 nach VBA übertragbar ist, weiß ich nicht genau, die Gemeinsamkeiten sind aber schon sehr groß. :smile:

Gruß, Rainer

hab´s noch nicht ausgeführt, (die Verweise stimmen ja nicht) aber er hat nur bei den ’ gemeckert, da will er "

Das hatte ich heut morgen schon geschrieben, mußte dann aber weg bevor ich fertig war! jetzt ist es zwa rnichtmehr ganz aktuell, aber der Vollständigkeit halber:

Zu den Messreihen,diese sind unterschiedlich lang, die längste hat insgesamt ~41000 (~6,2GB) Dateien die kleinste 3560 (~500MB) aber da kommen im Lauf der Zeit sicher noch größere und kleinere dazu!
Jeder „Datensatz“ besteht aus:

7 Messdateien a 4 Messwerten über je 1000Frequenzen ich brauch nur jede 4te auszuwerten! (die Frequenzen stehen 4x in jeder Datei (A,C,E,G) das macht das Oszi immer so!)
1Messdatei mit „Umweltdaten“

Also die große Messreihe besteht aus ~5100 Datensätzen

Alle Dateien einer Messreihe liegen in einem Ordner!
Den Code zum „eingeben“ des Pfades hat mir Thomas Ramel schon etwas weiter unten gegeben!

Die Dateien heißen dann Datum_Kanal_1_400Mhz.xls, … , Datum_Kanal_7_400Mhz.
und Datum_Temp.xls

bisher lese ich (zum Test) die Dateiname eines Kanals in eine Spalte ein, (sortiere ihn zur Sicherheit) und las mir dann die Messwert bei den ersten 10 Frequenzen daneben schreiben

das ganze läuft auf Standard PC´s / Laptops

Das mit dem Ramdrive war auch nur so ne Idee, dann muß ich das aber mit meinem Programm erstellen und wieder löschen! Könnte dazu ja zwei kleine C Progs schreiben (?) naja, erstmal muß das Grundprogramm laufen! Das kann ich später immer noch einbauen!

Hallo,

hab´s noch nicht ausgeführt, (die Verweise stimmen ja nicht)
aber er hat nur bei den ’ gemeckert, da will er "

das steht da im Original auch, das hat w-w-w zerbröselt, ist der Bug also wieder da. das werde ich gleich noch mal im richtigen Brett schreiben.

Zu den Messreihen,diese sind unterschiedlich lang, die längste
hat insgesamt ~41000 (~6,2GB) Dateien die kleinste 3560
(~500MB) aber da kommen im Lauf der Zeit sicher noch größere
und kleinere dazu!
Jeder „Datensatz“ besteht aus:

7 Messdateien a 4 Messwerten über je 1000Frequenzen ich brauch
nur jede 4te auszuwerten! (die Frequenzen stehen 4x in jeder
Datei (A,C,E,G) das macht das Oszi immer so!)
1Messdatei mit „Umweltdaten“

Also die große Messreihe besteht aus ~5100 Datensätzen

Alle Dateien einer Messreihe liegen in einem Ordner!
Den Code zum „eingeben“ des Pfades hat mir Thomas Ramel schon
etwas weiter unten gegeben!

Die Dateien heißen dann Datum_Kanal_1_400Mhz.xls, … ,
Datum_Kanal_7_400Mhz.
und Datum_Temp.xls

bisher lese ich (zum Test) die Dateiname eines Kanals in eine
Spalte ein, (sortiere ihn zur Sicherheit) und las mir dann die
Messwert bei den ersten 10 Frequenzen daneben schreiben

das ganze läuft auf Standard PC´s / Laptops

Das mit dem Ramdrive war auch nur so ne Idee, dann muß ich das
aber mit meinem Programm erstellen und wieder löschen! Könnte
dazu ja zwei kleine C Progs schreiben (?) naja, erstmal muß
das Grundprogramm laufen! Das kann ich später immer noch
einbauen!

Die Info wird Reinhard helfen ich kann da nichts testen, ich habe kein Excel. Nur an den Stellen, wo VB helfen kann, kann ich etwas dazu sagen, deshalb hat Reinhard ja ‚gerufen‘. :smile:

Gruß, Rainer

Hallo Rainer,
bcc: Thomas

Kein Problem an sich, ähem was issen ein FlexGrid?

das sieht etwa aus, wie das Tabellenblatt in Excel.

ich hatte den Code nicht genauer angeschaut, du hattest es ja sogar reingeschrieben, danach zu Hause war alles klar mit dem Flexgrid.

In dem Zusammenhang, ich las im Internet, ListView bietet
andere=bessere Möglichkeiten als ListBox, schön, ich versuchte
also in eine Form (in Excel Userform) ein Listview einzubauen,
ich konnte es in Excel auch aus der Liste der Steuerelemente
auswählen, aber danach war Schluß, ich konnte es nicht
einfügen usw.
Kam irgendeine bescheuerte fehlermeldung :frowning:

Braucht man dafür einen speziellen Verweis o.ä.?

Nein, nur die richtige Syntax, aber die ist nicht so einfach.

Gut, demnächst neuer Versuch, dazu warte ich ab bis mal wieder eine Anfrage zu Listbox kommt, dann habe ich was konkretes zum Üben.

Sieh’s noch mal an, die Variante ist schön. :smile:

Ja, schön kurz und clever. Richtig umsetzen konnte ich sie noch nicht so ganz.

Ich habe nachfolgend etwas gebastelt, aber ist mir alles nicht kurz gelungen, eher aufwendig, aber funktioniert, naja so einigermaßen.

ExcelDateienErzeugen() erzeugt im angegeben Testverzeichnis x Dateien mit jeweiligen Namen „Datei0000x.xls“

Freq2Txt() erzeugt 250 Textdateien mit jeweils x Zeilen und dem Namen Freq00x.txt

Txt2xls() erzeugt aus den Dateien Freq00x.txt 250 Exceldateien mit dem Namen Freq00x.xls

Ein Problem mit der Bytelänge von „Satz“ habe ich noch,
Option Base 1
Private Type Satz
Frequenz As Byte
Messwert(4) As Single
End Type

Nach meiner Berechnung müßte ein Satz 17 Bytes groß sein.
100 Sätze in Freq00x.txt ergeben die Dateigröße 2100 Bytes, was ja auf eine Satzlänge von 21 deutet.

mache ich es so:
Option Base 1
Private Type Satz
Messwert(4) As Single
End Type
ist das meinem Code egal, die Dateigröße bliebt bei 2100 Bytes.

Gruß
Reinhard

Option Explicit
Option Base 1
Private Type Satz
 Frequenz As Byte
 Messwert(4) As Single
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias \_
 "RtlMoveMemory" (lpTo As Any, lpFrom As Any, \_
 ByVal lLen As Long)
'
Private Sub Command1\_Click()
Dim aa$, l&
Open "DeinFile" For Binary As #1
aa = Input(LOF(1), #1)
Close #1
 l = Len(aa) - 1
 ReDim b(0 To l)
 Call CopyMemory(b(0), ByVal aa, l + 1)
End Sub
'
Sub Freq2Txt()
Dim a(100, 250) As Satz, b(250, 100) As Satz, N As Integer, Z As Byte, S As Byte
Dim W As Byte, Bereich, Satzkurz As Satz, FF
On Error GoTo Fehler
Application.ScreenUpdating = False
With Application.FileSearch
 .NewSearch
 .LookIn = "C:\FreqTest"
 .SearchSubFolders = False
 .FileType = msoFileTypeExcelWorkbooks
 .Execute
 For N = 1 To .FoundFiles.Count
 Application.StatusBar = "Lese Datei " & N & " / " & .FoundFiles.Count
 Workbooks.Open .FoundFiles(N)
 Bereich = Range("A1:E250")
 For Z = 1 To 250
 Satzkurz.Frequenz = Bereich(Z, 1)
 For S = 1 To 4
 Satzkurz.Messwert(S) = Bereich(Z, S + 1)
 Next S
 a(CByte(Mid(ActiveWorkbook.Name, 6, 5)), Z) = Satzkurz
 Next Z
 ActiveWorkbook.Close savechanges:=False
 Next N
 'Call CopyMemory(b, ByVal a, 10 \* 250 \* 4) 'schhade klappt nicht
 For Z = 1 To 250
 Application.StatusBar = "Schreibe Datei " & Z & " / " & 250
 FF = FreeFile
 Open "C:\FreqTest\Freq" & Right("000" & Z, 3) & ".txt" For Binary As #FF
 For N = 1 To .FoundFiles.Count ' 14.000 ?
 Put #FF, , a(N, Z)
 Next N
 Close #FF
 Next Z
End With
Fehler:
 Application.StatusBar = ""
 Application.ScreenUpdating = True
End Sub
'
Sub Txt2xls()
Dim N As Integer, Anz, FF, a(100) As Satz, Z, S, Merker, Freq
Const Pfad As String = "C:\FreqTest\"
'On Error GoTo Fehler
Application.ScreenUpdating = False
Merker = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
With Application.FileSearch
 .NewSearch
 .LookIn = "C:\FreqTest"
 .SearchSubFolders = False
 .FileType = msoFileTypeAllFiles
 .Execute
 For N = 1 To .FoundFiles.Count ' 14.000 ?
 If Right(Dir(.FoundFiles(N)), 4) = ".txt" Then
 Anz = Anz + 1
 Application.StatusBar = "Lese/Schreibe Datei " & Anz & " / " & 250
 Freq = Mid(Dir(.FoundFiles(N)), 6, 5)
 FF = FreeFile
 ReDim f(FileLen(.FoundFiles(N)) / 20) As Satz '20Bytes = 5\*4 Bytes
 Open .FoundFiles(N) For Binary As #FF
 Get #FF, , f()
 Close #FF
 Workbooks.Add
 For Z = 1 To UBound(f, 1)
 Cells(Z, 1) = f(Z).Frequenz
 For S = 1 To 4
 Cells(Z, S + 1) = f(Z).Messwert(S)
 Next S
 Next Z
 Application.DisplayAlerts = False
 ActiveWorkbook.SaveAs FileName:=Pfad & "Freq" & Mid(Dir(.FoundFiles(N)), 5, 3)
 ActiveWorkbook.Close
 Application.DisplayAlerts = True
 End If
 Next N
End With
Fehler:
 Application.DisplayAlerts = True
 Application.StatusBar = ""
 Application.SheetsInNewWorkbook = Merker
 Application.StatusBar = ""
 Application.ScreenUpdating = True
End Sub
'
Sub ExcelDateienErzeugen()
Dim N As Byte, Merker As Byte, Z As Byte, S As Byte
Const Anz As Byte = 100, Pfad As String = "C:\FreqTest\"
On Error GoTo Fehler
Application.ScreenUpdating = False
Merker = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
For N = 1 To Anz
 Application.StatusBar = "Erzeuge Datei " & N & " / " & Anz
 Workbooks.Add
 With ActiveSheet
 For Z = 1 To 250
 .Cells(Z, 1) = Z
 For S = 2 To 5
 .Cells(Z, S) = CSng(Rnd() \* 100)
 Next S
 Next Z
 End With
 ActiveWorkbook.SaveAs FileName:=Pfad & "Datei" & Right("00000" & N, 5)
 ActiveWorkbook.Close
Next N
MsgBox "done"
Fehler:
 Application.StatusBar = ""
 Application.ScreenUpdating = True
 Application.SheetsInNewWorkbook = Merker
End Sub

Hallo Reinhard,

alles klar mit dem Flexgrid.

OK. :smile:

Ein Problem mit der Bytelänge von „Satz“ habe ich noch,
Option Base 1
Private Type Satz
Frequenz As Byte

As Byte? Kann die Frequenz nur Ganzzahlige Werte zwischen 0 und 255 annehmen?

Messwert(4) As Single
End Type

Nach meiner Berechnung müßte ein Satz 17 Bytes groß sein.

Du hast .Messwert(4) geschrieben. Fang ruhig wieder bei Null mit zählen an. Du hast 5 Messwerte, 21 Bytes und einen Messwert zu viel. :smile:
Wenn Du bei 1 anfangen möchtest:
.Messwert(1 to 4) und dann sind es auch 17 Bytes. Da warst Du nicht fit genug, Du brauchst das Wochenende. :smile:

Gruß, Rainer

Hallo Rainer

Ein Problem mit der Bytelänge von „Satz“ habe ich noch,
Option Base 1
Private Type Satz
Frequenz As Byte

As Byte? Kann die Frequenz nur Ganzzahlige Werte zwischen 0
und 255 annehmen?

Öhm, ja, gibt nur Frequenznummern von 1 bis 250. Die dazugehörigen Hertzwerte hole ich dann aus einer Extratabelle *rausred* :smile:)

Messwert(4) As Single
End Type

Nach meiner Berechnung müßte ein Satz 17 Bytes groß sein.

Du hast .Messwert(4) geschrieben. Fang ruhig wieder bei Null
mit zählen an. Du hast 5 Messwerte, 21 Bytes und einen
Messwert zu viel. :smile:

Option Base 1 greift nicht?

Wenn Du bei 1 anfangen möchtest:
.Messwert(1 to 4) und dann sind es auch 17 Bytes. Da warst Du
nicht fit genug, Du brauchst das Wochenende. :smile:

Ich hatte 1 to 4 auch probiert, klappte auch irgendwie nicht, ich habe das alles vorhin mit heißer Nadel gestrickt, muß das noch exakter überprüfen.

Mein Ausgangsplan war, alle, sagen wir mal 14000 Dateien einer Messreihe, die mal angenommen immer 250 Zeilen (die Frequenzen) haben mit jeweils 5 Spalten (Frequenz,Wert1,wert2,wert3,wert4)
nacheinander in die Variable a() einzulesen.

a() wird wie folgt dimensioniert/deklariert
(wie heißt es eigentlich in VB genau, definieren oder deklarieren?, Dim deutet auf Dimensionieren, was ist dann variablen deklarieren?)

Option Base 1
Dim a(14000,250,5)

Nun hat mich ja Axel/Alex hier auf APi-CopyMemory hingewiesen um z.B die Arraystruktur zu ändern und auch netterweise ein Beispiel gebracht.

Nur, ich kriege

Dim b(250,14000,5)
Call CopyMemory (b,a,14000*250*5*4) 'alles als Single=4Bytes pro Wert

nicht zum Laufen, auch nicht als Call Copymemory (b(),ByVal a(),14000*250*5*4) und allem was mir so einfiel den Term zu ändern:frowning:

Siehst du, gibst eine, Möglichkeit a nach b zu transponieren?

Danke ^ Gruß
Reinhard

Hallo Zondan,

Zu den Messreihen,diese sind unterschiedlich lang, die längste
hat insgesamt ~41000 (~6,2GB) Dateien die kleinste 3560
(~500MB) aber da kommen im Lauf der Zeit sicher noch größere
und kleinere dazu!
Alle Dateien einer Messreihe liegen in einem Ordner!

Okay, es gibt also x Messreihen und dementsprechend x Unterordner.
Dazu kommen bedeutet, es kommen neue Messreihen/Ordner dazu, aber bestehende Ordnerinhalte werden nicht geändert?

Jeder „Datensatz“ besteht aus:

7 Messdateien a 4 Messwerten über je 1000Frequenzen ich brauch
nur jede 4te auszuwerten! (die Frequenzen stehen 4x in jeder
Datei (A,C,E,G) das macht das Oszi immer so!)
1Messdatei mit „Umweltdaten“
Also die große Messreihe besteht aus ~5100 Datensätzen

Mir scheint unsre jeweilige Definition eines Datensatzes ist eweng unterschiedlich :smile:
Was soll mir die Information mit der Datei "Umweltdaten sagen? Was soll ich mit dieser Datei tun?

Oben stand, die größte Messreihe besteht aus 41000 Dateien.
Jetzt sagst du sie besteht aus 5100 „Datensätzen“.

Jede einzelne Datei einer messreihe/ordner besteht aus 1000 benutzten Zeilen, von denen du jede 4te Zeile brauchst?
Aber das macht irgednwie auch keinen Sinn mit deinen Spaltenangaben A,C,E,G :frowning:

Ergo, ich habs immer noch nicht kapiert.

Den Code zum „eingeben“ des Pfades hat mir Thomas Ramel schon
etwas weiter unten gegeben!

Dumm gelaufen, mir wärs lieber ich hätte dir da mit dem Pfad geholfen und Thomas hätte sich hier involviert :smile:)

Die Dateien heißen dann Datum_Kanal_1_400Mhz.xls, … ,
Datum_Kanal_7_400Mhz.
und Datum_Temp.xls

Sollen das die vorhanden Dateinamen pro Messreihenordner sein?
Was soll ich mit Datum_Temp.xls tun?
Datum_Kanal_1_400Mhz.xls bzw Datum_Kanal_7_400Mhz.xls irritieren mich als Bezeichnungen von Dateien einer Messreihe in einem Ordner
Datum1.xls, Datum2.xls hätte ich ja kapiert.

bisher lese ich (zum Test) die Dateiname eines Kanals in eine
Spalte ein, (sortiere ihn zur Sicherheit) und las mir dann die
Messwert bei den ersten 10 Frequenzen daneben schreiben

?

das ganze läuft auf Standard PC´s / Laptops

aaaah, das verstehe ich *gg*

Das mit dem Ramdrive war auch nur so ne Idee, dann muß ich das
aber mit meinem Programm erstellen und wieder löschen! Könnte
dazu ja zwei kleine C Progs schreiben (?) naja, erstmal muß
das Grundprogramm laufen! Das kann ich später immer noch
einbauen!

Ramdrive kommt dann später als i-Tüpfelchen …

Gruß
Reinhard

Hallo Reinhard,

Öhm, ja, gibt nur Frequenznummern von 1 bis 250.

Dann ist das OK. Ich hatte angenommen, daß auch Werte von 423,7Hz vorkommen können. Hab’ ich eben falsch geraten. :smile:

Option Base 1 greift nicht?

oops. Das habe ich übersehen, weil ich es nicht kannte. Das habe ich für Exceltypisch gehalten und beim Lesen ignoriert. Ich habe es mir gerade in der Hilfe angesehen … Und habe jetzt auch keine Ahnung mehr, warum Du 21 Bytes hast. Hast Du mal Option Base 1 weg gelassen und Null bis Drei dimensioniert? Bei mir hat die Berechnung nämlich gepasst.

Ich hatte 1 to 4 auch probiert, klappte auch irgendwie nicht,
ich habe das alles vorhin mit heißer Nadel gestrickt, muß das
noch exakter überprüfen.

Ich habe zur Zeit keine Erklärung.

Mein Ausgangsplan war, alle, sagen wir mal 14000 Dateien einer
Messreihe, die mal angenommen immer 250 Zeilen (die
Frequenzen) haben mit jeweils 5 Spalten
(Frequenz,Wert1,wert2,wert3,wert4)
nacheinander in die Variable a() einzulesen.

14000 X 250 X 20 = 70Mio, 70MB Du hast genug Speicher? :smile:

a() wird wie folgt dimensioniert/deklariert
(wie heißt es eigentlich in VB genau, definieren oder
deklarieren?, Dim deutet auf Dimensionieren, was ist dann
variablen deklarieren?)

Deklarieren denke ich, aber ist das nicht egal?

Option Base 1
Dim a(14000,250,5)

As Variant? Drei Dimensionen? Hier stimmt etwas nicht.

Nun hat mich ja Axel/Alex hier auf APi-CopyMemory hingewiesen
um z.B die Arraystruktur zu ändern und auch netterweise ein
Beispiel gebracht.

Mit CopyMemory die Struktur ändern? Du weißt was CopyMemory tut? Damit kopierst Du den Inhalt des Arbeitsspeichers ab einer bestimmten Adresse mit einer angegebenen Anzahl Bytes an eine andere Adresse. Aus einem Array in eine Variable oder ein anderes Array zum Beispiel.

Nur, ich kriege

Dim b(250,14000,5)
Call CopyMemory (b,a,14000*250*5*4) 'alles als Single=4Bytes
pro Wert

Syntax-Fehler :smile:
Call CopyMemory (b(1),a(1),14000*250*5*4)
Du hast nur den Namen angegeben, aber denn Index vergessen.

Ich versuche gerade mir vorzustellen, was dabei herauskommt … Gelingt mir nicht, ich fürchte, Chaos. Ich probiere jetzt nicht, ich warte mal, was Du schreibst. :smile:

Gruß, Rainer

eine Messreihe wir nichtmehr verändert!
das Programm soll eigentlich immer nur für eine Messreihe verwendet werden!
In den „Umweltdaten“ steht in einer Celle die Temperatur, um diese Daten kümmere ich mich später, momentan versuch ich erstmal die anderen Daten zu „verarbeiten“

Ok, dann versuch ich es nochmal anders zu erklären!
insgesamt besteht die Messreihe aus ~41000 Datein
jeweils 8 gehören zu einer Uhrzeit (-> ein Datensatz)
die 7 Messwertdateien sind so aufgebaut
Spalte A,C,E,G jeweils die Frequenz (ist in einer Messreihe immer die gleiche)
in den Spalten B,D,F,H stehen jeweils die gemessenen Werte.
in der Umweltdatei steht in einer Celle die Temperatur (wie gesagt, die kommt später dran!)

Die Dateien heißen dann Datum_Kanal_1_400Mhz.xls, … ,
Datum_Kanal_7_400Mhz.
und Datum_Temp.xls

Sorry, Datum ist ein Platzhalter für TT_MM_JJJJ__HH_MM_SS
da seh ich grad, ich muß das ganze dann nach dem Erstellungsdatum sortieren!
Alle Dateien einer Messreihe sind in einem Ordner!

bisher lese ich (zum Test) die Dateiname eines Kanals in eine
Spalte ein, (sortiere ihn zur Sicherheit) und las mir dann die
Messwert bei den ersten 10 Frequenzen daneben schreiben

ok, über das Stadium bin ich grad raus, muß jetzt nur noch diesen Teil hinbekommen:

Set filess = CreateObject(„scripting.filesystemobject“)
Set nfile = filess.createtextfile(pfad & „daten.txt“, True)
ff = FreeFile
t = pfad & „daten.txt“
Open t For Binary Access Write As #ff
Put #ff, , daten()
Close #ff

irgendwie darf ich da nicht reinschreiben „Zugriff verweigert“
hab die Datei gelöscht, dann den Code ausgeführt -> Fehlermeldung Datei ist aber erstellt worden. Da fehlt irgendwas! werd mal im vbarchiv nachschauen, da stand auch einiges darüber drin!

Ramdrive kommt dann später als i-Tüpfelchen …

genau!

Danke!!!

Meld mich sobald ich das aktuelle Problem gelöst hab!

Hallo Reinhard,

mal eine ganz andere Frage zu der eigentlichen Programmieraufgabe hier.

habe ich das richtig verstanden, daß nur werte aus einigen Exceltabellen zusammen in ein Textfile geschrieben werden sollen?

Gibt es in Excel eine FileListBox?

Dann wüdre mein Vorschlag etwa so aussehen:

Option Explicit

Private Sub Command1\_Click()
 Dim ff As Integer
 Dim Ziel As String
 Dim xl As String
 File1.Pattern = '\*.xls'
 Ziel = 'C:\Zielfile.txt'
 ff = FreeFile
 Open Ziel For Output As #ff
 For i = 0 To File1.ListCount - 1
 xl = File1.List(i)
 'Exceltabelle laden
 For r = 1 To Zeilen\_in\_Exceltabelle
 Print #ff, CStr(Frequenz\_in\_Zeile(r)) & Chr(9) & CStr(Letzter\_Messwert\_in\_Zeile(r))
 Next
 Next
 Close #ff
End Sub

Ohne Filelistbox kann ich den Vorschlag ja mal noch nach FSO umschreiben … Ist passiert, FSO-Variante:

Private Sub Command2\_Click()

Dim FSO, PathObject, FileObject, FileNow, Quellpfad As String, ed As String
Dim Ziel As String, ff As Integer
 Ziel = 'C:\Zielfile.txt'
 ff = FreeFile
 Open Ziel For Output As #ff

 Quellpfad = 'C:\'

 Set FSO = CreateObject('Scripting.FileSystemObject')

 Set PathObject = FSO.getFolder(Quellpfad)
 Set FileObject = PathObject.Files

 For Each FileNow In FileObject
 ed = Right(FileNow, 4)
 If ed = '.xls' Then
 'Exceltabelle laden, Pfad steht in - FileNow -
 For r = 1 To Zeilen\_in\_Exceltabelle
 Print #ff, CStr(Frequenz\_in\_Zeile(r)) & Chr(9) & CStr(Letzter\_Messwert\_in\_Zeile(r))
 Next
 End If
 Next
 Close #ff
End Sub

Natürlich ungetestet, testen kann ich ohne Excel und ohne den Zugriff auf das Worksheet ja nicht. :smile: ich hoffe aber, daß ich nicht zu vile Fehler eingebaut habe. Daß Anführungszeichen von w-w-w zerbröselt werden ist ja bekannt.

Aber mein alter Vorschlag, die Daten erst in ein Array zu laden gefällt mir gar nicht mehr so gut, man kann die Daten ja auch gleich Zeilenweise in das Textfile schreiben, das ist viel kürzer.

Gruß, Rainer

Hallo Rainer,

Öhm, ja, gibt nur Frequenznummern von 1 bis 250.

Dann ist das OK. Ich hatte angenommen, daß auch Werte von
423,7Hz vorkommen können. Hab’ ich eben falsch geraten. :smile:

Nein, du hattest/hast Recht, auch wenn Zodan von Kanal1,Kanal7 usw spricht, ich ging fälschlicherweise von Freuenz = 1 Hz, 2 Hz usw aus.

Option Base 1 greift nicht?

oops. Das habe ich übersehen, weil ich es nicht kannte. Das
habe ich für Exceltypisch gehalten und beim Lesen ignoriert.
Ich habe es mir gerade in der Hilfe angesehen … Und habe
jetzt auch keine Ahnung mehr, warum Du 21 Bytes hast. Hast Du
mal Option Base 1 weg gelassen und Null bis Drei
dimensioniert? Bei mir hat die Berechnung nämlich gepasst.

Wie gesagt, das teste ich noch, also nachher zu Hause.
PS: Demnächst habe ich zuhause wieder Internet *sehrfreu*, dann kann ich direkter testen.

Ich hatte 1 to 4 auch probiert, klappte auch irgendwie nicht,
ich habe das alles vorhin mit heißer Nadel gestrickt, muß das
noch exakter überprüfen.

Ich habe zur Zeit keine Erklärung.

Ich prüfe meine Aussage nochmal nach, ich weiß genau ich habe 1 To 4 probiert, bin mir auch vollkommen sicher daß dadurch die Byteanzahl auch nicht besser stimmte, mal schauen.

Mein Ausgangsplan war, alle, sagen wir mal 14000 Dateien einer
Messreihe, die mal angenommen immer 250 Zeilen (die
Frequenzen) haben mit jeweils 5 Spalten
(Frequenz,Wert1,wert2,wert3,wert4)
nacheinander in die Variable a() einzulesen.

14000 X 250 X 20 = 70Mio, 70MB Du hast genug Speicher? :smile:

Ich nicht, aber Excel(2002) funktioniert problemlos bei

Sub ttt()
Dim a(14000, 250, 5) As String * 4
a(13500, 230, 2) = „huhu“
MsgBox a(13500, 230, 2)
End Sub

VB6 nicht?

a() wird wie folgt dimensioniert/deklariert
(wie heißt es eigentlich in VB genau, definieren oder
deklarieren?, Dim deutet auf Dimensionieren, was ist dann
variablen deklarieren?)

Deklarieren denke ich, aber ist das nicht egal?

Ha, vor 20 Jahren mal bei C reingeschnuppert, zwar alles vergessen, aber in C scheint da ein Unterschied zu sein *vergessen welcher*, deshalb wollte ich ja wissen ob VB da einen macht.

Option Base 1
Dim a(14000,250,5)

As Variant? Drei Dimensionen? Hier stimmt etwas nicht.

Wieso? Was hat denn der Variablentyp mit der Anzahl der Dimensionen zu tun.

In den FAQs zu Tabellenkalkulation ist auch der Hinweis auf
http://www.xlam.ch/
,eine Seite die u.a. auch alle bekannten Limitationen von Excel auflistet, da hat sich der Betreiber endlos viel Mühe gemacht das alles rauszufinden und sicher steht da auch wieviele Dimensionen man in Excel nageben kann und auch das mit den 70 Millionen wird da beantwortet, leider hat er soviele Informationen gesammelt, ich gehe da ungern hin, gibt da viel zu viel zu lesen :smile:
Aber sehr schön daß es diese Seite gibt
Ich habe da schon Stunden gelesen, a) lang noch nicht alles, b) natürlich mir nicht alles merken können was ich las *gg*

Nun hat mich ja Axel/Alex hier auf APi-CopyMemory hingewiesen
um z.B die Arraystruktur zu ändern und auch netterweise ein
Beispiel gebracht.

Mit CopyMemory die Struktur ändern? Du weißt was CopyMemory
tut? Damit kopierst Du den Inhalt des Arbeitsspeichers ab
einer bestimmten Adresse mit einer angegebenen Anzahl Bytes an
eine andere Adresse. Aus einem Array in eine Variable oder ein
anderes Array zum Beispiel.

Ja, ich denke/dachte ich hab ein Array, a(5,10), mittels copymemory kann ich das dann in b(10,5) wandeln.
Falsch gedacht?

Nur, ich kriege

Dim b(250,14000,5)
Call CopyMemory (b,a,14000*250*5*4) 'alles als Single=4Bytes
pro Wert

Syntax-Fehler :smile:
Call CopyMemory (b(1),a(1),14000*250*5*4)
Du hast nur den Namen angegeben, aber denn Index vergessen.

*hmmh*, ich will ja nicht a(1) nach b(1) bringen, sondern alles von a nach b, halt anders strukturiert im Array.

Ich versuche gerade mir vorzustellen, was dabei herauskommt
… Gelingt mir nicht, ich fürchte, Chaos.

Richtig befürchtet:smile:

Ich probiere jetzt nicht, ich warte mal, was Du schreibst. :smile:

Hiermit getan.

Gruß
Reinhard

Gruß, Rainer

Sorry, Datum ist ein Platzhalter für TT_MM_JJJJ__HH_MM_SS
da seh ich grad, ich muß das ganze dann nach dem
Erstellungsdatum sortieren!

Hallo Zondan,
jetzt nur dazu.
ich persönlich mag Unterstriche überhaupt nicht.
(Und träume sowieso davon daß es noch die klare 8.3 Dateinamenfestlegung gab.)

Ich weiß nicht was in deiner Beitragsfolge mit Thomas steht,
aber mit
DatName=format(DatumZeit,„yyyy.mm.dd hh:mm:ss“)
DatName=DatName & " Kanal" & kanalnummer

müßtest du es hinkriegen sortieren zu können.

Sicher, Leerzeichen im Dateinamen führen auch zu Problemen, aber die sind halt mir lieber als Unterstriche.

Gruß
Reinhard

Hallo Reinhard,

Ich nicht, aber Excel(2002) funktioniert problemlos bei

Sub ttt()
Dim a(14000, 250, 5) As String * 4
a(13500, 230, 2) = „huhu“
MsgBox a(13500, 230, 2)
End Sub

VB6 nicht?

Das hängt vom Recner ab. Auf ‚der großen Kiste‘ mit 2GB darf das kein Problem sein, mein Schleppi mit 256MB wird aber dicke Backen machen, fürchte ich, probier ich jetzt aber nicht. :smile:

As Variant? Drei Dimensionen? Hier stimmt etwas nicht.

Wieso? Was hat denn der Variablentyp mit der Anzahl der
Dimensionen zu tun.

Den Speicherbedarf. Arr(1 to 1000) As Byte sind nur 1000 Bytes, As Double aber 8000 Bytes. Was passiert bei Variant? ich habe keine Ahnung, wie viel Speicher dann reserviert wird, aber genug um auch Strings zu verwalten, denke ich. Weil ich wissen will, was passiert, gebe ich den Datentyp immer an, wenn ich ihn weiß. Nur wenn der Quellcode eigentlich aus VBS stammt (wie bei dem Code mit FSO) weiß ich den Datentyp manchmal nicht und lasse ihn weg, wie bei VBS, denn VBS versteht ja keine Datentypen.

In den FAQs zu Tabellenkalkulation ist auch der Hinweis auf
http://www.xlam.ch/
,eine Seite die u.a. auch alle bekannten Limitationen von
Excel auflistet, da hat sich der Betreiber endlos viel Mühe
gemacht das alles rauszufinden und sicher steht da auch
wieviele Dimensionen man in Excel nageben kann und auch das
mit den 70 Millionen wird da beantwortet, leider hat er
soviele Informationen gesammelt, ich gehe da ungern hin, gibt
da viel zu viel zu lesen :smile:
Aber sehr schön daß es diese Seite gibt
Ich habe da schon Stunden gelesen, a) lang noch nicht alles,
b) natürlich mir nicht alles merken können was ich las *gg*

*gg* Für mich ist das nichts, weil ich nichts ausprobieren kann, ich habe ja kein Excel. :smile:

Ja, ich denke/dachte ich hab ein Array, a(5,10), mittels
copymemory kann ich das dann in b(10,5) wandeln.
Falsch gedacht?

Nicht getestet, aber ich denke schon, daß das geht. Nur was kommt dabei heraus? Ich versuche das mal mit 2 X 3.

Wenn in Arr(2,3)
Arr(1,1)=1
Arr(1,2)=2
Arr(1,3)=3
Arr(2,1)=4
Arr(2,2)=5
Arr(2,3)=6
steht, steht im Speicher vermutlich 1,2,3,4,5,6.
Nach 3,2 konvertiert steht dann da
Arr(1,1)=1
Arr(1,2)=2
Arr(2,1)=3
Arr(2,2)=4
Arr(3,1)=5
Arr(3,2)=6
Kann man mit den Daten etwas anfangen? a(1,3) ist ja dann nicht b(3,1) sondern b(2,1). Irgendwie stehe ich auf dem Schlauch und verstehe den Sinn nicht.

Nur, ich kriege

Dim b(250,14000,5)
Call CopyMemory (b,a,14000*250*5*4) 'alles als Single=4Bytes
pro Wert

Syntax-Fehler :smile:
Call CopyMemory (b(1),a(1),14000*250*5*4)
Du hast nur den Namen angegeben, aber denn Index vergessen.

*hmmh*, ich will ja nicht a(1) nach b(1) bringen, sondern
alles von a nach b, halt anders strukturiert im Array.

a(1) und b(1) sind Adressen im Speicher. Du könntest auch in einem Array etwas verschieben. Wenn Du z.B. in einem Bytearray die ersten drei Bytes killen willst, kannst Du
Call CopyMemory (a(1),a(4),UBound(a)-4)
alle Bytes ab den vierten an die Adresse ab dem ersten schreiben und damit alle in einem Rutsch um vier Stellen nach unten verschieben.
Als Schleife:

For i=4 to uboud(a)
a(i-4)=a(i)
Next

In Assembler gibt es einen Befehl, der nicht nur einzelne Bytes kopieren kann, sondern ganze Blöcke von Bytes. Der wird von CopyMemory genutzt, deshalb gest das so schnell. a(1) ist nur ein Pointer, der auf eine Adresse im Speicher zeigt. Du kannst das Array auch in einen String oder eine Variable schreiben, da ist die Syntax durchsichtiger:

myStr = " "
CopyMemory ByVal StrPtr(myString) + Pos, ByVal VarPtr(DobleWert), 8

Die acht Bytes eines Double werden in einen String geschrieben, jedes Zeichen im String ist zwei Bytes lang.

Gruß, Rainer

Hallo Rainer,

habe ich das richtig verstanden, daß nur werte aus einigen
Exceltabellen zusammen in ein Textfile geschrieben werden
sollen?

tja nun, ich habe da sowieso noch massivste Verstehensprobleme, aber ich gehe noch davon aus, aus x Dateien mit gleichem Aufbau sollen jeweils die Messwerte für bekannte 250 Frequenzen ausgelesen werden und dann pro Frequenz eine Textdatei mit den Messwerten für diese Frequenz angelegt werden, x wäre dann die Anzahl der Datensätze in diesen Textdateien.

Gibt es in Excel eine FileListBox?

Leider nein.

Ohne Filelistbox kann ich den Vorschlag ja mal noch nach FSO
umschreiben … Ist passiert, FSO-Variante:
Private Sub Command2_Click()

Dim FSO, PathObject, FileObject, FileNow, Quellpfad As String,
ed As String
Dim Ziel As String, ff As Integer
Ziel = ‚C:\Zielfile.txt‘
ff = FreeFile
Open Ziel For Output As #ff

Quellpfad = ‚C:‘

Set FSO = CreateObject(‚Scripting.FileSystemObject‘)

Set PathObject = FSO.getFolder(Quellpfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
ed = Right(FileNow, 4)
If ed = ‚.xls‘ Then
'Exceltabelle laden, Pfad steht in - FileNow -
For r = 1 To Zeilen_in_Exceltabelle
Print #ff, CStr(Frequenz_in_Zeile®) & Chr(9)
& CStr(Letzter_Messwert_in_Zeile®)
Next
End If
Next
Close #ff
End Sub

Natürlich ungetestet, testen kann ich ohne Excel und ohne den
Zugriff auf das Worksheet ja nicht. :smile: ich hoffe aber, daß
ich nicht zu vile Fehler eingebaut habe. Daß Anführungszeichen
von w-w-w zerbröselt werden ist ja bekannt.

Ebenfalls nicht getestet, aber der Debugger wid sicher bei Zeilen_in_Exceltabelle rummotzen :smile:
Ich denke, lassen wir erst mal Zodan wieder antworten für das Problem.
Das mit der Satzlänge von „Satz“ schaue ich mir natürlich trotzdem an.

Aber mein alter Vorschlag, die Daten erst in ein Array zu
laden gefällt mir gar nicht mehr so gut, man kann die Daten ja
auch gleich Zeilenweise in das Textfile schreiben, das ist
viel kürzer.

Mit Sicherheit richtig, aber schau mal meine Frage:

@Zodan, willst du eigentlich als Endergebnis Textfiles für jede Frequenz, oder gleich Exceldateien?

Gruß
Reinhard