Daten schneller einfügen als per activecell.offset
12.02.2004 13:23:22
Jan
gibt es eine (laufzeitmäßig) schnellere Möglichkeit Daten aus einer Binärdatei (10 Spalten a 4Byte long-Integer) in Zellen einzufügen, als per activecell.offset(..) = ..., siehe Code unten.
Ich lese aus der Datei (FileFS) die Daten Weg h(4) und Kraft h(2) ein und schreibe h(4) in Spalte "spaltem" und h(2) in "spalte" sobald sich die Drehzahl ändert, erhöhe ich "spalte" und "spaltem" um 2, um nachher einfacher die Diagramme erzeugen zu können. Das reine Einlesen der Daten (for-next Schleife) dauert ohne Verarbeitung der Daten nur 1sec. Das Schreiben der Daten in die Excel-Tabelle (alles ab Sprungmarke writeData:) dauert ohne Formatierung 14sec. Kann man diese Zeit für das Schreiben der Daten irgendwie optimieren? Das Teilen von h(2) / 1000# macht keinen messbaren Zeitunterschied.
Besten Dank
Jan Lubina
test = Time
While Not EOF(fileFS)
DoEvents
'10 Spalten a 4Byte (Long-Int) einlesen
For i = 1 To 10
Get #fileFS, , h(i)
'1=Drehzahl /100 = 1/min
'2=Kraft = N
'3=Geschwindigkeit /1000 =m/s
'4=Weg /1000 = mm
'5=Temp / 100 = °C
'6=Zähler
'7=Bit zur Reibschleifenerkennung (1=Reibmessung / 0=Kennungsmessung)
'8=56
'9=57
'10=58
Next i
If h(1) <> ad Or h(7) <> rc Then
'neue Drehzahl (h(1)) oder Reibschleifen-Bit (h(7)) geändert
If h(1) = 0 Then
'Nulldrehzahl am Ende der Datei auslassen
DoEvents
ElseIf h(7) = 1 Then
cnt_rl = 1 'Zähler zur Ermittlung der Anzahl Datenspalten
'Reibschleifenerkennung
'Debug.Print h(6) & " " & h(7) & " " & h(8) & " " & h(9) & " " & h(10)
rc = 1 'Hilfsvariable zur Erkennung der Reibschleife
spalte = 1
'korrekte Reibdrehzahl (wird zu Begin mehrmals überschrieben)
If ad < h(1) Then
ActiveCell.offset(0, 0) = "Reib. " + CStr(CDbl(ad) / 100#)
ActiveCell.offset(0, 1) = "x 1/min"
ActiveCell.offset(1, 0) = "s/mm"
ActiveCell.offset(1, 1) = "F/N"
End If
ad = h(1) 'alte Drehz. mit neuer Drehzahl überschreiben
GoTo writeData
ElseIf h(7) = 0 Then
cnt_rl = cnt_rl + 1
rc = 0
'Normale Drehzahl
'Max. Zeilenanzahl bestimmen
If counter > max Then max = counter
counter = 1
spalte = spalte + 2
spaltem = spalte - 1
'Spaltenüberschriften
ActiveCell.offset(0, spalte - 1) = h(1) / 100#
ActiveCell.offset(0, spalte) = "x 1/min"
ActiveCell.offset(1, spalte - 1) = "s/mm"
ActiveCell.offset(1, spalte) = "F/N"
ad = h(1) 'alte Drehz. mit neuer Drehzahl überschreiben
GoTo writeData
End If
Else
writeData:
'alte Drehzahl
counter = counter + 1
'Geschwingigkeit h(3) uninteressant
'Kraft
ActiveCell.offset(counter, spalte) = h(2)
'### Weg
ActiveCell.offset(counter, spaltem) = h(4) / 1000#
'ActiveCell.offset(counter, spaltem).NumberFormat = "0.00"
End If
Wend
On Error GoTo 0
'Datei schließen
Close
MsgBox (Format(Time - test, "hh:mm:ss"))