Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
684to688
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
684to688
684to688
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Performance in VBA - Zellbezüge & Datenfelder

Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 13:38:39
Alex
Hallo,
ich habe eine kleine Frage zur Performance - vielleicht
kann mir jemand helfen.
Mir ist aufgefallen, das Excel mit Datanfeldern wesentlich
schneller rechnet als mit den Werten von Zellbezügen.
Mitunter hundert Mal so schnell.
z.B läuft diese

Sub :
Option Explicit

Sub Perf_gut()
Dim d(1 To 1000) As Double
Dim c As Long
Dim c2 As Long
Dim w As Worksheet
Set w = ActiveSheet
For c = 1 To 1000
d(c) = w.Cells(c, 1)
Next c
For c = 1 To 1000 - 1
For c2 = c + 1 To 1000
d(c2) = d(c2) + d(c)
Next c2
Next c
For c = 1 To 1000
w.Cells(c, 1) = d(c)
Next c
End Sub

erheblich schneller als diese:

Sub Perf_schlecht()
Dim c As Long
Dim c2 As Long
Dim w As Worksheet
Set w = ActiveSheet
Application.ScreenUpdating = False '24,5
Application.EnableEvents = False '18
Application.Interactive = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False
For c = 1 To 1000 - 1
For c2 = c + 1 To 1000
w.Cells(c2, 1) = w.Cells(c2, 1) + w.Cells(c, 1)
Next c2
Next c
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Interactive = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
End Sub

Trotz der Manipulationen des Application Objects.
Problem bei der 1.

Sub ist aber, das sie doch sehr umständlich
zu programmieren ist.
Hat jemand eine Idee, wie man mit den Zellen in einer Excel-Mappe
genauso schnell rechnen kann, wie mit Datenfeldern? Bzw. den Code
der 2. 

Sub durch weitere Einschränkungen des Application-Object
weiter beschleunigen kann. Oder gibt es eine Einfache Möglichkeit,
Ranges in Datenfelder zu kopieren und umgekehrt?
Für eine Idee wäre ich sehr dankbar.

                    

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 14:50:08
Klaus-Dieter
Hallo Alex,
versuche es mal so:

Sub lesen()
Dim arr As Variant
arr = Range("A1:A20").Value
End Sub


Viele Grüße Klaus-Dieter

Online-Excel
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 14:58:47
andre
Hallo allerseits,
mit dem Vorschlag von Klaus-Dieter sieht das Array etwas seltsam aus - es ist ja ein senkrechtes! (waagerecht gehts)
Mach's mal so:


Sub Perf_sehrgut()
    Dim d 'Variant!
    Dim c As Long
    Dim c2 As Long
    Dim w As Worksheet
    Set w = ActiveSheet
   Cells(1, 4) = Time()
    d = WorksheetFunction.Transpose(Range("a1:A1000"))
    For c = 1 To 1000 - 1
        For c2 = c + 1 To 1000
            d(c2) = d(c2) + d(c)
        Next c2
    Next c
    w.Range("a1:A1000") = WorksheetFunction.Transpose(d)
Cells(2, 4) = Time()
End Sub

     Code eingefügt mit Syntaxhighlighter 4.0

Anzeige
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 15:07:28
Alex
Vielen Dank- diese Worksheetfunction.transpose
kannte ich noch nicht. Programmiert sich doch schon viel besser.
Aber eine Möglichkeit, auf die Zellinnhalte genau so schnell
zuzugreifen, wie auf Arrays oder Datenfelder gib es wohl
nicht - oder?
Ich kapier nicht ganz, warum dass so viel langsamer ist.
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 15:16:50
schauan
Hallo Alex,
die Sheets und VBA sind eben zwei verschiedene Dinge, und da muss das eine immer erst in das andere gebracht werden. 'Ne CD im Wechsler ist auch schneller gewechselt als wenn Du sie erst aus dem Schrank holst und manuell einlegst - vielleicht nicht der intelligenteste Vergleich, aber so etwa ist es.
Anzeige
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 15:21:34
schauan
Hallo Alex,
die Sheets und VBA sind eben zwei verschiedene Dinge, und da muss das eine immer erst in das andere gebracht werden. 'Ne CD im Wechsler ist auch schneller gewechselt als wenn Du sie erst aus dem Schrank holst und manuell einlegst - vielleicht nicht der intelligenteste Vergleich, aber so etwa ist es.
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 15:31:54
Alex
Das ist klar -
an die Zellen sind Funktionen und Ereignisroutinen gebunden etc.
während Arrays und Datenfelder nur Speicherbereiche sind.
Es ist ja nur die Frage, ob man Excel nicht klarmachen kann, eben nur
den Wert einer Zelle zu verändern, ohne die ganzen abhängigen Routinen
auszuführen. Wie es ja mit der Application.ScreenUpdating=false Einstellung
möglich ist, die Bildschirmaktualisierung auszuschalten.
Na - mal sehen, ob da noch was zu machen ist.
Vielen Dank so weit.
Anzeige
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 15:42:53
Klaus-Dieter
Hallo Andre',
was ist da seltsam?
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 16:15:07
Alex
Aber das:

Sub Perf()
Dim d As Variant
Dim c As Long
Dim c2 As Long
Dim w As Worksheet
Set w = ActiveSheet
d = Range("a1:A1000").Value
For c = 1 To 1000 - 1
For c2 = c + 1 To 1000
d(c2) = d(c2) + d(c)
Next c2
Next c
w.Range("a1:A1000") = d
End Sub

klappt bei mir so nicht.
Da bekomme ich die Fehlermeldung
Index ausserhalb des gültigen Bereichs
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 16:22:51
schauan
Hallo Klaus-Dieter,
na denn mal viel Spaß beim weiterprogrammieren - ich hoffe, Deine Lösung kommt noch. Ich denke mit dem Transpose sieht es zum einen "ordentlich" aus - siehe auch die Überwachung - und ist einfacher zu programmieren.
Anzeige
AW: Performance in VBA - Zellbezüge & Datenfelder
23.10.2005 17:07:58
Klaus-Dieter
Hallo Andre',

arr(c2, 1) = arr(c2, 1) + arr(c, 1)
Auch wenn ich nur eine Spalte oder eine Zeile einlese, erhalte ich ein zweidimensionales Feld!

Viele Grüße Klaus-Dieter

Online-Excel

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige