Anzeige
Archiv - Navigation
664to668
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
664to668
664to668
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Datenübernahme / -übergabe Blatt <> Datenfeld

Datenübernahme / -übergabe Blatt <> Datenfeld
09.09.2005 10:59:22
Stefan
Hallo Excelgemeinde,
Da ich oft größere Datenmengen aus Arbeitsblättern in Arrays oder Collections einlese, benötige ich dafür schnelle Zugriffe.
Bisher habe ich folgende Routine verwendet:
Public

Sub Daten_schreiben_1()
Dim intFeld(1 To 10000, 1 To 100) As Integer
Dim dtmStart As Date
Dim lngZeile As Long
Dim intSpalte As Integer
dtmStart = Now
For lngZeile = 1 To 10000
For intSpalte = 1 To 100
Cells(lngZeile, intSpalte) = intFeld(lngZeile, intSpalte)
Next intSpalte
Next lngZeile
MsgBox "Laufzeit: " & (Now - dtmStart) * 24 * 60 * 60 & " Sekunden."
End Sub

Bei mir dauert das schreiben in ein Blatt damit 683 Sekunden und selbst mit Application.Calculation = xlCalculationManual und Application.ScreenUpdating = False immer noch 113 Sekunden.
Jetzt hat Nepumuk mich auf folgendes geniale Scipt gebracht:
Public

Sub Daten_lesen_2()
Dim intFeld(1 To 10000, 1 To 100) As Integer
Dim dtmStart As Date
dtmStart = Now
intFeld = Range("A1:CV10000")
MsgBox "Laufzeit: " & (Now - dtmStart) * 24 * 60 * 60 & " Sekunden."
End Sub

Nunmehr benötige ich noch 2 Sekunden.
Nun meine Fragen:
1) gibt es einen ähnlich effizieten Befehl für das Schreiben von Daten in Blätter (meine Routine benötigt dazu 42 Sekunden). Eine Umkehr des Befehls in
intFeld=Range("A1:CV10000") führt zu dem Hinweis "Keine Zuweisung an Datenfeld möglich"
2) kann ich einer Datensammlung auf ähnlich effiziente Weise Werte zuweisen oder auslesen ?
Danke für Eure Tipps.
Stefan.

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:04:46
MichaV
Hallo Stefan,
"gibt es einen ähnlich effizieten Befehl für das Schreiben von Daten in Blätter"
Warum soll das nicht funzen?

Option Explicit
Sub Daten_schreiben_2()
Dim intFeld(1 To 10000, 1 To 100) As Integer
Dim dtmStart As Date
dtmStart = Now
Range("A1:CV10000") = intFeld  '<--- meinst Du das?
MsgBox "Laufzeit: " & (Now - dtmStart) * 24 * 60 * 60 & " Sekunden."
End Sub

Gruss- Micha
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:09:38
Stefan
Hallo Micha,
leider ist mir ein Fehler unterlaufen:
die Routine Daten_lesen_2 läuft so nicht:
intFeld=Range("A1:CV10000") wirft einen Fehler aus.
Range("A1:CV10000")=intFeld hingegen funktioniert problemlos.
Stefan.
Anzeige
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:18:50
MichaV
Hallo,
ich hab das "Jetzt hat Nepumuk mich auf folgendes geniale Scipt gebracht:" falsch interpretiert, dachte, daß das Script von Nepumuk ist und habs darum als lauffähig angesehen.
Du musst das Datenfeld als leer und als Variant deklarieren: Dim intFeld()
Dann funzt auch das Einlesen.
Gruss- Micha
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:27:15
Stefan
Hallo Micha,
Danke, dass funktioniert.
Auch hier geht der Zeitbedarf von 42s auf 1s deutlich zurück.
Wie sieht es mit Collections aus?
Sollte man die DAten erst in ein Array lesen und dann in ein Klassenobjekt oder eine Collections-Sammlung übergeben ?
Danke.
Stefan.
Anzeige
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:41:54
MichaV
Hallo,
Dein Feld ist 2- Dimensional, die Collection immer 1-Dimensional. Du musst das also umschaufeln. Das Schaufeln aus einer Feldvariablen, die Du mit einem Schlag eingelesen hast, sollte aber schneller gehen als das Einlesen jedes einzelnen Wertes aus der Tabelle in die Collection.

Option Explicit
Sub Daten_schreiben_2()
Dim x As New Collection
Dim intFeld()
Dim i1 As Integer, i2 As Integer
Dim dtmStart As Date
dtmStart = Now
intFeld = Range("A1:CV10000")
For i1 = 1 To UBound(intFeld, 1)
For i2 = 1 To UBound(intFeld, 2)
x.Add intFeld(i1, i2)
Next
Next
MsgBox "Laufzeit: " & (Now - dtmStart) * 24 * 60 * 60 & " Sekunden."
End Sub

(bei mir 3 Sekunden)
Was Du mit "Einlesen in ein Klassenobject" meinst weiß ich nicht.
Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: -übergabe Blatt <> Datenfeld
09.09.2005 11:55:03
Stefan
Ich habe eine Klasse mit Eigenschaften definiert.
Dazu eine zweite Klasse, die eine Collection der ersten enthält.
Anbei ein Beispiel aus dem Buch von Michael Kofler (ISBN 3-8273-2021-6):
' Klasse XYPoint
Option Explicit
Public x As Double, y As Double
' Klasse XYPoints
Option Explicit
Private points As New Collection
Property Get Count()
Count = points.Count
End Property
Property Get XMean()
Dim p, xm
If points.Count = 0 Then XMean = 0: Exit Property
For Each p In points
xm = xm + p.x
Next
xm = xm / points.Count
XMean = xm
End Property
Public

Function Add(x, y) As XYPoint
Dim xyp As New XYPoint
xyp.x = x
xyp.y = y
points.Add xyp
Set Add = xyp
End Function

'Modul XYTest
Option Explicit

Sub TestXYStatistics()
Dim xypts As New XYPoints
xypts.Add 3, 4
xypts.Add 7, 2
xypts.Add 6, 5
MsgBox xypts.Count & " Punkte sind gespeichert." & _
"Der Mittelwert der X-Komponenten beträgt " & _
xypts.XMean
Set xypts = Nothing
End Sub

Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige